Некоторое время я использовал Vue, и мой опыт всегда заключался в том, что метод будет пересчитываться, если обновляются базовые реактивные данные. Я столкнулся с противоречивой информацией о SO:
- Я пытался ответить на этот вопрос , и мне неоднократно говорили, что это не так.
- Принятый ответ здесь означает, что «[метод] будет оцениваться только при явном вызове».
Я просмотрел документы и не увидел ничего невероятно ясного.
Если они не реагируют, то почему этот пример работает?
<ul>
<li v-for="animal in animals" :key="animal.id">
<span v-if="isAwesome(animal)">{{ animal.name }}</span>
</li>
</ul>
export default {
data() {
return {
awesomeAnimalIds: [],
animals: [
{ id: 1, name: 'dog' },
{ id: 5, name: 'cat' },
{ id: 9, name: 'fish' },
],
};
},
created() {
setTimeout(() => {
this.awesomeAnimalIds.push(5);
}, 1000);
setTimeout(() => {
this.awesomeAnimalIds.push(9);
}, 2000);
},
methods: {
isAwesome(animal) {
return this.awesomeAnimalIds.includes(animal.id);
},
},
};
Я действительно хотел бы получить окончательный и удовлетворительный ответ, на который может сослаться это сообщество.
Ответы:
Основываясь на том, как отслеживаются изменения из документов, вот что происходит:
Для экземпляра компонента создается специальный наблюдатель, чтобы определить, когда требуется повторная визуализация.
Vue преобразует все свойства
data
в геттеры и сеттеры.isAwesome
из шаблона.isAwesome
вызывателя дляawesomeAnimalIds
вызывается.awesomeAnimalIds
областиdata
.awesomeAnimalIds
обновляется, что вызываетawesomeAnimalIds
установщик.data
поля, получившего уведомление, повторная визуализация запускается.Из этого и приведенного выше примера можно сделать следующие выводы:
Существует распространенное заблуждение, что методы «вызываются только один раз» или «запускаются и забываются» при вызове из шаблона. Это явно не всегда так, потому что методы могут установить реактивную зависимость .
Так, когда мы должны использовать вычисляемое свойство против метода?
См. Раздел руководства по компьютерному кешированию и методам . Вот мой взгляд на это:
fetch
от них.источник
Нет, методы не являются реактивными. Только данные могут быть реактивными в Vue.
НО важно понять, как работает Vue ...
data()
участников (это происходит постоянно, а не только во время 1-го рендеринга). Если во время рендеринга доступны какие-либо данные, Vue знает, что содержимое этого элемента данных влияет на результат рендеринга.Неважно, если вы ссылаетесь на элемент данных напрямую, используете его в
computed
или вmethod
. Если данные будут «затронуты» во время рендеринга, изменение данных вызовет повторный рендеринг в будущем ...источник
Это очень интересный случай.
Из того, что я прочитал и из своего опыта, я могу сказать, что: нет, методы по своей природе не реактивны. Метод должен быть явно вызван для его выполнения.
Но тогда как я могу объяснить ваш случай? Я поместил ваш код в песочницу и, конечно же, по мере того, как вы вставляете id в массив, шаблон обновляется для отображения имени животного. Это указывает на некоторую реактивность. Что дает?
Ну, я провел эксперимент. Я добавил простой
div
к каждому циклу, который генерирует случайное число при генерации.И я увидел, что каждый раз, когда в массив помещается новый идентификатор, все случайные числа меняются. Это ключ к пониманию того, почему «кажется», что метод
isAwesome
реактивный.Каким-то образом, когда новый идентификатор помещается в массив, Vue заново визуализирует цикл полностью, следовательно, снова выполняет методы. Я не могу объяснить внутреннюю работу того, почему vue перерисовывает весь цикл, что потребовало бы дальнейших исследований.
Итак, чтобы ответить на ваш вопрос.
isAwesome
не реагирует, это просто иллюзия, созданная повторным рендерингом цикла.источник
update
которые вызываютre-render
и вызывают какие - либо методы, которые связаны в шаблоне