react、vue 把要渲染的元素挂到指定节点。

react、vue 把要渲染的元素挂到指定节点。

  • 在日常工作中,需要封装一些定制的浮动模态框,但是每个弹框在不同的父级元素中,那弹框的层级我们是没有办法控制到的,所有有必要把它统一放在同一个父元素下面,这样就可以方便的设置层级关系了。
  • 在不同的父元素中还有可能受到父元素的样式影响,例如:带有 overflow: hidden 父组件、元素祖先的 transform 属性非 none 时,定位容器由视口改为该祖先。 【如果元素的 transform 值不为 none,则该元素会生成包含块和层叠上下文原文介绍】

vue3 的 Teleport

  • vue2 没有提供此内置组件。
  • <Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。
  • 简单示例代码如下:
// 创建CustomModal.vue 文件
<template>
    <Teleport to="body">
        <div class="custom-modal">
            <!-- 自定义插槽 -->
            <solt></solt>
            <span>测试</span>
        </div>
    </Teleport>
</template>

<style>
.custom-modal {
    position: fixed;
    top: 50%;
    left: 50%;
    width: 295px;
    height: 295px;
    transform: translate(-50%, -50%);
    padding: 20px 30px;
    background: #ffffff;
    border-radius: 0px 2px 2px 0px;
    border: 1px solid #ccc;
}
</style>

// 其它组件 引入上面组件展示效果
<div>
  <CustomModal />
</div>
  • 如图:在这里插入图片描述

react 的 createPortal

  • createPortal() 是 React 提供的一种创建 portal 的方法,它允许你将子组件渲染到 DOM 树中的不同位置,而不受父组件的限制。
  • createPortal() 函数的兼容性取决于 React 的版本和目标浏览器。通常来说,createPortal() 是自 React 16.0 版本引入的,因此如果你使用的 React 版本是 16.0 或更高,那么 createPortal() 应该是支持的。
  • 在使用 createPortal() 时,建议查阅 React 官方文档以及浏览器兼容性列表,以确保你的应用在目标平台上能够正常工作。
  • 简单示例代码如下:
//创建 index.css文件

.custom-modal {
    position: fixed;
    top: 50%;
    left: 50%;
    width: 295px;
    height: 295px;
    transform: translate(-50%, -50%);
    padding: 20px 30px;
    background: #ffffff;
    border-radius: 0px 2px 2px 0px;
    border: 1px solid #ccc;
}

// 创建CustomModal.tsx 文件
import React, { FC } from 'react';
import ReactDOM from 'react-dom';
import "./index.css"

const CustomModal: FC<any> = ({ children }) => {
    return ReactDOM.createPortal(
        <div className="custom-modal">
            {children}
            <span>测试</span>
        </div>,
        document.body,
    );
};
export default CustomModal;

// 其它组件 引入上面组件展示效果
<div>
  <CustomModal />
</div>

  • 如图:在这里插入图片描述

有疑问的同学可以私信我、对帮助到同学欢迎大家收藏评论。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值