假设父组件数据对象 parentData 的结构为:
{
a: xxx,
b: yyy,
(后续会添加其他属性)
}
现在需要写一个可以编辑 parentData 的 component ,能像这样使用:
<EditorComponent v-model:parent-data="parentData"/>
在 EditorComponent 里,有两个 input 可以修改 a 、b 这两个属性。由于子组件不能直接修改父组件的数据,emit update 又只能对 parentData 做整块的赋值,所以目前的思路如下
先在 EditorComponent 内部复制一份 dataCopy:
data: {
dataCopy = null
},
watch: {
parentData: {
deep: true,
handler: function (val) {
this.dataCopy = val
}
}
}
然后有两种处理方式:
1.
两个 input 绑定 dataCopy 的数据:
<input v-model="dataCopy.a"/>
<input v-model="dataCopy.b"/>
这样的话,如果要更新 parentData ,得在 dataCopy 上加一个 watcher ,然后
this.$emit('update:parentData', val)
但这似乎是不可取的,会造成来回无限更新
2.
把 input 的 v-model 拆开,加两个方法 updateA 、updateB:
<input :value="dataCopy.a" @input="updateA"/>
<input :value="dataCopy.b" @input="updateB"/>
然后在每个 update 里把 event 的值先赋给 dataCopy ,再
this.$emit('update:parentData', this.dataCopy)
这样属性一多就很麻烦很臃肿了
所以实现这样一个 EditorComponent 的规范思路应该是怎样的?(只看了基础教学就上手做了,不知道是否漏掉了什么重要概念……)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.