我的根目录中有两个对象 - obj
和newObj
。我在deep: true
上观察我的obj
对象上的更改,并在更改时相应地更新newObj。Vue - 组件道具不能正确观察对象的变化
在我的vue调试器中,newObj
似乎按预期更新,但该组件不执行for循环计数。或者如果我尝试{{ newObj }}
,它只记录第一次更新。
我试图重新创建问题on this Fiddle。
我的html:
<div id="app">
<button @click="appendTo">Append</button>
<my-comp v-bind:new-obj="newObj"></my-comp>
</div>
和VUE:
new Vue({
el: '#app',
data: {
obj: {},
newObj: {}
},
methods: {
appendTo() {
if (typeof this.obj[1] === 'undefined') {
this.$set(this.obj, 1, {})
}
var randLetter = String.fromCharCode(Math.floor(Math.random() * (122 - 97)) + 97);
this.$set(this.obj[1], randLetter, [ [] ])
}
},
watch: {
obj: {
handler(obj) {
var oldKeys = Object.keys(obj)
var newKeys = Object.keys(this.newObj);
var removedIndex = newKeys.filter(x => oldKeys.indexOf(x) < 0);
for (var i = 0, len = removedIndex.length; i < len; i++) {
delete this.newObj[removedIndex[i]]
}
oldKeys.map((key) => {
if (this.newObj.hasOwnProperty(key)) {
var newInnerKeys = Object.keys(this.newObj[key]);
var oldInnerKeys = Object.keys(obj[key]);
var additions = oldInnerKeys.filter(x => newInnerKeys.indexOf(x) < 0);
for (var i = 0, len = additions.length; i < len; i++) {
// here
this.$set(this.newObj[key], additions[i], [ [] ]);
}
var deletions = newInnerKeys.filter(x => oldInnerKeys.indexOf(x) < 0);
for (var i = 0, len = deletions.length; i < len; i++) {
delete this.newObj[key][deletions[i]]
}
} else {
this.newObj[key] = {}
for (var innerKey in obj[key]) {
this.$set(this.newObj, key, {
[innerKey]: [ [] ]
});
}
}
console.log(obj);
console.log(this.newObj)
});
},
deep: true
}
}
})
Vue.component('my-comp', {
props: ['newObj'],
template: `
<div>
<div v-for="item in newObj">
test
</div>
</div>
`
})
可以尝试更新照片直接'this.newObj'而不是内部'this.newObj'键。您可以在最后使用'this.newObj = JSON.parse(JSON.stringify(this.newObject))'作弊。 'deep:true'申请obj不适用于newObj,所以如果参考未更新,UI不会更新 – Epitouille
但是,如何才能够附加到现有密钥值?难道它只是覆盖现有的价值,并只保留这个项目?我会很感激任何指导 – senty
你可以附加到现有的键值,但你需要告诉vuejs你的对象已经改变,它应该重新渲染。 Vuejs默认情况下,只监视newObj的引用,这意味着如果你改变这个对象:this.newObj = otherObject,它会起作用。我不确定这是你的问题,这就是为什么你应该测试我的建议。或者使用Object.assign或其他东西来更改引用,并查看UI是否更新。 – Epitouille