Как я могу повторно использовать функцию в нескольких хуках директив?

У меня есть директива, которая обновляет внешний вид элементов при изменении их содержимого. Таким образом, мне нужно, чтобы он запускался как при срабатывании собственного события change, так и при первой настройке элемента. Поэтому я запускаю свою функцию в хуке bind и в хуке componentUpdated.

Таким образом, структура этого выглядит примерно так:

directives: {
    demo: {
        bind(el) {
            el.addEventListener('change', () => {
                alert('i am a directive function');
            });
        },

        componentUpdated(el) {
            alert('i am a directive function');
        }
    }
}

Он отлично работает, но мне пришлось скопировать и вставить функцию в оба объявления ловушек, и я хотел бы избавиться от этого.

Я подумал, что, возможно, объявление директивы может иметь свои локальные свойства, доступные через this, поэтому я попытался решить это следующим образом:

directives: {
    demo: {
        myFunction: () => {
            alert('i am a directive function');
        },

        bind(el) {
            el.addEventListener('keyup', () => this.myFunction());
        },

        componentUpdated(el) {
            this.myFunction();
        }
    }
}

Но это не сработало, говоря, что this.myFunction не является функцией.

Как мне заставить это работать?

Я бы просто переместил myFunction за пределы директивы в отдельную функцию, которую можно было бы вызывать где угодно. например, function myFunction() { ... }, а затем просто используйте myFunction() там, где это необходимо.

tony19 11.12.2020 12:11

Это не очень похоже на разделение интересов. В идеале я хотел бы, чтобы директивы были своего рода plug & play и легко могли использоваться повторно.

Digital Ninja 11.12.2020 23:12

Хм, я должен что-то упустить. Почему внешняя функция препятствует использованию plug&play или повторному использованию? Мой ответ ниже (вариант 2) демонстрирует то, что я предлагал.

tony19 12.12.2020 06:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
463
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вариант 1: отдельная переменная директивы

Определите директиву в собственной переменной, на которую можно было бы ссылаться по имени вместо this:

// MyComponent.vue
const myDirective = {
  myFunction(msg) {
    console.info(msg)
  },
  bind(el, { value }) {
    el.addEventListener('keyup', () => myDirective.myFunction(value))
  },
  componentUpdated(el, { value }) {
    myDirective.myFunction(value)
  }
}

export default {
  directives: {
    myDirective
  }
}

демо 1

Вариант 2: отдельная функция

Определите общую функцию вне директивы и используйте ее там, где это необходимо:

// MyComponent.vue
function myFunction(msg) {
  console.info(msg)
}

export default {
  directives: {
    myDirective: {
      bind(el, { value }) {
        el.addEventListener('keyup', () => myFunction(value))
      },
      componentUpdated(el, { value }) {
        myFunction(value)
      }
    }
  }
}

демо 2

В обоих приведенных выше примерах директивы можно было бы переместить в отдельный файл, что повысило бы их тестируемость и улучшило бы читаемость компонента.

Да, вариант 2 — это тот, который я имел в виду, я не хотел, потому что он объявлял глобальную функцию (я нахожусь в банкомате приложения, отличного от cli). Вариант 1 — это именно то, что я хотел и пробовал, но я не знал, как правильно получить доступ к функции (я пытался с this). Так что это работает. Спасибо!

Digital Ninja 12.12.2020 15:39

Другие вопросы по теме