В Vue.js нет встроенной директивы v-rerun
, но можно создать кастомную директиву, которая будет повторно запускать логику при изменении данных или событий. Вот как это работает:
Проблема
Директивы Vue выполняются в определённые моменты жизненного цикла элемента (например, mounted
, updated
). Если нужно перезапустить логику директивы без пересоздания элемента, требуется специальный подход.
Пример: Директива для повтора логики
Допустим, мы хотим, чтобы директива v-rerun
обновляла стиль элемента при изменении переданного значения
javascript// main.js
app.directive('rerun', {
updated(el, binding) {
// Логика, которая выполняется при изменении binding.value
el.style.color = binding.value.color;
}
});
xml<template>
<p v-rerun="config">Текст, который меняет цвет</p>
<button @click="updateColor">Изменить цвет</button>
</template>
<script>
export default {
data() {
return {
config: { color: 'red' }
};
},
methods: {
updateColor() {
this.config = { color: 'blue' }; // Директива обновится
}
}
};
</script>
Механизм работы
- Хук
updated
: Срабатывает при обновлении родительского компонента или изменении входных параметров директивы. - Зависимость от
binding.value
: Vue отслеживает изменения переданного значения и автоматически вызывает хукupdated
Альтернативы
v-memo
Директива v-memo
(Vue 3.2+) кэширует поддерево компонента и обновляет его только при изменении указанных зависимостей:
xml<div v-memo="[dependency]">
<!-- Контент обновится только при изменении dependency -->
</div>
Перезапуск через ключ
Добавьте уникальный key
к элементу. При изменении ключа Vue пересоздаст элемент, и директива выполнится снова:
xml<div :key="trigger" v-my-directive></div>
Пример с обработкой события
Если нужно запустить директиву по клику, используйте v-on
+ ref
:
xml<template>
<input ref="myInput" v-focus />
<button @click="rerunFocus">Перефокусировать</button>
</template>
<script>
export default {
directives: {
focus: {
mounted(el) {
el.focus();
}
}
},
methods: {
rerunFocus() {
this.$refs.myInput.focus(); // Явный вызов логики директивы
}
}
};
</script>
Когда использовать?
- Динамические стили: Обновление CSS при изменении данных.
- Анимации: Перезапуск анимаций по условию.
- Сторонние библиотеки: Инициализация плагинов при изменении параметров.
Итог:
«Rerun» директиву можно реализовать через:
- Отслеживание изменений в
binding.value
(хукиupdated
). - Явный вызов методов через
ref
. - Использование
v-memo
для контроля обновлений. - Принудительный ререндер через
key
.