предисловие
Хак, который запускает обновление представления, что это за хак? Взламывайте обновления, которые изменяют данные, но не обнаруживаются vue! Итак, в каких ситуациях vue не может обнаружить изменения в данных? Существует два типа официальных описаний:
- множество
- Обновлять элементы массива с помощью индексов;
- Используйте присваивание, чтобы изменить длину массива;
- Используйте индексы для добавления или удаления элементов массива;
- объект
- Добавление и удаление объектов
- разное
- такие как реквизиты исходных свойств дочерних компонентов ... Подробности смотрите в другой статье:[Портал: Vue: не удается обнаружить случай обновления объекта/массива]
текст
Итак, как взломать? !
Принцип тоже очень прост~
Поскольку vue не может обнаружить изменения в данных, он заставит vue обновиться! Но vue не предоставляет такого интерфейса (я имею в виду унифицированный интерфейс, а не официальное решение), если он предоставляется, это не называется хаком, верно!
Это примерно так: для каждого изменения данных, которое Vue может обнаружить, Vue будет повторно отображать изменения во всем представлении.В целом, обратите внимание на целое, не говоря уже о том, что данные объекта или списка в данных изменяются, просто обновите его.Соответствующая область просмотра, не такая, это целое, ок! Так что воспользуйтесь этим!
Конкретный подход:После изменения данных, которые vue не может обнаружить, измените данные, которые может обнаружить vue, например, обновите случайное число.
упражняться
<div id="app" v-cloak :data-counter="counter">
<dl>
<span v-for="(item, index) in arrs">{{ index === 0 ? '' : ', ' }}{{ item }}</span>
</dl>
<dl v-for="(item, key) in items">{{key}}: {{item}}</dl>
<button @click="operate('add')">add</button>
<button @click="operate('delete')">delete</button>
<button @click="operate('update')">update</button>
<button @click="operate('updateArrs')">update arrs</button>
</div>
new Vue({
el: '#app',
data: {
useCounter: true,
counter: 0,
arrs: [0, 1, 2, 3, 4],
items: {
name: 'isaac',
position: 'coder'
}
},
watch: {
items: {
deep: true,
handler(val, oldVal) {
console.log({ val, oldVal });
}
}
},
methods: {
env(callback) {
callback && callback();
this.useCounter && this.counter++;
},
operate(order) {
if(order === 'add') {
this.env(() => {
this.items.goodAt = 'javascript';
});
} else if(order === 'delete') {
this.env(() => {
delete this.items.goodAt;
});
} else if(order === 'update'){
this.items.name = Math.random();
} else if(order === 'updateArrs') {
this.env(() => {
this.arrs[0] = Math.round(Math.random() * 100);
});
}
}
}
});
Как упоминалось в предисловии, один из них будет обновлен позже.data.counter
,а такжеdata.counter
Его можно обнаружить, чтобы обнаружить!
недостаток
Хотя этот хак запускает обновление представления, у него есть недостаток:
- Соответствующие часы в том, что никакие изменения данных не могут быть обнаружены!
Так что лучше использовать официальное решение!
Последнее слово
Вышеупомянутый хак - это то, что я нашел на практике, так и должно быть, когда речь идет об отладке! Поскольку я сам его чистил, я знаю, что обновление представления не может быть запущено в случае с массивами и объектами, но представление волшебным образом обновляется один раз! Затем начинайте медленно тестировать~