Обмен технологиями

Полное объяснение взаимодействия компонентов Vue 3: от базовых до продвинутых методов.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

введение

Vue 3 представляет Composition API, который обеспечивает новую гибкость и мощь взаимодействия компонентов.

Основы взаимодействия компонентов

Определение и функции компонентов

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

Дерево компонентов и взаимосвязь родительских и дочерних компонентов

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

  • Отношения родительско-дочерних компонентов : В дереве компонентов компонент может создавать другой компонент. В этом случае создатель называется родительским компонентом, а созданный компонент — дочерним компонентом. Родительские компоненты могут передавать данные и методы дочерним компонентам, а дочерние компоненты могут отправлять информацию родительским компонентам через события. Эти родительско-дочерние отношения являются основой взаимодействия компонентов.
  • Отношения родственных компонентов : Несколько дочерних компонентов одного и того же родительского компонента являются отношениями родственных компонентов. Родственные компоненты не могут напрямую взаимодействовать друг с другом, и связь между ними обычно необходимо передавать через родительский компонент.
  • Отношения компонентов предка и потомка : В дереве компонентов родительский компонент родительского компонента является компонентом-предком, а дочерний компонент дочернего компонента является компонентом-потомком. Эта связь особенно важна при работе с глубоко вложенными компонентами.

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

Связь родительско-дочерних компонентов (Vue 3)

Родитель передает данные дочернему элементу (реквизит)

Что такое реквизит
Props — это механизм, позволяющий родительским компонентам передавать данные дочерним компонентам.В Vue 3 используйтеdefinePropsAPI используется для объявления получения реквизитов, что поддерживает односторонний поток данных и обеспечивает независимость и возможность повторного использования компонентов.

Как передать реквизит в родительский компонент
В шаблоне родительского компонента используйтеv-bindили аббревиатура:Чтобы привязать данные:

  1. <template>
  2. <ChildComponent :my-prop="parentData" />
  3. </template>

здесь,:my-propУказывает, что это динамически связанный реквизит,parentDataОпределены ли данные в родительском компоненте?

Как получить реквизиты в дочернем компоненте
В дочернем компоненте используйтеdefinePropsЧтобы объявить полученные реквизиты:

  1. <script setup>
  2. import { defineProps } from 'vue';
  3. const props = defineProps({
  4. myProp: String
  5. });
  6. </script>

существовать<script setup>В синтаксическом сахареdefinePropsАвтоматически отображает реквизиты как адаптивные свойства компонента.

Дочерний элемент передает событие родителю (Emit)

что такое выброс
Emit — это механизм, позволяющий дочерним компонентам отправлять сообщения родительским компонентам.В Vue 3 используйтеdefineEmitsAPI для объявления событий, которые могут быть созданы, и использованияemitфункция для запуска событий.

Как вызвать событие в дочернем компоненте
В методе дочернего компонента используйте defineEmits объявлять события, которые могут быть созданы, и использовать emit для запуска:

  1. <script setup>
  2. import { defineEmits } from 'vue';
  3. const emit = defineEmits(['my-event']);
  4. function triggerEvent() {
  5. emit('my-event', dataToPass);
  6. }
  7. </script>

defineEmitsиспользуется для объявления событий, которые может генерировать компонент, аemitФункции используются для запуска этих событий.

Как прослушивать события дочернего компонента в родительском компоненте
В шаблоне родительского компонентаиспользоватьv-onили аббревиатура@ Чтобы прослушивать события, создаваемые дочерними компонентами:

  1. <template>
  2. <ChildComponent @my-event="handleEvent" />
  3. //或者<ChildComponent v-on:my-event="handleEvent" />
  4. </template>

здесь,@my-eventУказывает, что подкомпонент прослушивания излучаетmy-eventсобытие,handleEventЭто метод, определенный в родительском компоненте. Когда событие сработает, этот метод будет вызван.

Комплексный пример

Предположим, что есть родительский компонентParentComponentи подкомпонентChildComponentродительский компонент должен передать данные дочернему компоненту, а дочерний компонент должен уведомить родительский компонент после определенной операции.

родительский компонентParentComponent.vue

  1. <template>
  2. <ChildComponent :my-prop="parentData" @child-event="handleChildEvent" />
  3. </template>
  4. <script setup>
  5. import { ref } from 'vue';
  6. import ChildComponent from './ChildComponent.vue';
  7. const parentData = ref('initial data');
  8. const handleChildEvent = (data) => {
  9. console.log('Received data from child:', data);
  10. };
  11. </script>

ПодсборкаChildComponent.vue

  1. <template>
  2. <button @click="sendDataToParent">Send Data to Parent</button>
  3. </template>
  4. <script setup>
  5. import { defineProps, defineEmits } from 'vue';
  6. const props = defineProps({
  7. myProp: String
  8. });
  9. const emit = defineEmits(['child-event']);
  10. function sendDataToParent() {
  11. emit('child-event', props.myProp);
  12. }
  13. </script>

В этом примере родительский компонент передает:my-propПередайте данные дочерним компонентам и передайте@child-event Слушайте события, создаваемые дочерними компонентами.проходы дочерних компонентовdefinePropsПолучает содержимое, переданное родительским компонентомmyPropи используйте его в событии нажатия кнопкиemitОтправьте данные в родительский компонент.

