Open uniquejava opened 4 years ago
期望在form中的data通过validation后才同步到其他组件进行展示。
不是 form = data (多个form共享) + rule? 或 form = clonedData + rule?
而是 form = initialData + rule, data = form.getFieldsValue()
this.form = this.$form.createForm(this)
<a-form :form="form"> <a-form-item> <a-select v-decorator=["fieldName", {initialValue:0, rules: [{required:true, message: "hi"}]}]
(注意a-form-item不能少)form表单之获取表单的数据
原文链接:https://blog.csdn.net/weixin_44051815/java/article/details/88305722
创建表单
通过ant-design-vue
去获取表单的数据是使用v-decorator
的方式去给每个项去注册,这样才能通过组件去拉取表单的数据,同时对必填项做校验;
<template>
<a-form @submit="handleOk" :form="form">
// :form="form" 必须优先注册
<!-- 客户姓名 -->
<a-form-item
:labelCol="labelCol" // 排列样式
:wrapperCol="wrapperCol"
label='客户姓名:'
>
<a-input
v-decorator="[
'name', // 给表单赋值或拉取表单时,该input对应的key
{rules: [{ required: true, message: '请输入客户名称!' }]}
]"
placeholder="请输入客户名称"/>
</a-form-item>
</a-form>
</template>
export default {
data() {
return {
form: this.$form.createForm(this), // 只有这样注册后,才能通过表单拉取数据
}
}
}
拉取表单数据的方法
通过validateFields
的方法,能够校验必填项是否有值,若无,则页面会给出警告!
this.form.validateFields((err, values) => {
if (err) {
// 这里做逻辑处理
console.log(values) // { name: '' }
}
}
清空表单的方法
执行this.form.resetFields()
,则会将表单清空。
给表单赋值
值得一提的是,setFieldsValue
只有通过这种方式给表单赋值,拉取表单的时候才能拉取到值,其他设置默认值的方式,拉取表单时都无法获取到默认值。
this.form.setFieldsValue({
name: '设置值'
})
给表单中添加自定义校验 现在给表单添加自定义校验的方式,是从你开始输入时就在校验,讨厌的警告一直存在,直到你输入完整才会消失,个人觉得这种方式不太友好!
<a-form-item
v-bind="formItemLayout"
label="E-mail"
>
<a-input
v-decorator="[
'email',
{
rules: [{
type: 'email', message: 'The input is not valid E-mail!',
}, {
required: true, message: 'Please input your E-mail!',
}]
}
]"
/>
</a-form-item>
推荐使用下面的方式做自定义校验,当输入框失去焦点后再去校验是否正确 这种方法的思路是, 当输入框失去焦点时,校验是否为空同时是否匹配正则 给该单个输入框设置错误信息,并在页面给出警告。
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label='手机:'
>
<a-input
type="number"
v-decorator="[
'phone',
{
rules: [
{ required: false, message: '请输入手机号码!' },]
},
]"
@blur="validatePhoneBlur"
placeholder='请输入手机号码' />
</a-form-item>
// 校验事件
validatePhoneBlur(e) {
const validatePhoneReg = /^1\d{10}$/
if (e.target.value && !validatePhoneReg.test(e.target.value)) {
const arr = [{
message: '您输入的手机格式不正确!',
field: 'phone',
}]
this.form.setFields({ phone: { value: e.target.value, errors: arr } })
}
},
import moment from "moment";
import "moment/locale/ja"; // without this line it didn't work
moment.locale("ja");
<a-time-picker
style="margin-left: 10px;"
v-decorator="[
'startTime',
{ initialValue: moment('08:00', 'HH:mm') },
]"
format="HH:mm"
/>
<script>
import moment from "moment";
export default {
methods: {
moment,
由于用ant design日期组件取得的值是moment类型,而往数据库中保存需要的是字符串类型 this.getFieldsValue()。取到的对应time字段。要从moment类型转成string。。
fieldXyz = fieldXyz.format("HH:mm:ss")
全量导入
组件数轻松上20, 我已经没有耐心使用按需导入了。
暴力
import Antd from "ant-design-vue"
提示Antd找不到~, 解决办法: 把babel.config.js中的下面这段删除,然后~~
table 中的boolean字段不能显示值
弄个customRender.
checkbox 设置初值 要 指定 valuePropName 为 checked
You cannot set a form field before rendering a field associated with the value.
出现这个错误的原因:
<a-form-item>
标签!this.form.setFieldsValue({ fieldName1: 0, fieldName2: [1, 2] });