PortalVue может быть действительно полезной функцией и может сделать ваш проект более динамичным.

Знаете ли вы, что мы не можем использовать детский слот ребенка? Теперь ты знаешь. Но что, если у нас есть эта структура, и мы абсолютно обязаны это сделать? Что ж, есть решение.

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

К счастью, есть другое решение, которое может решить мою проблему.

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

Установка PortalVue

Во-первых, давайте установим PortalVue в нашем проекте и посмотрим, как его можно использовать вместо слотов в примерах чуть ниже:

npm install --save portal-vue

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

import PortalVue from 'portal-vue'

Vue.use(PortalVue)

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

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

Чтобы решить эту проблему, вы можете либо импортировать его непосредственно в компонент, либо импортировать его как компонент, но на глобальном уровне (лучшее решение).

В вашем main.js просто импортируйте его следующим образом:

import { Portal, PortalTarget } from 'portal-vue'
Vue.component('portal', Portal) 
Vue.component('portal-target', PortalTarget)

Используйте его как слот

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

Родительский > Дочерний (1) > Дочерний (2)

Это означает, что я хотел бы иметь слот в компоненте «Дочерний (2)» и передать его в компонент «Родительский».

Давай сделаем это.

// Child (2)
<template>
   <div>
     <portal-target name="content"/>
   </div>
</template>

В приведенном выше примере у нас есть компонент «Дочерний (2)», в котором мы хотели бы отобразить некоторый контент, который мы передадим в компонент «Родительский».

Для этого нам нужно использовать элемент "portal-target" и присвоить ему определенное имя.

Что ж, в компоненте Child (1) у нас будет просто импортированный Child (2).

<template>
  <div>
    <Child2/>
  </div>
<template>

Как видите, мы не передаем ему никаких реквизитов.

И в нашем Родительском компоненте у нас есть еще один новый элемент, "portal", в который мы должны передать имя "portal-target".

<template>
   <div>
   <portal to="content">
       <div>
          <p>Some content to display in Child (2)</p>
       </div>
   </portal>
</template>

Это почти все.

Заключение

PortalVue может быть действительно полезной функцией и может сделать ваш проект более динамичным. Лучшее в этом то, что вы можете передавать содержимое данных из ЛЮБОГО компонента в ЛЮБОЙ другой компонент из ВЕЗДЕ, даже если он не вложен. как ребенок.

Я надеюсь, что это было полезно для вас! Удачного кодирования! 🚀

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn и Discord.