JavaScript

Передача данных во Vue.js — как это работает?

Spread the love

Перевод статьи DavidMM : Vue data flow — How it works?

Когда я изучал Vue, одной из самых сложных вещей было понимание того, как передавать данные во Vue. EventBus, Vuex, Props … Что это такое? Что из них я должен использовать?

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


Внутри компонента

Это самое базовая использование Vue. Одна страница с одним компонентом. Это похоже на Vanilla Javascript с оттенком реактивности (как только вы изменяете объект, представление обновляется).

Вот часть HTML:

А вот и Javascript:

Как видите, все довольно просто. Здесь используются только два метода: первый для добавления, а второй для удаления задач.

В 23-й строке раздела HTML вы найдете функцию «on-click», которая переключает текущее задание между завершенным и незавершенным состояниями, а в строке 25 — другое, чтобы установить текущее задание для редактирования. Двухстороннее связывание данных делает все работу.

Методы взаимодействуют и изменяют данные (массив «todos»), достигая To-Do через «this». Как я уже сказал, это выглядит почти так же как если бы это был бы обычный Javascript.

Но что, если у нас есть два компонента в разных местах? Или три? Что, если один компонент является родительским для другого, и нам нужно передавать информацию между компонентами?


Props и $emit — для компонентов родителей и их потомков

Допустим, у нас есть представление, разделенное на несколько компонентов, с дочерними компонентами внутри компонентов, вот как то так:

Как видите, оранжево-желтый основной компонент действует как корень каждого компонента. Внутри 3 компонента: красный, фиолетовый и зеленый. Некоторые из компонентов имеют дочерний компонент, что делает его веб-приложением 3 уровня.

Что делать, если вы хотите передать информацию из красного компонента в один из дочерних зеленых компонентов. Как бы вы это сделали?

Вы можете отправить информацию родителю с помощью $emit, а затем дочернему компоненту с помощью props. Это будет выглядеть как то так:

Вот как я использовал $emit и props:

Выглядит немного сложновато, но в действительности все довольно просто, когда вы освоитесь. Отправляйте свои данные с помощью $emit в верхний компонент, а вниз с помощью props.

Но что, если мы хотим отправить информацию между компонентами с несколькими уровнями между ними? Нам нужно будет использовать 4 $emits и 2 props?

Ну, конечно так можно сделать. Но это было бы сумасшествием.

Лучше в этом случае использовать EventBus.


EventBus — из любого места в любое место

Глобальный EventBus работает как «Родитель всех компонентов». Этот компонент имеет доступ ко всем компонентам, в которые он был загружен.

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

Вот как это работает:

Намного проще, не правда ли? Просто добавьте компонент Vue с именем «EventBus» в ваш main.js и используйте его как способ отправки / получения сигналов от компонентов.

Хотя это отличный способ может работать с небольшими и средними приложениями, но более стандартный способ это использование Vuex


Vuex — наш менеджер состояний

Vuex — это шаблон управления состоянием Vue для приложений Vue.js.

Думайте о нем как о централизованном хранилище данных или «единственном источнике правды».

Vuex действует как единое центральное хранилище для всех компонентов в одном приложении. Кроме того, отслеживает все методы (или мутации) и помогает вам управлять всеми данными в вашем веб-приложении.

Если вы используете Vue Devtools, вы можете использовать их интересные функции, такие как отслеживание или просмотр всех данных, хранящихся в Vuex.

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

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

Давайте посмотрим, как я использовал его в реальной обстановке:

Снова довольно просто. Мы загружаем все функции и данные в файл store.js, который станет нашим «Единственным источником правды». Затем для каждого необходимого компонента мы загрузим нужные нам части.


Какой из подходов я должен использовать?

Как всегда ответ зависит от ваших потребностей … .

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

  • Один компонент: так же, как вы бы использовали Vanilla Javascript
  • Props и $emit: если у вас есть несколько компонентов рядом друг с другом. Props отлично работает, когда у вас есть несколько компонентов, и нам нужно передавать разные данные (например, у нас есть 4 таблицы с разными наборами данных в каждой)
  • EventBus: Если у вас есть более чем пару компонентов, если структура вашего веб-приложения устанавливает ваши компоненты более горизонтально (родственные компоненты вместо родительских), чем по вертикали, и запускать функции (например, для активации уведомления)
  • Vuex: Если у вас есть веб-приложение от среднего до большого размера, где вы используете сложную логику и хотите отслеживать все изменения ваших данных, использовать API и т. д.

Опыт научит вас, когда использовать каждый из них.

Например, я использую Vuex в каждом приложении, даже в небольших (я люблю отслеживать свои данные), так же использую EventBus, чтобы запускать функции для определенных событий, когда я создаю компонент, который я использую несколько раз с различными данными.

Заключение

Читать (и писать) о том, какие методы обработки данных мы можем использовать, было круто, но вы должны практиковаться. Я написал небольшой пост, более ориентированный на код, чем этот, где я объяснял теорию. Вы можете прочитать о теории передачи данных здесь: Passing data in Vue

И, конечно же, у нас есть отличная документация по Vue:

Props и $emit

Global Event bus

Vuex

Была ли вам полезна эта статья?
[34 / 2.2]

Spread the love
Editorial Team

View Comments

  • На картинках нужно было добавить возможность увеличения, иначе получается *вырви глаз*. Или выложили бы код куда-то.
    А так спасибо за статью.

  • Статья вообще теряет смысл с такими чудо-картинками.

  • Вот реально, написал статью, а картинки зажал автор, за это 1 звезда тока.

  • а как скриншоты кода увеличить? они что реально такого низкого качества?

  • пофиг, что картинки хреновые, спасибо тебе бро! нигде не мог найти примеры использования входных параметров именно с однофайловыми компонентами и еб..лся со строковыми шаблонами до сего момента <3

  • Код на картинках не читабельный 😕

  • На десктоп версии страницы скринов вообще нет. Браузер SRWare Iron (на хроме), win 10. Недавно читал на андроиде и всё было норм. Все скрины, помимо последнего, кое-как можно прочесть.

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

12 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

12 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago