Я считаю, что ваша проблема более сложна, чем базовые c правила о назначении новых свойств. Но первая половина этого ответа посвящена основным правилам.
И чтобы ответить, почему Vue имеет некоторые ограничения относительно правильного присвоения новых свойств реактивному объекту, это, вероятно, связано с производительностью и ограничениями язык. Теоретически, Vue может постоянно проходить через свои реактивные объекты в поисках новых свойств, но производительность, вероятно, будет ужасной.
Для чего бы это ни стоило, новый компилятор Vue 3 предположительно сможет справиться с этим легче. До этого документы, на которые вы ссылались, предоставляли правильное решение (см. Пример ниже) для большинства случаев.
var app = new Vue({
el: "#app",
data() {
return {
foo: {
person: {
firstName: "Evan"
}
}
};
},
methods: {
syncData() {
// Does not work
// this.foo.occupation = 'coder';
// Does work (foo is already reactive)
this.foo = {
person: {
firstName: "Evan"
},
occupation: 'Coder'
};
// Also works (better when you need to supply a
// bunch of new props but keep the old props too)
// this.foo = Object.assign({}, this.foo, {
// occupation: 'Coder',
// });
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
Hello {{foo.person.firstName}} {{foo.occupation}}!
<button @click="syncData">Load new data</button>
</div>
Обновление: ответ Дэна был хорошим - вероятно, лучше, чем мой, в большинстве случаев, поскольку он учитывает Vuex. Учитывая, что ваш код все еще не работает, когда вы используете его решение, я подозреваю, что p2pNode
иногда мутирует сам (Vuex ожидает, что все мутации в этом объекте будут go через официальный коммит). Учитывая, что у него, похоже, есть хуки жизненного цикла (например, libp2p.on('peer:connect'
), я бы не удивился, если бы это было так. В итоге вы можете рвать на себе волосы, пытаясь получить идеальную реактивность на узле, который тихо мутирует на заднем плане.
Если это так, и libp2p не предоставляет libp2p.on('update')
хука, через который вы могли бы информировать Vuex об изменениях, тогда вы можете захотеть реализовать своего рода базовое c игровое состояние l oop и просто скажите Vue пересчитывать все время от времени после короткого сна. См. { ссылка } и { ссылка }. Это немного хакерский (по крайней мере, информированный), но он может сделать вашу жизнь намного проще в краткосрочной перспективе, пока вы не разберетесь с этой колючей ошибкой, и мерцания быть не должно.