1. Vue не может обнаружить добавление или удаление свойств объекта:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{obj.a}}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
obj: {},
},
mounted() {
this.obj.a = 1111
}
})
</script>
</body>
</html>
Результатом операции является то, что браузер ничего не отображает.
Потому что свойства obj динамически добавляются мной! !
В документации vue говорится:Тем не менее из-за ограничений JavaScript Vue не может обнаружить добавление или удаление свойств объекта:
Таким образом, для динамического добавления свойств объекта и обновления страницы вы можете использовать следующий метод:
this.$set(this.obj,'a',1) // 方法一
this.obj = Object.assign({}, this.obj,{a:1}) //方法二 可以添加多个属性
два,Обнаружение обновления массива
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p v-for="item in arr" :key="item.id">{{item}}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
arr: [],
},
mounted() {
this.arr.push(1)
}
})
</script>
</body>
</html>
Почему мы можем поместить его в массив и отобразить на странице? ? ? Я не думал об этом раньше! ! ! Я не знал этого, пока не набрал vm, не нажал Enter на панели консоли и не увидел следующее:
Методы мутации для набора наблюдаемых массивов, которые включает Vue! ! ! Не оригинальный метод толчка больше! ! !
Я пробую console.log(this.arr.push)
Что распечатывает:
function mutator() {
var args = [], len = arguments.length;
while (len--) args[len] = arguments[len];
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) {
ob.observeArray(inserted);
}
// notify change
ob.dep.notify();
return result
}
После того, как метод push обернут vueob.dep.notify() уведомит страницу обновления!
#Меры предосторожности
Из-за ограничений JavaScript Vue не может обнаружить следующие изменяющиеся массивы:
- Когда вы используете индекс для прямой установки элемента, например:
vm.items[indexOfItem] = newValue - Когда вы изменяете длину массива, например:
vm.items.length = newLength
Чтобы решить первый тип проблемы, можно достичь следующих двух способов:vm.items[indexOfItem] = newValueТот же эффект также вызовет обновление состояния:
|
|
Для решения второго типа задач можно использоватьsplice:
|