我的根目錄中有兩個對象 - 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