VUE, испуская против прохождения функции в качестве реквизита - PullRequest
0 голосов
/ 25 мая 2018

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

Я думаю, что есть по крайней мере два способа сделать это.

  1. Пусть ребенок отправит событие родителям, а затем разрешит родителям определить обработчик.

  2. Определите обработчики в родителях ипередать его как подпорку компоненту кнопки.

Я привык делать это в React.Есть ли лучшая практика в этой ситуации?

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

Я все еще изучаю Vue.js, и я буду рад что-то изменить здесь, если будут несоответствия.


Vue.js события являются обратными вызовамиони не являются событиями DOM.Это можно проверить, поскольку вы добавляете пользовательское имя в прослушиватель событий, а не имя события DOM (click, focus ...), и объекту event не передается функция, если вы не укажете$event аргумент в вызове $emit.

События

Плюсы

  • Для библиотек: он легче, а клиенты более гибки в методахиспользование
  • Полезное ведение журнала событий Vue devtools
  • Разрешить глобальный прослушиватель (this.$root.on), хотя это может быть улучшено с помощью Vuex.js.
  • Дифференцированный синтаксис: :для реквизитов и @ для событий / методов

Минусы

  • Менее явный, более сложный для отладки (происходит молчание, если нет слушателей или имя события написано с ошибкой)

Реквизиты

Плюсы

  • Более явные, декларативные, могут быть дефолтными, обязательными, проверенными, что делает их более удобными для отладки (ошибки времени выполнения илиошибки компиляции в TypeScript)

Минусы

  • Необходимо включить проверку реквизита, чтобы вам не приходилось проверять, существует ли function() реквизит перед вызовом (но в любом случае использование валидации реквизита является хорошей практикой ...)

Заключение

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

Реквизит может делать все события делать, кроме нескольких случаев (например, $root шаблон прослушивания событий - замечание, что Vuex.js заменяет эту функцию и является предпочтительным длямасштабируемость), с преимуществом они более явные, отлаживаемые и подверженные проверкам.

Суммировано по: https://forum.vuejs.org/t/events-vs-callback-props/11451

0 голосов
/ 25 мая 2018

Лучшая практика

Лучшей практикой будет вариант № 1. Вы можете увидеть, что эта практика используется в официальной документации: https://vuejs.org/v2/guide/components.html#Sending-Messages-to-Parents-with-Events

Производительность

До тех пор, покаВы передаете ссылку на функцию, которая будет выполняться при использовании шины событий или при передаче в качестве реквизита, вы почти не увидите разницы в производительности.

Пример использования опции номер 1

Вы можете использоватьthis.$emit('eventName', dataToSend, ...) для отправки данных родительскому компоненту, который затем прослушивает компонент, подобный этому <my-component @eventName="yourHandler" />.После этого вы сможете использовать различную логику для каждой кнопки.

Я создал скрипку для компонента с множественным выбором, который реализует это: https://jsfiddle.net/wkdL0xbc/

// HTML
<div id="app">
  <multi-choice :items="myItems" @selected="alert($event)"></multi-choice>
  <multi-choice :items="myItems" @selected="sayIsCool"></multi-choice>
</div>

// JavaScript
const multiChoice = {
    template: '<div class="multi-choice"><span v-for="item in items" @click="select(item)">{{ item }}</span></div>',
  props: ['items'],
  methods: {
    select(item) {
        this.$emit('selected', item);
    }
  }
};

new Vue({
  el: "#app",
  data() {
    return {
        myItems: [
        'Homer',
        'Marge',
        'Bart'
      ],
    }
  },
  components: {
    multiChoice: multiChoice
  },
  methods: {
    sayIsCool(item) {
        alert(item + ' is cool!')
    }
  }
})
0 голосов
/ 25 мая 2018

Вы ищете «Прозрачные упаковщики»

Таможенное мероприятие Vue работает не так, как обычное событие DOM.Поэтому вам нужно прикрепить свойство .native к событию

Но если вы хотите, чтобы событие произошло на дочернем элементе, вы определяете вычисляемое свойство, которое будет возвращаться, и объект слушателей.И теперь вы не будете

. По умолчанию атрибуты, не определенные как реквизиты, будут добавлены к корневому элементу представления

. Таким образом, вы можете установить значение атрибута attribute_Attrs: false и затем привязать $ attrs кребенок, и тогда он становится целью для этих атрибутов

Теперь вам не нужно думать о том, что является корневым компонентом.

Крис Фриц делает большую работу, объясняя, как они работают в его7 секретных шаблонов разговоров.Начинается около 21:44 https://youtu.be/7lpemgMhi0k?t=21m44s

0 голосов
/ 25 мая 2018

Философия Vue - опора, события - вверх.Из первого варианта следует, что ближе, когда само событие отправляется (вверх) к родительскому элементу, а затем обрабатывается.

Также в Vue SFC вы получаете дополнительное преимущество, заключающееся в добавлении префиксного атрибута с помощью v-on (или@) который описывает свое намерение как событие, движущееся вверх, а не как v-bind (или :), что подразумевает, что это опора, даже если это действительно обратный вызов к событию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...