Я думаю, что вы неправильно понимаете предостережение о добавлении / удалении .Утверждение в первом разделе документов, на которые вы ссылаетесь, справедливо для вашего примера объекта.Если вы установите этот объект как свойство объекта, возвращаемого методом data
, все в этом объекте будет реактивным.
Вот простой пример, в котором я установил ваш объект как myNestedData
вdata
метод.Я связал myNestedData[0].b[0].c
через v-model
с элементом ввода, и вы можете видеть, что изменения этого значения отражаются в самом объекте myNestedData
.
Vue.config.productionTip = false;
Vue.config.devtools = false;
new Vue({
el: '#app',
data() {
return {
myNestedData: [{
"a": 1,
"b": [{
"c": 1
}]
}, {
"a": 10,
"b": [{
"c": 10
}]
}]
};
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<input v-model="myNestedData[0].b[0].c" type="number">
<br>
{{ myNestedData }}
</div>
Любой из примеров, которые вы привели в своем последнем разделе кода, был бы полностью реактивным, как в моем примере выше.Предупреждение о добавлении / удалении свойств вступает в действие только в том случае, если вы пытаетесь добавить или удалить свойства из этих реактивных объектов данных.
Вот простой пример, где свойство foo
изначально устанавливается в методе data
со значением [{ a: 'apple' }]
.Тогда this.foo[0].b
устанавливается на 'banana'
в хуке created
компонента.Но поскольку свойство b
this.foo[0]
ранее не существовало, это свойство не является реактивным.Вы можете увидеть это, изменив значение второго входа, который связан с помощью v-model
до foo[0].b
.Изменение этого значения не обновляет значение этого свойства в foo
.
Vue.config.productionTip = false;
Vue.config.devtools = false;
new Vue({
el: '#app',
data() {
return {
foo: [{ a: 'apple' }]
};
},
created() {
this.foo[0].b = 'banana';
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<input v-model="foo[0].a">
<input v-model="foo[0].b">
<br>
{{ foo }}
</div>