在MVVM框架里,直接修改嵌套对象属性视图为什么没反应?
我在用Vue做表单提交时遇到问题,当通过v-model绑定到嵌套对象的属性后,修改输入框内容时视图没变化。比如定义了formData: { user: { name: '' }},然后在模板里用v-model="formData.user.name"。虽然控制台显示data里的值变了,但页面输入框内容就是不动…
我试过用this.$set,但不确定该在哪个层级使用。如果写成this.$set(this.formData.user, 'name', 'test')会报错说’this.formData.user is not an object’,难道每次都要逐层设置吗?
this.$set确实可以解决,但要注意调用时机和对象层级。你遇到的错误'this.formData.user is not an object'说明当前this.formData.user可能还没被正确初始化。应该先确保该对象存在,例如:
this.formData.user = { name: '' }
或者用Vue.set的完整写法:
this.$set(this.formData, 'user', { name: '' })
然后再用this.$set(this.formData.user, 'name', 'test')修改属性。更推荐的做法是初始化时就用对象完整结构:
data() {
return {
formData: {
user: {
name: ''
}
}
}
}
这样所有属性都会被正确转换为响应式。如果实在需要动态添加,就按层级顺序一步步来。Vue响应式系统的限制决定了必须从父级开始保证对象可响应。
this.$set(this.formData, 'user', { name: 'test' })就行,或者初始化时确保所有层级都有值。我之前也遇到过这种情况,推荐你试试这个:
如果不想每次都用
$set,就在初始化数据时把结构写完整,别留空层。