有时候新增、修改数据时往往使用弹出窗口+表单的形式展现。
<a-modal
:title="title" // 此处将标题设置为动态绑定属性,好处是可以根据不同情况展示"新增/修改xxx"
width="640"
:visible="visible" // 弹窗是否可见,默认是false,只有在点击新增或修改按钮时可见
:confirmLoading="confirmLoading" // 是否显示加载动画
@ok="handleSubmit" // 确定按钮处理函数
@cancel="handleCancel" // 取消按钮处理函数
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item
label="字典名称"
:labelCol="labelCol" // label宽度
:wrapperCol="wrapperCol" // wrapper控件宽度
>
// input组件
<a-input v-decorator="['dictName', {rules: [{required: true, message: '请输入字典名称!'}, {max: 100, message: '最大不能超过100个字符'}]}]" />
</a-form-item>
<a-form-item
label="字典代码"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
// input组件
<a-input v-decorator="['dictCode', {rules: [{required: true, message: '请输入字典代码!'}, {max: 30, message: '最大不能超过30个字符'}]}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
<script>
export default {
data () {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 7 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 13 }
},
visible: false, // 弹窗是否可见,默认是false
confirmLoading: false,
title: '新建字典', // 弹窗标题
form: this.$form.createForm(this) // 初始化表单,form不是一个普通对象,而是一个组件实例对象
}
},
methods: {
add () { // 新增方法
this.form.resetFields() // 新增记录时,需要把表单清空,否则控件会保留上次打开时的值
this.title = '新建字典'
this.visible = true
},
edit (record) { // 修改方法
const { form: { setFieldsValue } } = this // ES6解构赋值了解一下:http://es6.ruanyifeng.com/#docs/destructuring
const { dictCode, dictName } = record // 同上
this.title = '修改字典'
this.visible = true
this.$nextTick(() => {
setFieldsValue({ dictCode, dictName }) // 修改记录时,需要把对应的记录属性值初始化到表单控件,否则表单就是空表单
})
},
handleSubmit () {
const { form: { validateFields } } = this // 解构赋值,this是弹窗组件
this.confirmLoading = true // 显示加载动画
// 此处调用validateFields对表单控件进行前端校验,校验规则参见表单控件中的v-decorator属性
validateFields((errors, values) => { // errors是校验框架返回的结果对象,values是提交的表单对象
if (!errors) { // 校验通过
console.log('values', values)
setTimeout(() => {
this.visible = false
this.confirmLoading = false // 关闭加载动画
this.$emit('ok', values)
}, 1500)
} else { // 校验不通过
this.confirmLoading = false // 关闭加载动画
}
})
},
handleCancel () {
this.visible = false
}
}
}
</script>