React第二十六章(createPortal)

server/2025/2/2 1:44:12/

createPortal

注意这是一个API,不是组件,他的作用是:将一个组件渲染到DOM的任意位置,跟Vue的Teleport组件类似。

用法

import { createPortal } from 'react-dom';const App = () => {return createPortal(<div>小满zs</div>, document.body);
};export default App;

参数

入参

  • children:要渲染的组件
  • domNode:要渲染到的DOM位置
  • key?:可选,用于唯一标识要渲染的组件

返回值

  • 返回一个React元素(即jsx),这个元素可以被React渲染到DOM的任意位置

应用场景

  • 弹窗
  • 下拉框
  • 全局提示
  • 全局遮罩
  • 全局Loading

例如 Antd 的 Modal 组件,就是挂载到 body 上的。

在这里插入图片描述

案例

封装弹框组件

  • src/components/Modal/index.tsx
import './index.css';
export const Modal = () => {return <div className="modal"><div className="modal-header"><div className="modal-title">标题</div></div><div className="modal-content"><h1>Modal</h1></div><div className="modal-footer"><button className="modal-close-button">关闭</button><button className="modal-confirm-button">确定</button></div></div>
}
  • src/components/Modal/index.css
.modal {position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 1px solid #4d4d4d;width: 500px;height: 400px;left: 50%;top: 50%;transform: translate(-50%, -50%);padding: 20px;border-radius: 5px;display: flex;flex-direction: column;justify-content: space-between;
}
.modal-header {display: flex;justify-content: space-between;align-items: center;
}
.modal-title {font-size: 1.5rem;font-weight: bold;
}
.modal-content {padding:20px 0;flex: 1;
}
.modal-footer {display: flex;justify-content: flex-end;
}
.modal-close-button {margin-right: 10px;background-color: #000;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;
}
.modal-confirm-button {margin-left: 10px;background-color:rgb(46, 46, 164);color: #fff;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;
}

基本的html + css 比较简单就不多说了,先看一下效果

在这里插入图片描述

如果外层有position: relative 的样式,那么弹框会相对于外层进行定位,如果外层没有position: relative 的样式,那么弹框会相对于body进行定位,故此这个Modal不稳定,所以需要使用createPortal来将Modal挂载到body上,或者直接将定位改成position: fixed,两种方案。

  • 方案一:使用createPortal
import './index.css';
import { createPortal } from 'react-dom';
export const Modal = () => {return createPortal(<div className="modal"><div className="modal-header"><div className="modal-title">标题</div></div><div className="modal-content"><h1>Modal</h1></div><div className="modal-footer"><button className="modal-close-button">关闭</button><button className="modal-confirm-button">确定</button></div></div>,document.body)
}
  • 方案二:使用position: fixed
.modal {position: fixed;top: 0;left: 0;width: 100%;height: 100%;border: 1px solid #4d4d4d;width: 500px;height: 400px;left: 50%;top: 50%;transform: translate(-50%, -50%);padding: 20px;border-radius: 5px;display: flex;flex-direction: column;justify-content: space-between;
}

这样的话,Modal 组件就稳定了,无论外层是否有 position: relative 的样式,Modal 组件都会相对于 body 进行定位。


http://www.ppmy.cn/server/164220.html

相关文章

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

python3+TensorFlow 2.x(四)反向传播

目录 反向传播算法 反向传播算法基本步骤&#xff1a; 反向中的参数变化 总结 反向传播算法 反向传播算法&#xff08;Backpropagation&#xff09;是训练人工神经网络时使用的一个重要算法&#xff0c;它是通过计算梯度并优化神经网络的权重来最小化误差。反向传播算法的核…

vue中的el是指什么

简介&#xff1a; 在Vue.js中&#xff0c;el指的是Vue实例的挂载元素。 具体来说&#xff0c;el是一个选项&#xff0c;用于指定Vue实例应该挂载到哪个DOM元素上。通过这个选项&#xff0c;Vue可以知道应该从哪个元素开始进行模板编译和渲染。它可以是一个CSS选择器字符串&…

AD电路仿真

目录 0 前言 仿真类型 仿真步骤 仿真功能及参数设置 仿真模型 应用优势 1 新建原理图 2 放置元器件及布线 3 放置探头 4 实验结果 Operating Point 分析的作用 DC Sweep 的主要功能 Transient Analysis 的主要功能 AC Analysis 的功能 5 总结 1. 直流工作点分析…

docker desktop使用ollama在GPU上运行deepseek r1大模型

一、安装docker 安装WSL打开Hyper V 可以参考&#xff1a;用 Docker 快速安装软件_哔哩哔哩_bilibili 二、拉取ollama镜像 在powershell中运行如下命令&#xff0c;即可拉取最新版本的ollama镜像&#xff1a; docker pull ollama/ollama 如果需要指定版本&#xff0c;可以…

【2024年华为OD机试】 (C卷,200分)- 矩阵匹配(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个大小为 ( N \times M )(( N \leq M ))的矩阵,从中选出 ( N ) 个数,要求任意两个数字不能在同一行或同一列。求选出来的 ( N ) 个数中第 ( K ) 大的数字的最小值。 输入描述 输入矩阵要求:( 1 \leq K \leq N \leq M \leq 150 )输入格式:…

CAP 定理的 P 是什么

分布式系统 CAP 定理 P 代表什么含义 作者之前在看 CAP 定理时抱有很大的疑惑&#xff0c;CAP 定理的定义是指在分布式系统中三者只能满足其二&#xff0c;也就是存在分布式 CA 系统的。作者在网络上查阅了很多关于 CAP 文章&#xff0c;虽然这些文章对于 P 的解释五花八门&am…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…