Использование Pinia (библиотека управления состоянием для Vue 3)

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

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

  • API компонента: Pinia использует API на основе компонентов, что делает разделение управления состоянием и логики компонентов более естественным.
  • Поддержка TypeScript: Пиния с самого начала рассматривала возможность поддержки TypeScript, что обеспечивает лучший вывод типов и поддержку редактора при разработке с использованием TypeScript.
  • Модульный: Pinia позволяет разделить состояние на несколько магазинов, и каждый магазин может независимо управлять своим состоянием и логикой.
  • Совместимость с композитным API: Pinia прекрасно интегрируется с Composition API Vue 3, что делает разделение управления состоянием и логики компонентов более естественным.
  • Отладка путешествий во времени: Pinia предоставляет возможности отладки путешествий во времени, позволяя разработчикам легко возвращаться и проверять изменения состояния.
Как настроить и использовать Pinia

Чтобы начать использовать Pinia, сначала необходимо установить Pinia:

npm install pinia

Или используйте Пряжу:

yarn add pinia

Затем настройте Pinia в своем приложении Vue:

  1. import { createPinia } from 'pinia';
  2. const pinia = createPinia();
  3. app.use(pinia);

Создайте магазин:

  1. import { defineStore } from 'pinia';
  2. export const useCounterStore = defineStore('counter', () => {
  3. const count = ref(0);
  4. function increment() {
  5. count.value++;
  6. }
  7. return { count, increment };
  8. });

Использовать магазин в компоненте:

  1. <script setup>
  2. import { useCounterStore } from '@/stores/counter';
  3. const counterStore = useCounterStore();
  4. </script>
  5. <template>
  6. <div>
  7. <p>Count: {{ counterStore.count }}</p>
  8. <button @click="counterStore.increment">Increment</button>
  9. </div>
  10. </template>
Интеграция Pinia с компонентами

Интеграция Pinia с компонентами очень проста, в основном черезdefineStore функция для создания магазина. В компонентах вы можете напрямую использовать состояние и методы в магазине:

  1. <template>
  2. <div>
  3. <p>Count: {{ count }}</p>
  4. <button @click="increment">Increment</button>
  5. </div>
  6. </template>
  7. <script setup>
  8. import { useCounterStore } from '@/stores/counter';
  9. const counterStore = useCounterStore();
  10. const { count, increment } = storeToRefs(counterStore);
  11. //如果这里不使用storeToRefs会丢失响应式特性
  12. </script>

В приведенном выше примере мы получаем доступ непосредственно в шаблоне.countдля отображения значения счетчика и вызова его в событии нажатия кнопкиincrementМетод увеличения значения счетчика.

Уникальный метод связи Vue 3

Предоставить/ввести

Базовое использование Provide/Inject
В Вью 3,provideиinjectЭто метод связи между родительскими и дочерними компонентами, который позволяет компоненту-предку внедрить зависимость во все его компоненты-потомки, независимо от глубины иерархии компонентов.

  • предоставить данные: Использование родительского компонентаprovideФункции предоставляют данные.
  • Внедрить данные: используется компонентами-потомкамиinjectФункция вводит данные.

Применимые сценарии для предоставления/внедрения
provideиinjectПрименимо к следующим сценариям:

  • Если вы хотите избежать прохождения нескольких слоевpropsпри передаче данных.
  • Если вы хотите, чтобы несколько компонентов в дереве компонентов обменивались данными.

Образец кода

  1. // 祖先组件
  2. export default {
  3. setup() {
  4. const message = 'Hello from Ancestor!';
  5. provide('message', message);
  6. }
  7. }
  8. // 子孙组件
  9. export default {
  10. setup() {
  11. const message = inject('message');
  12. return { message };
  13. }
  14. }
Телепорт

Концепция и использование Телепорта
TeleportЭто новый встроенный компонент, добавленный в Vue 3, который позволяет «передавать» часть шаблона внутри компонента в любое другое место в DOM.

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

Образец кода

  1. <!-- 父组件 -->
  2. <template>
  3. <div>
  4. <Teleport to="body">
  5. <ChildComponent />
  6. </Teleport>
  7. </div>
  8. </template>
  9. <!-- 子组件 -->
  10. <template>
  11. <div>Some content</div>
  12. </template>
API композиции

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

Используйте ref и reactive для межкомпонентного взаимодействия.
refиreactiveЭто инструмент API композиции для создания адаптивных данных.

  • refРеактивные ссылки для создания базовых типов данных.
  • reactiveРеактивная ссылка для создания типов объектов.

Использование предоставления и внедрения в Composition API
В API композицииprovideиinjectдопустимыйsetupИспользуется в функциях для обеспечения межкомпонентной связи.

Образец кода

  1. // 祖先组件
  2. import { provide } from 'vue';
  3. export default {
  4. setup() {
  5. const message = ref('Hello from Ancestor!');
  6. provide('message', message);
  7. }
  8. }
  9. // 子孙组件
  10. import { inject } from 'vue';
  11. export default {
  12. setup() {
  13. const message = inject('message');
  14. return { message };
  15. }
  16. }

Благодаря этим уникальным методам связи Vue 3 разработчики могут более гибко организовывать связь между компонентами и улучшать удобство сопровождения и возможность повторного использования кода.

Подведем итог

Vue 3 представляет Composition API, который обеспечивает новую гибкость и мощные функции для взаимодействия компонентов. Взаимодействие компонентов является ключом к созданию сложных пользовательских интерфейсов в интерфейсной разработке. Оно включает в себя передачу данных и запуск событий между родительскими и дочерними компонентами, родственными компонентами, а также компонентами-предками и потомками. Vue 3 предоставляет множество методов связи, включая традиционные реквизиты и отправку, а также новый API Provide/Inject, Teleport и Composition.

Рекомендуемая сопутствующая информация

Творить непросто. Если эта статья вам поможет, можете ли вы поставить мне лайк?