portal-vue 在Vue中的使用

React与Vue的Portals机制
本文详细介绍了React中的Portals API,它允许子组件渲染到DOM中的任意位置,特别适用于对话框、hovercards等场景。同时,文章还介绍了如何在Vue中通过portal-vue库实现类似功能,包括安装配置及使用示例。

引文

使用过React的同学可能知道,在目前React的版本中可以找到一个叫Portals的相关API.
那么这Portals是用来干什么的? 下面看一下它的使用说明

Portals 提供了一种很好的将子节点渲染到父组件以外的 DOM 节点的方式。

第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或碎片。第二个参数(container)则是一个 DOM 元素。

React中的用法

通常讲,当你从组件的 render 方法返回一个元素,该元素仅能装配 DOM 节点中离其最近的父元素:

render() {
  // React mounts a new div and renders the children into it
  return (
    <div>
      {this.props.children}
    </div>
  );
}

然而,有时候将其插入到 DOM 节点的不同位置也是有用的:

render() {
  // React does *not* create a new div. It renders the children into `domNode`.
  // `domNode` is any valid DOM node, regardless of its location in the DOM.
  return ReactDOM.createPortal(
    this.props.children,
    domNode,
  );
}

对于 portal 的一个典型用例是当父组件有 overflow: hiddenz-index 样式,但你需要子组件能够在视觉上“跳出(break out)”其容器。例如,对话框、hovercards以及提示框:

注意:
记住这点非常重要,当在使用 portals时,你需要确保遵循合适的可访问性。

portal-vue 引入

在React中我们使用Portals来实现上文的需求,那么在Vue中如何实现上文的需求呢,经查验vue官网并没有提供portal相关的东西,于是便有了portal-vue这个库

portal-vue是什么?

简单来说PortalVue包含两个组件,portal组件和portal-target组件,他允许你将portal组件中的内容转至portal-target组件所在的地方.

更好的理解可以看官网的这句话
PortalVue is a set of two components that allow you to render a component’s template (or a part of it) anywhere in the document - even outside the part controlled by your Vue App!

安装配置
npm install --save portal-vue

# or with yarn
yarn add portal-vue
import PortalVue from 'portal-vue'

Vue.use(PortalVue)
portal-vue 这么用

下面简述几个例子

基本使用

<portal to="destination">
  <p>This slot content will be rendered wherever the <portal-target> with name 'destination'
    is located.
  </p>
</portal>

<portal-target name="destination">
  <!--
  This component can be located anwhere in your App.
  The slot content of the above portal component will be rendered here.
  -->
</portal-target>

在高级使用里面还可以进行配置以及与相关指令进行配合使用,其中动画、插槽也是可以根据需求来选择使用的.
portal-vue官网

### portal-vue使用教程 `portal-vue` 是一个功能丰富的 Vue 插件,允许开发者将组件渲染到 Vue 组件树之外的任意 DOM 节点中。它在 Vue 3 中支持 Composition API,并且兼容 Vue 2,适用于需要将内容(如模态框、提示框等)从当前组件上下文中“传送”到其他位置的需求[^3]。 #### 安装与引入 要开始使用 `portal-vue`,首先需要通过 npm 或 yarn 安装该库: ```bash npm install portal-vue # 或者 yarn add portal-vue ``` 然后,在你的主应用入口文件中(例如 `main.js`),引入并注册 `PortalVue` 插件: ```javascript import Vue from 'vue'; import PortalVue from 'portal-vue'; Vue.use(PortalVue); ``` 这样就可以在整个项目中使用 `<portal>` 和 `<portal-target>` 组件了[^2]。 #### 基本用法 `<portal>` 组件用于定义要“传送”的内容,而 `<portal-target>` 则是目标容器,即被传送内容最终渲染的位置。两者通过 `to` 属性进行绑定。 示例代码如下: ```vue <template> <div id="app"> <!-- PortalTarget 作为接收内容的“孔” --> <portal-target name="modal-target"></portal-target> <!-- Portal 包裹的内容将被传送到 PortalTarget 所在的位置 --> <portal to="modal-target"> <div class="modal"> <p>这是一个弹出窗口</p> </div> </portal> </div> </template> ``` 在这个例子中,`<portal>` 内部的 `<div>` 将不会渲染在其原始父节点内,而是会被移动到页面上 `<portal-target name="modal-target">` 所在的位置[^1]。 #### 高级特性 - **多层级嵌套**:可以在 `<portal>` 内部继续嵌套其他 `<portal>` 或 `<portal-target>`,以实现更复杂的布局结构。 - **跨组件通信**:由于 `portal` 渲染的内容仍然属于 Vue 实例的一部分,因此可以直接访问 `$router`、Vuex store 等全局对象,也可以通过事件传递数据。 - **过渡动画**:结合 Vue 的 `<transition>` 组件,可以为传送后的内容添加进入和离开动画效果。 示例:为传送内容添加淡入淡出动画 ```vue <template> <portal to="modal-target"> <transition name="fade"> <div v-if="isVisible" class="modal"> <p>带过渡动画的弹窗</p> </div> </transition> </portal> </template> ``` #### 注意事项 - **样式作用域问题**:当内容被传送到另一个 DOM 节点时,如果原组件使用了 `scoped` 样式,则这些样式可能不会生效。建议使用全局类名或 `<style>` 标签不加 `scoped` 来处理此类情况。 - **路由跳转与状态管理**:尽管内容被渲染到了组件树之外,但其逻辑仍处于 Vue 上下文中,因此可以直接调用 `$router.push()` 或操作 Vuex 状态[^4]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RI Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值