Несколько распространенных способов передачи параметров между компонентами Vue

Vue.js

На самом деле существует много способов взаимодействия между родительскими и дочерними компонентами Vue.Эта статья предназначена только для того, чтобы сделать краткий обзор, рассказать об их преимуществах и недостатках, а также о том, как использовать соответствующие документы, и онлайн-мастера обобщили многие из них, поэтому я не буду не объяснять их здесь.

1.Vuex

представлять

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

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

инструкции

Портал официального сайта

Преимущества и недостатки

  • преимущество
    • Для решения сложных событий разбросаны многослойные сборки.
    • Решена проблема, связанная с тем, что несколько компонентов зависят от одного и того же состояния.
    • Однонаправленный поток данных
    • Адаптировано для Vue, стоимость обучения невысока.
  • недостаток
    • Сохранение данных невозможно. Обновление страницы потребует переделки. Для сохранения данных рассмотрите возможность использования локального хранилища.
    • Добавьте дополнительный размер кода, и это не рекомендуется для простых бизнес-сценариев.

2.EventBus

представлять

При совместном использовании экземпляра vue используйте $on и $emit экземпляра для передачи данных.

инструкции

Вот простой способ его использования

// bus.js
import Vue from 'vue'
export default new Vue({})

// component-a.js
import bus from './bus.js'
export default {
  created () {
    bus.$on('event-name', (preload) => {
      // ...
    })
  }
}

// component-b.js
import bus from './bus.js'
export default {
  created () {
    bus.$emit('event-name', preload)
  }
}

Преимущества и недостатки

  • преимущество
    • Устранено утомительное распространение событий между многоуровневыми компонентами.
    • Принцип использования очень прост, а объем кода небольшой.
  • недостаток
    • Поскольку используется экземпляр Vue, он подвержен повторяющимся сценариям срабатывания, например:
      1. В многопользовательской разработке A и B определяют одно и то же имя события.
      2. Обе страницы определяют одно и то же имя события и не уничтожаются с помощью $off (часто при переключении маршрутизации).
      3. Зарегистрируйтесь в компоненте, который выходит из for.
    • Управление событиями таким образом в проекте будет очень запутанным, поэтому в настоящее время рекомендуется использовать vuex.

3.props и $emit/$on

представлять

Наиболее основным способом передачи данных из родительского компонента к дочернему компоненту является прохождение наших пользовательских атрибутов для дочернего компонента. Дочерний компонент вызывает событие V-на событии родительского компонента через метод $ emit, чтобы дочерний компонент запускает метод родительского компонента.

инструкции

реквизит использовать портал

Портал $emit/$on use

Преимущества и недостатки

  • преимущество

    • Это самый простой в использовании и наиболее распространенный способ передачи компонентов родитель-потомок.
    • Vue предоставляет поддержку для проверки типа реквизиты.
    • $emit не изменит событие с тем же именем других компонентов, потому что оно может вызвать только событие родителя, которое отличается от шины событий.
  • недостаток

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

Tips

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

$attrs использовать портал

$listeners используют портал

4.provide/inject

представлять

Данные/метод предоставляются дочернему компоненту посредством предоставления в родительском компоненте, а внедренные данные/метод получаются в дочернем компоненте посредством внедрения.

инструкции

официальный портал

Преимущества и недостатки

  • преимущество
    • Нам не нравится, когда слои реквизита проходят через иерархию.
  • недостаток
    • Свойства, передаваемые таким образом, не являются реактивными, поэтому старайтесь как можно чаще передавать некоторые статические свойства.
    • Цитата с официального сайта它将你的应用以目前的组件组织方式耦合了起来,使重构变得更加困难。, мое понимание этого предложения таково, что если вы используете Provide/inject, вы должны следовать его методу организации компонентов.Если вы хотите уничтожить этот метод организации при рефакторинге проекта, будут дополнительные затраты на разработку.На самом деле, у event-bus тоже есть эта проблема.

5.slot

представлять

Вы можете добавить пользовательский контент в HTML-шаблон компонента, этот контент может быть любым шаблоном кода, например:

<navigation-link url="/profile">
  <!-- 添加一个 Font Awesome 图标 -->
  <span class="fa fa-user"></span>
  Your Profile
</navigation-link>

Все в родительской компонентной шаблоне будет скомпилирован в родительской области; все вещи субменовых шаблонов скомпилированы в области детской области.

Вы также можете пройтиslot-scopeАтрибут для передачи некоторой информации от дочернего компонента к родительскому компоненту.Обратите внимание, что этот атрибут является новым в vue2.1.0+.

инструкции

официальный портал

Преимущества и недостатки

  • преимущество
    • Содержимое, вставленное в дочерний компонент, можно настроить в родительском компоненте.Хотя можно использовать и другие свойства, я думаю, что слот более склонен к настройке условия, исходящего из родительского контейнера.
    • Хорошая возможность повторного использования, подходящая для разработки компонентов.
  • недостаток
    • Как и реквизит, он не поддерживает межуровневую передачу.

6.$parent/$children

представлять

Через $parent/$children вы можете получить экземпляр родительско-дочернего компонента, чтобы вызвать метод в экземпляре для реализации связи между родительско-дочерним компонентом. Эта практика не рекомендуется.

инструкции

пройти черезthis.$parentилиthis.$childrenПолучите экземпляр родительского или дочернего компонента.официальный портал

Преимущества и недостатки

  • преимущество
    • Вы можете получить экземпляр родительского и дочернего компонентов, чтобы иметь все свойства в экземпляре.
  • недостаток
    • Компоненты, написанные таким образом, очень сложно поддерживать, потому что вы не знаете, откуда берутся данные, что противоречит принципу одностороннего потока данных.
    • this.$childrenТо, что вы получаете, представляет собой массив, и вы не можете точно найти позицию искомого подкомпонента, особенно когда подкомпонентов много.