Vue Rerun Directive: как заставить директиву выполниться повторно

Vue Rerun Directive Vue.js

В Vue.js нет встроенной директивы v-rerun, но можно создать кастомную директиву, которая будет повторно запускать логику при изменении данных или событий. Вот как это работает:

Проблема

Директивы Vue выполняются в определённые моменты жизненного цикла элемента (например, mountedupdated). Если нужно перезапустить логику директивы без пересоздания элемента, требуется специальный подход.

Пример: Директива для повтора логики

Допустим, мы хотим, чтобы директива 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» директиву можно реализовать через:

  1. Отслеживание изменений в binding.value (хуки updated).
  2. Явный вызов методов через ref.
  3. Использование v-memo для контроля обновлений.
  4. Принудительный ререндер через key.
Оцените статью
Уроки программирования
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x