vue3 antd项目实战——Form表单的提交与校验【v-model双向绑定input输入框、form表单数据,动态校验规则】

news2025/1/26 15:48:48

vue3 ant design vue项目实战——Form表单【v-model双向绑定数据实现form表单数据的提交】

  • 上期文章回顾【UI界面渲染】
  • 场景复现(源代码附在文章最后
  • 实现需求
    • 1.表单数据及其类型的定义
    • 2.表单及各部分数据的双向绑定
    • 3.表单提交功能
    • 4.校验输入内容不为空
    • 5.不能反复提交逻辑
  • 源代码

本文依旧沿用ant design vue组件库和ts语言🔥🔥更多内容见Ant Design Vue官方文档

上期文章回顾【UI界面渲染】

🔥🔥 vue3 antd项目实战——Form表单【后台管理系统 v-model数据的双向绑定,input输入框、Radio单选框的嵌套使用】

场景复现(源代码附在文章最后

在上期文章中,我们完成了UI界面的渲染(渲染效果如下图),本期文章将带着大家实现form表单的一些逻辑功能,主要是表单数据的动态绑定、确认按钮的提交功能校验功能

功能需求

  • 1.表单的值需要动态绑定
  • 2.点击确认按钮,控制台能够正确打印表单提交的值(提交数据后不允许再次基础上再次提交,即使修改了也无法点击确认按钮进行提交
  • 4.点击取消按钮,表单内容能够重置
  • 5.点击确认按钮时,检查表单输入是否有为空的部分,给出相应提示

在这里插入图片描述

实现需求

这里我们分三个部分来完成,首先是对表单数据及其数据类型的定义,然后完成表单各个部分数据的双向绑定,最后完成表单的提交功能要求能在控制台打印正确的表单数据)。


1.表单数据及其类型的定义

建议将所有的类型说明按功能放在根目录下的一个文件夹中,方便今后按功能查看,优化文件结构。
在这里插入图片描述
我这里是新建了utils文件用于存放工具类的文件,里面新建types文件夹,专门存放数据类型的文件
表单数据类型代码如下:(使用时一定记得import导入该类型

// 导出表单数据类型
export interface Formstate {
    certificates_content:string,
    certificates_select:string,
    confirm:number | boolean
}

在vue页面script中写入表单数据的初始值

// 修改荣誉档案的内容
let contentFormState = ref<Formstate>({
    certificates_content:'',
    certificates_select:'2022年技术部年度证书',
    confirm:1 // 确认按钮的属性
})

完成数据的定义后,接下来是表单总的数据绑定,以及各部分内容数据的双向绑定

2.表单及各部分数据的双向绑定

上期文章中,表单中的form-item分为三部分,分别是input输入框文本域、radiogroup单选组合、button按钮组合。显然,我们需要对整个表单进行一个总的数据绑定,再对input和radiogroup进行单独的变量绑定。(绑定内容在代码中的位置如下图)
1.绑定整个表单对应的数据
在这里插入图片描述

<a-form
   class="form"
   name="basic"
   :model="contentFormState"
   autocomplete="off"
   >

2.绑定input输入框文本域的数据
在这里插入图片描述

<a-textarea
   v-model:value="contentFormState.certificates_content"
   style="width:400px;margin-left:50px"
   placeholder="请输入证书内容" 
   show-count 
   allow-clear
   :maxlength="100" 
   />

3.绑定radio单选组合的数据
在这里插入图片描述

<a-radio-group 
   v-model:value="contentFormState.certificates_select" 
   name="certificatesRadioGroup"
   style="margin-top:5px"
   >
   <a-radio
      :style="radioStyle"
      v-for="item of certificatesOptionsValue" 
      v-model:value="item.options" 
      :key="item.id"
      >{{ item.options }}
   </a-radio>
</a-radio-group>

到现在我们已经完成了数据的双向绑定,是不是很简单!!主要是变量的定义和数据类型定义,v-model的使用。

3.表单提交功能

表单的提交功能应该包含在确认按钮点击的逻辑内,点击确认按钮,能在控制台打印正确的数据
在这里插入图片描述
在这里我们对按钮绑定一个点击事件,调用确认功能的函数。

const confirmContent = () => {
    console.log(contentFormState.value) // 在控制台打印表单的数据
    message.success("内容保存成功",5) // 文字弹窗提示
}

实现效果
在这里插入图片描述
此时我们可以在控制台查看表单的数据,和我们输入选择的数据一致,说明双向绑定成功、表单数据提交成功!!
在这里插入图片描述

4.校验输入内容不为空

上述的提交逻辑显然是可以优化的,比如添加校验功能在点击确认按钮时检查表单数据是否有为空的情况,并给出相应的弹窗提示

// 确认荣誉内容
const confirmContent = () => {
    if (contentFormState.value.certificates_content == '') {
        message.warning("请检查输入!!!")
    } else {
        console.log(contentFormState.value)
        message.success("内容保存成功,如需重新操作,点击取消即可",5)
        contentFormState.value.confirm = !contentFormState.value.confirm
    }
}

实现效果
在这里插入图片描述

5.不能反复提交逻辑

解释以下这个逻辑

我们在提交这条数据后,一般是可以再次点击确认再次提交的,但此时就会出现两条一样的数据,那查重筛选的功能又需要执行,所以最好是写一个逻辑限制操作。

于是就有了这条逻辑

当用户输入完数据点击提交后,设置提交按钮不可用,如果需要再次提交则点击取消即可刷新页面,进行重新编辑和提交功能。

之前我们在定义数据时新增了confirm,用于控制button的可控状态,如果是1,那么对应可控,如果是0,则不可控

首先,在button标签内添加内容
在这里插入图片描述

const confirmContent = () => {
    console.log(contentFormState.value) // 在控制台打印表单的数据
    message.success("内容保存成功,如需重新操作,点击取消即可",5) // 文字弹窗提示
    contentFormState.value.confirm = !contentFormState.value.confirm // 取反操作 让按钮不可控(无法点击)
}

下面实现,点击取消按钮刷新页面,恢复到初始状态

<a-button @click="cancelContent()">取消</a-button>

给取消按钮绑定一个点击事件,调用取消功能的函数

const cancelContent = () => {
    router.push("/files/updateHonoraryFiles") // 路径为表单所在页面的路由路径
    message.success("取消成功!!!可新建输入")
}

具体呈现效果
在这里插入图片描述

源代码

html部分

<a-form
    class="form"
    name="basic"
    :model="contentFormState"
    autocomplete="off"
    >
    <p style="font-size:16px;margin-top:24px;">
        <b>给 小朱 添加一条荣誉</b>
    </p>
    <a-form-item
        name="promotionContent"
        >
        <p>证书内容</p>
        <a-textarea
            v-model:value="contentFormState.certificates_content"
            style="width:400px;margin-left:50px"
            placeholder="请输入证书内容" 
            show-count 
            allow-clear
            :maxlength="100" 
            />
    </a-form-item>
    <a-form-item>
        <p style="margin-top:-10px">选择 <b>小朱</b> 需要绑定的证书</p>
        <a-radio-group 
            v-model:value="contentFormState.certificates_select" 
            name="certificatesRadioGroup"
            style="margin-top:5px"
            >
            <a-radio
                :style="radioStyle"
                v-for="item of certificatesOptionsValue" 
                v-model:value="item.options" 
                :key="item.id"
                >{{ item.options }}
            </a-radio>
        </a-radio-group>
    </a-form-item>
    <a-form-item class="button-box">
        <a-button @click="cancelContent()">取消</a-button>
        <a-button 
            type="primary" 
            style="margin-left:10px"
            @click="confirmContent()"
            :disabled="contentFormState.confirm == 0 ? true : false"
            >确定</a-button>
    </a-form-item>
</a-form>

script部分

import { ref, reactive, toRaw } from "vue"
import { Router, useRouter } from "vue-router";
import { message } from "ant-design-vue";
import { 
    optionsType,
    Formstate,
    radioStyleType
} from "../../../../../utils/types/filesTableType/index"
// 按路径导入相关数据类型即可

const router : Router = useRouter();

// 修改荣誉档案的内容
let contentFormState = ref<Formstate>({
    certificates_content:'',
    certificates_select:'2022年技术部年度证书',
    confirm:1
})
// 证书选择框选择项
const certificatesOptionsValue = ref<optionsType[]>([
    {"id":1,"options":"2022年技术部年度证书"},
    {"id":2,"options":"2023年技术部年度证书"},
    {"id":3,"options":"2024年技术部年度证书"},
])
const handleChange = (value: string) => {
    // console.log(`selected ${value}`);
};
// 单选框样式
const radioStyle = reactive<radioStyleType>({
    display: 'flex',
    height: '30px',
    lineHeight: '30px',
    marginLeft:'50px',
});
// 取消荣誉内容
const cancelContent = () => {
    router.push("/files/updateHonoraryFiles")
    message.success("取消成功!!!可新建输入")
}

// 确认荣誉内容
const confirmContent = () => {
    if (contentFormState.value.certificates_content == '') {
        message.warning("请检查输入!!!")
    } else {
        console.log(contentFormState.value)
        message.success("内容保存成功,如需重新操作,点击取消即可",5)
        contentFormState.value.confirm = !contentFormState.value.confirm
        // 将数据保存至总内容中
    }
}

css部分

.form {
    margin:0 auto;
    width: 500px;
    height: 450px;
    margin-top: 15px;
    background-color: #FFFFFF;
    border: 1px solid rgba(172, 171, 171, 0.16);
    border-radius: 10px;
    position: relative;
    input {
        width: 400px;
        margin-left: 50px;
    }
    p {
        margin-left: 50px;
        margin-top: 20px;
        font-size: 15px;
        margin-bottom: 10px;
        font-family: "微软雅黑";
    }
    .button-box {
        position: absolute;
        bottom: -5px;
        left: 170px;
    }
}

下期文章将介绍两种方案来实现form表单的重置功能~
感兴趣的小伙伴可以订阅本专栏,方便后续了解学习~
觉得这篇文章有用的小伙伴们可以点赞➕收藏➕关注哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-数据绑定

目录 1 数据绑定 2 绑定方式 2.1 单向绑定 2.2 双向绑定 1 数据绑定 Vue中有两种数据绑定方式&#xff1a; 1 单向绑定(v-bind)&#xff1a;数据只能从data流向页面。 2 双向绑定&#xff08;v-modle&#xff09;&#xff1a;数据不仅能从data流向页面&#xff0c;还能从页…

VSCode开发:使用nvm切换node版本

为什么要切换node版本&#xff0c;是因为npm run dev(vant app&#xff09;时&#xff0c;报了Error [ERR_REQUIRE_ESM]&#xff1a;Must use import to load ES Module这样的错。我使用的node版本是12.16.3&#xff0c;切换到16.15.1就没有这个问题了。 1. 安装nvm前记得要删…

【node进阶】深度解析express框架---编写接口|解决跨域问题

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

Vuex 学习

什么是vuex&#xff1a; 专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 原理…

clone下来的vue项目出现“An unknown git error occurred”,vue全局挂载axios及配置全局请求和响应拦截,uni-app的全局请求和响应拦截,对请求方法的封装

文章目录前言一、如何解决clone下来的vue项目出现“An unknown git error occurred”&#xff1f;二、vue全局挂载axios并设置全局的请求和响应拦截1.先下载安装好axios&#xff0c;这个就不用多说了2&#xff0c;vue2中的全局挂载:3,在vue3中我们又应该怎么全局挂载axios呢&am…

vue中使用百度地图

vue中使用百度地图 之前写过一篇vue调用百度地图的文章&#xff0c;但是写得不是很清晰&#xff0c;所以重新整理一篇&#xff1b;申请百度地图ak 这个我在之前的那篇文章已经讲过&#xff0c;就不再细说&#xff0c;链接如下&#xff1a;vue调用百度地图 初始化地图 引入地图…

同一页面实现recycleView三种布局【recycleView + adapter】

文章目录&#x1f96d;&#x1f96d;简介&#x1f96d;&#x1f96d;效果图&#x1f96d;&#x1f96d;代码&#x1f34e;&#x1f34e;三个Adapter修饰器&#x1f34e;&#x1f34e;主界面函数 && FuritBean&#x1f34e;&#x1f34e;布局文件&#x1f96d;&#x1f…

js获取dom元素宽高

一&#xff0c;前言 1.对于css盒子模型&#xff0c;我们使用width和height等来定义dom元素的宽高&#xff0c;而有时我们需要在js中获取元素的宽高进行一些操作。 2.dom操作提供了相应的属性来实现这一点 二&#xff0c;clientWidth和clientHeight 1.clientWidth和clientHe…

js监听页面或元素scroll事件,滚动到底部或顶部

基本原理&#xff1a; 1、滚动到底部 元素的滚动距离 元素的可视距离 元素的滚动条总距离2、滚动到顶部 元素的滚动距离 0监听页面滚动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv&…

Flask:使用SocketIO实现WebSocket与前端Vue进行实时推送(gevent-websocket、flask-socketio、flask不出现running on 127..问题)

前言 本文旨在记录使用Flask框架过程中与前端Vue对接过程中&#xff0c;存在WebSocket总是连接失败导致前端取不到数据的问题。以及在使用WebSocket相关功能的库包gevent-websocket之后&#xff0c;导致运行Flask项目之后&#xff0c;控制台没有显示running on 127.0.0.1:5000…

Vue复刻华为官网(三)

文章目录1 底部列表1.1 思路1.2 代码1.3 效果图1.3.1 搜索框1.3.2 商标2 公司信息2.1 思路2.2 代码2.3 效果图3 上升按钮3.1 思路3.2 代码3.3 效果图4 图标完善4.1 思路4.2 安利图标库1 底部列表 1.1 思路 如上图&#xff0c;这整个的大盒子&#xff0c;又可以被分为上中下三个…

[JavaScript你真的以为这么简单吗]JavaScript高级

✅作者简介&#xff1a;大家好,我是Philosophy7&#xff1f;让我们一起共同进步吧&#xff01;&#x1f3c6; &#x1f4c3;个人主页&#xff1a;Philosophy7的csdn博客 &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大…

three.js中坐标系转换以及camera的position、lookAt与up属性理解

为了更好的理解camera的position、lookAt与up属性&#xff0c;文章最开始我们先来阐述three.js的坐标系转换的概念。 1.监听event的事件获得屏幕坐标 文章的最开始首先讨论在哪里进行点击事件的监听的问题&#xff0c;当鼠标触发点击事件时&#xff0c;event会输出点击位置相对…

使用JS监听键盘按下事件

事件说明 我们将键盘按下后事件的所有属性和方法打印出来&#xff08;这里以按下1为例&#xff09; document.onkeydown function(event){console.log(event);} 这里面有几个需要注意的属性 key:按下按键的名称 keyCode:按下按键的键码 altKey、ctrlKey、shiftKey&#xf…

Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(项目演示、涉及知识点、源码分享)

基于 Vue3.x Vant UI 的多功能记账本&#xff08;一&#xff09; 文章目录基于 Vue3.x Vant UI 的多功能记账本&#xff08;一&#xff09;Vue3.x 实现多功能记账本1、前言2、项目演示3、涉及知识点4、写到最后&#xff08;附源码&#xff09;Vue3.x 实现多功能记账本 1、前…

文件在线浏览之微软office在线预览及隐藏的坑和其他更优解决办法

一 微软也已经免费提供在线版本office预览啦 https://view.officeapps.live.com/op/view.aspx?srcURLsrc后面的URL是网上能访问到的文件地址&#xff0c;比如http://abc.com/file/demo.xlsx 直接访问&#xff1a;https://view.officeapps.live.com/op/view.aspx?srchttp:/…

js模板字符串

js模板字符串模板字符串&#xff08;模板字面量&#xff09;在模板字符串中插入变量在模板字符串中插入表达式模板字符串中可以换行模板字符串中可以调用函数模板字符串支持嵌套使用模板字符串&#xff08;模板字面量&#xff09; ES6 中引入了模板字符串&#xff0c;让我们省…

Vue3 + vite 创建项目

项目创建 vite的介绍 首先要想使用vite来创建一个vue项目&#xff0c;要把vue脚手架升级成为5.0.1版本&#xff0c;但是有一个很大的缺陷&#xff0c;就是升级过后不会再向下兼容vue2的语法创建项目的方式 脚手架升级为5.0.1版本&#xff1a;cnpm install vuenext 或 yarn gl…

Redux最新实践指南之Redux-Toolkit

前言 redux-toolkit是目前redux官方推荐的编写redux逻辑的方法&#xff0c;针对redux的创建store繁琐、样板代码太多、依赖外部库等问题进行了优化&#xff0c;官方总结了四个特点是简易的/有想法的/强劲的/高效的&#xff0c;总结来看&#xff0c;就是更加的方便简单了。 从官…

vue-treeselect 的基本使用

官网地址&#xff1a;Vue-Treeselecthttps://vue-treeselect.js.org/公司用 若依 搞了一个速成项目&#xff0c;若依是一个免费开源的前后端项目&#xff0c;感兴趣的朋友百度。 在里边接触到了一个神奇的东西 &#xff1a;vue-treeselect&#xff0c;用起来真的是一言难尽&am…