ルートに2つのオブジェクトがあります。obj
とnewObj
です。私はdeep: true
と私のobj
オブジェクトの変更を見て、それに応じて私はそれに応じてnewObjを更新します。ビューコンポーネントがオブジェクトの変更を正しく見ていない
私の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>
`
})
あなたはdireclty 'this.newObj'とthis.newObj''内側のないキーを更新しようとすることができます。最後に、 'this.newObj = JSON.parse(JSON.stringify(this.newObject))'で不正行為をすることができます。 'deep:true'はnewObjのobjには適用されませんので、参照が更新されていなければUIは更新されません – Epitouille
しかし、既存のキー値にどのように追加することができますか?既存の値を上書きして、このアイテムだけを保持するのではないでしょうか?私はどんな指導にも感謝します – senty
既存のキー値に追加することはできますが、オブジェクトが変更されたことをvuejsに伝える必要があります。 VuejsはデフォルトでnewObjの参照のみを監視します。このオブジェクトを変更すると、this.newObj = otherObjectのようになります。私はこれがあなたの問題であるかどうかわからないので、これが私の提案をテストすべき理由です。あるいは、Object.assignや他のものを使って参照を変更し、UIが更新されているかどうか確認してください。 – Epitouille