- 问题:在created初始化数据,动态生成对象数组,在html中展示该数组的长度{{ 数组.length }},只显示初始长度为1 ,在页面操作添加数组时,长度未变化。
// 正确写法
this.$set(this.tableData,`rowFormData${i+1}`, [{
name: `请求${i+1}`,
attribute: 'ZHAFXQXTBTS',
type: 'String',
length: '4',
protocolId:'dfsdf',
must: 'R',
}])
// 错误写法
this.tableData[`responseRowFormData${i+1}`] = [
{
name: `响应${i+1}`,
attribute: 'ZHAFXQXTBTS',
type: 'String',
length: '4',
protocolId:'dfsdf',
must: 'R',
}
]
原因:由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。尽管如此我们还是有一些办法来回避这些限制并保证它们的响应性。
Vue官方文档解释(cn.vuejs.org/v2/guide/re…)
Vue 无法检测 property 的添加或移除。由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的。例如:
var vm = new Vue({
data:{
a:1
}
})
// `vm.a` 是响应式的
vm.b = 2
// `vm.b` 是非响应式的
对于已经创建的实例,Vue 不允许动态添加根级别的响应式 property。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property。例如,对于:
Vue.set(vm.someObject, 'b', 2)
您还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名:
this.$set(this.someObject,'b',2)