предисловие
Когда мы передаем данные в свойство данных экземпляра Vue для завершения обновления представления, после некоторых операций обнаруживается, что оно не обновляется.
consoleДанные обнаружения печати — это просто данные объекта JavaScript.
Причина в том, что Vue хочет завершить ответ представления, должен преобразовать обычные данные объекта JavaScript, чтобы иметьgetter/setterданные объекта атрибута. при звонкеsetterПри вызове Vue захватывает данные для завершения обновления адаптивного компонента.Vue.js — глубокое погружение в реактивные принципы
обнаруживать изменения
Способы, которыми разрешено создавать ответы представления, следующие:
- Добавить начальное значение свойства в качестве узла ответа в данные экземпляра Vue
- Динамически добавлять узлы ответа с помощью метода $set
пример
Сначала мы подготавливаем два набора данных,jsDataа такжеvueData.
const jsData = {
ja: "张三",
jb: "李四"
}
export default {
data() {
return {
vueData: {
va: "张三",
vb: "李四"
}
}
},
mounted() {
console.log(jsData, this.vueData);
},
// ...
}
Видно, что операцияjsDataНе создан в экземпляре vue, не имеетgetter/setter,vueDataСоздайте начальное значение атрибута через атрибут данных в экземпляре vue, чтобы иметьgetter/setter.
Обновление запрещено
Ниже приведены примеры представлений, которые не могут обнаружить изменения:
export default {
// ...
mounted() {
console.log(jsData, this.vueData);
this.notAllow()
},
methods: {
notAllow() {
// demo 1
this.vueData.newKeyA = "keyA";
console.log(this.vueData);
// demo 2
// Object.assign(this.vueData, { newKeyA: "keyA" });
// console.log(this.vueData);
// demo 3
// this.vueData = Object.assign(this.vueData, { newKeyA: "keyA" });
// console.log(this.vueData);
}
}
}
В приведенном выше коде есть проблема, в том жетип ссылкиВставка данных в объект данных приводит к тому, что сам объект данных не изменяется, а это означает, что Vue не может проверить память данных, указывающую на внесение изменений, что приведет к вставке только без изменений.getter/setterхарактеристики.
результат операции:
разрешить обновления
export default {
mounted() {
console.log(jsData, this.vueData);
this.allow()
},
methods: {
allow() {
// demo 1
this.vueData = {
...this.vueData,
newKeyA: "keyA"
}
console.log(this.vueData);
// demo 2
// this.$set(this.vueData, "newKeyA", "keyA");
// console.log(this.vueData);
}
}
}
Способ приведенного выше demo1 заключается в замене указателя памяти для завершения изменения данных.
demo2 — это метод $set, предоставляемый экземпляром Vue, без изменения внутреннего указателя, добавляяgetter/setterсвойства добавлены.
результат операции:
пример
В этой статье представлена демонстрация, см.:GitHub
*Заявление об авторских правах: эта статья является оригинальной и не может быть воспроизведена без разрешения.