一个页面中有很多表单,我将各表单拆分为若干组件
<form1component ref="form1component" :data="formData"></form1component>
<form2component ref="form2component" :data="formData"></form2component>
<form3component ref="form3component" :data="formData"></form3component>
父组件将初始数据formData传入,我需要拿到各个子组件填写的form表单数据,并对它们进行校验,再在父组件提交,this.$refs 取数据是好的方法吗?
感觉这样写不太优雅
save () {
const form1Data = this.$refs.form1component.form1Data
const form2Data = this.$refs.form2component.form2Data
const form3Data = this.$refs.form3component.form3Data
const form1 = this.$refs.form1component.$refs.form1
const form2 = this.$refs.form2component.$refs.form2
const form3 = this.$refs.form3component.$refs.form3
var ok1 = form1.validate()
var ok2 = form2.validate()
var ok3 = form3.validate()
if(ok1 && ok2 && ok3)
http.post(...form1Data,...form2Data,...form3Data)
}
使用
this.$refs
的一大好处是快!赶工首选方案。当然了,确实不优雅。
这里的话可以遵从vue教程提供的 官方建议
子组件 : 各个formComponents
this.$emit( 'update:key' , v );
父组件通过 Vue 2.3+ 中重新支持的 .sync 写法来完成数据的父子同步
<form1component :text.sync="text1"></form1component>
对于以下写法,实际上 props 的传递只做了浅拷贝,因此
formData
如果是嵌套对象的话,formData.a.b
的修改会直接同步到父Vue,但是Vue的默认更新体系并不知道这点,也不会引起相应的响应式属性的变更,很容易踩坑,所以在子组件中使用事件体系来精确控制更新时机,使用.sync在写法上让父组件依然保持数据驱动的模式。