Рубрики
Без рубрики

Как создать плагин для Vue.js

В этом руководстве мы рассмотрим простой пример создания плагина для Vue.js и разберёмся в преимуществах такого подхода в ваших собственных проектах.

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

Если вы не знаете, что такое Vue.js, вы можете узнать больше здесь. TLDR: Это прогрессивный Javascript-фреймворк, который можно использовать для создания высокоинтерактивных веб-приложений. Vue.js легкий, производительный, очень хорошо поддерживается и документируется, что делает его хорошим выбором для создания сложных современных веб-приложений в 2017 году и в будущем.

Плагины

Vue.js позволяет нам создавать плагины для добавления многократно используемой функциональности в приложение. Плагин обычно содержит одно или несколько следующих элементов:

  • Глобальные активы – например, директивы, фильтры, переходы и т.д.
  • Глобальные свойства или методы
  • Методы экземпляра
  • Опции компонента (например, миксин компонента, переопределяющий метод mounted()).

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

Синтаксис плагина

Плагин в Vue.js – это просто объект Javascript, который реализует метод установки. Vue.js ищет этот метод, когда мы вызываем Vue.use(Plugin).

FieldFormatter.install = (Vue, options) => {
  /* Plugin functionality */
}

Метод install() принимает объект Vue в качестве первого параметра и объект options в качестве второго параметра. Мы можем предоставить эти опции при вызове Vue.use():

Vue.use(Plugin, {
  somePluginOption: true,
  someOtherPluginOption: false,
})

Используя опции, мы можем настроить использование плагина в соответствии с конкретными потребностями пользователя.

В примере ниже мы создадим директиву, которая ограничивает количество символов в текстовом узле (т.е. <p>, <div>, <h3> и т.д.) до заданного значения. Эта директива просто заменит текст в узле на сокращенную версию и добавит ссылку в конце, которая позволит нам увидеть остальную часть содержимого при нажатии на нее. Подобную функциональность мы можем наблюдать в приложениях социальных сетей, которые позволяют постепенно раскрывать содержание, например, длинного комментария.

Как вы можете себе представить, мы, вероятно, захотим иметь доступ к этой директиве во всех наших компонентах и, возможно, упаковать ее красивым образом с другим кодом, связанным с рендерингом. Это хороший пример того, как использование плагинов в вашем проекте может быть полезным.

Мы сделаем это, как показано ниже:

// - src/plugins/fieldFormatter.js
const FieldFormatter = {
  install(Vue, options) {
    Vue.directive('limit-characters', {
      bind(el, binding, vnode, oldVnode) {
        const limit = binding.value || 100;
        const original = el.innerHTML;
        const summary = original.slice(0, limit);
        const expandLink = document.createElement('a');
        const collapseLink = document.createElement('a');
                
        expandLink.innerHTML = 'Read more...';
        collapseLink.innerHTML = 'Read less...';
                
        expandLink.style.textDecoration = collapseLink.style.textDecoration = 'underline';
        expandLink.style.cursor = collapseLink.style.cursor = 'pointer';
                
        const expandNode = () => {
          el.innerHTML = `${original} `;
          el.appendChild(collapseLink);
        }
        
        const collapseNode = () => {
          el.innerHTML = `${summary}... `;
          el.appendChild(expandLink);
        }

        expandLink.addEventListener('click', expandNode);
        collapseLink.addEventListener('click', collapseNode)

        collapseNode();
      }
    })
  },
};

export default FieldFormatter;

Здесь мы видим простой плагин с одной директивой limit-characters, которая ограничивает количество символов в строке. Мы установим значение этого ограничения для текстового узла с помощью v-limit-characters=”characterLimit”. characterLimit – это переменная в нашем объекте данных, но мы также можем использовать вместо нее литеральное число.

Обратите внимание, что этот пример не готов к “производству”. Он сломается, если ограничение не будет задано числом.

Чтобы установить наш недавно созданный плагин, в вашем входном файле (обычно это src/main.js при инициализации проекта с помощью vue-cli) установите плагин с помощью Vue.use()

// - src/main.js
import Vue from 'vue';
import FieldFormatter from './plugins/fieldFormatter';

...
Vue.use(FieldFormatter);
...

Теперь мы можем использовать эту директиву в наших компонентах следующим образом:

// - src/components/Report.vue
<template>
  <div class="report">
    <div class="report-summary" v-for="report in reports" key="report.id">
      <h1>{{ report.title }}</h1>
      <p v-limit-characters="defaultCharacterLimit">{{ report.description }}</p>
    </div>
    </div>
</template>

<script>
export default {
  data() {
    return {
      reports: [/* Array of Reports */],
      defaultCharacterLimit: 100,
    };
  },
};
</script>

Расширение нашего примера

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

// - src/plugins/fieldFormatter.js
const FieldFormatter = {
  install(Vue, options) {
    ...
    Vue.prototype.$filter = (dataset, query) => {
      return dataset.filter(item => {
        const queryKeys = Object.keys(query);
        for(let i = 0; i < queryKeys.length; i++) {
          const key = queryKeys[i];
          if(query[key]!== '' && !(key in item)) {
            return false;
          }
          if (item[key] !== query[key]) {
            return false;
          }
        }
        return true;
      });
    };
    ...
  }
}

export default FieldFormatter;

Затем мы можем использовать этот метод экземпляра в нашем компоненте следующим образом:

// - src/components/FilteredTableDisplay.vue
<template>
  <div class="filtered-table-display">
    <div class="filters">
      <input type="text" v-mode="filter.param1"/>
      <input type="text" v-mode="filter.param2"/>
      <input type="text" v-mode="filter.param3"/>
    </div>
    <table border="1" cellspacing="0" cellpadding="0">
      <thead>
        <tr>
          <th>param1</th>
          <th>param2</th>
          <th>param3</th>
        </tr>
      </thead>
      <tr v-for="row in filteredData">
        <td>{{ row.param1 }}</td>
        <td>{{ row.param2 }}</td>
        <td>{{ row.param3 }}</td>
      </tr>
    </table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      filter: {
        param1: 'a',
        param2: 'b',
        param3: 'c'
      },
      rawData: [
        {
          param1: 'c',
          param2: 'd',
          param3: 'e',
        },
        {
          param1: 'c',
          param2: 'a',
          param3: 'd',
        },
        {
          param1: 'e',
          param2: 'a',
          param3: 'c',
        }
      ],
    }
  },
  computed: {
    filteredData() {
      return this.$filter(this.rawData, this.filter);
    },
  },
}
</script>

Здесь мы используем метод $filter(), который мы создали в нашем плагине, как если бы мы вызывали любой обычный метод компонента. Мы можем использовать наш метод в вычисляемом свойстве для фильтрации данных на основе объекта this.filter.

Резюме

Плагины предоставляют отличный способ обмена кодом между компонентами и, что более важно, обмена кодом с другими разработчиками. Есть несколько плагинов для Vue, которые вы, возможно, уже использовали, и вы можете найти еще больше замечательных плагинов здесь. Я использую много плагинов и поэтому обычно ценю то, как авторы различных плагинов строят свой код, чтобы сделать его удобным для разработчиков.

Надеюсь, это вдохновит вас на создание собственных плагинов и использование их в ваших будущих проектах Vue.js.

Более подробную информацию о плагинах можно найти в документации Vue.js.

Оригинал: “https://www.codementor.io/@chidieberennadi558/how-to-create-a-plugin-in-vue-js-ehdmg125e”