【React系列】Portals、Fragment

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5MDAzNzkwNA==&action=getalbum&album_id=1566025152667107329)

Portals

某些情况下,我们希望渲染的内容独立于父组件,甚至是独立于当前挂载到的DOM元素中(默认都是挂载到idroot的DOM元素上的)。

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案:

ReactDOM.createPortal(child, container)
  • 第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 fragment
  • 第二个参数(container)是一个 DOM 元素;

通常来讲,当你从组件的 render 方法返回一个元素时,该元素将被挂载到 DOM 节点中离其最近的父节点:

render() {// React 挂载了一个新的 div,并且把子元素渲染其中return (<div>      {this.props.children}</div>  );
}

然而,有时候将子元素插入到 DOM 节点中的不同位置也是有好处的:

render() {// React 并*没有*创建一个新的 div。它只是把子元素渲染到 `domNode` 中。// `domNode` 是一个可以在任何位置的有效 DOM 节点。return ReactDOM.createPortal(this.props.children,domNode  );
}

比如说,我们准备开发一个 Modal 组件,它可以将它的子组件渲染到屏幕的中间位置:

步骤一:修改index.html添加新的节点

<div id="root"></div>
<!-- 新节点 -->
<div id="modal"></div>

步骤二:编写这个节点的样式:

#modal {position: fixed;left: 50%;top: 50%;transform: translate(-50%, -50%);background-color: red;
}

步骤三:编写组件代码

import React, { PureComponent } from 'react';
import ReactDOM from 'react-dom';class Modal extends PureComponent {constructor(props) {super(props);}render() {return ReactDOM.createPortal(this.props.children,document.getElementById("modal"))}
}export default class App extends PureComponent {render() {return (<div><Modal><h2>我是标题</h2></Modal></div>)}
}

第三方库中的Modal,如AntDesign,通常都是通过主动创建一个divdocument.createElement),然后调用ReactDOM.render()方法来渲染到自己创建的div上的。

Fragment

在之前的开发中,我们总是在一个组件中返回内容时包裹一个div元素:

export default class App extends PureComponent {render() {return (<div><h2>当前计数: 0</h2><button>+1</button><button>-1</button></div>)}
}

在这里插入图片描述
我们会发现多了一个div元素:

  • 这个div元素对于某些场景是需要的(比如我们就希望放到一个div元素中,再针对性设置样式)
  • 某些场景下这个div是没有必要的,比如当前这里我可能希望所有的内容直接渲染到root中即可;

我们可以删除这个div吗?

在这里插入图片描述

我们又希望可以不渲染这样一个div应该如何操作呢?

  • 使用Fragment
  • Fragment 允许你将子列表分组,而无需向 DOM 添加额外节点;
    在这里插入图片描述

React还提供了Fragment的段语法:

  • 它看起来像空标签 <> </>
export default class App extends PureComponent {render() {return (<><h2>当前计数: 0</h2><button>+1</button><button>-1</button></>)}
}

但是,如果我们需要在Fragment中添加key,那么就不能使用段语法:

{this.state.friends.map((item, index) => {return (<Fragment key={item.name}><div>{item.name}</div><div>{item.age}</div></Fragment>)})
}

这里是不支持如下写法的:

<key={item.name}><div>{item.name}</div><div>{item.age}</div>
</>

StrictMode

StrictMode 是一个用来突出显示应用程序中潜在问题的工具。

  • Fragment 一样,StrictMode 不会渲染任何可见的 UI;
  • 它为其后代元素触发额外的检查和警告;
  • 严格模式检查仅在开发模式下运行;它们不会影响生产构建;

可以为应用程序的任何部分启用严格模式:

import React from 'react';function ExampleApplication() {return (<div><Header /><React.StrictMode><div><ComponentOne /><ComponentTwo /></div></React.StrictMode><Footer /></div>);
}
  • 不会对 HeaderFooter 组件运行严格模式检查;
    但是,ComponentOneComponentTwo 以及它们的所有后代元素都将进行检查;

但是检测,到底检测什么呢?

  1. 识别不安全的生命周期:
class Home extends PureComponent {UNSAFE_componentWillMount() {}render() {return <h2>Home</h2>}
}

在这里插入图片描述
2. 使用过时的 ref API

class Home extends PureComponent {UNSAFE_componentWillMount() {}render() {return <h2 ref="home">Home</h2>}
}

在这里插入图片描述

  1. 使用废弃的findDOMNode方法

在之前的React API中,可以通过findDOMNode来获取DOM,不过已经不推荐使用了,可以自行学习演练一下

  1. 检查意外的副作用
class Home extends PureComponent {constructor(props) {super(props);console.log("home constructor");}UNSAFE_componentWillMount() {}render() {return <h2 ref="home">Home</h2>}
  • 这个组件的constructor会被调用两次;
  • 这是严格模式下故意进行的操作,让你来查看在这里写的一些逻辑代码被调用多次时,是否会产生一些副作用;
  • 在生产环境中,是不会被调用两次的;
  1. 检测过时的context API

早期的Context是通过static属性声明Context对象属性,通过getChildContext返回Context对象等方式来使用Context的;

目前这种方式已经不推荐使用,大家可以自行学习了解一下它的用法;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU连通域分析方法

第1章连通域分析方法 连通域分析方法用于提取图像中相似属性的区域&#xff0c;并给出区域的面积&#xff0c;位置等特征信息。分为两种&#xff0c;基于游程&#xff08;Runlength&#xff09;&#xff0c;和基于标记(Label)。 基于游程的方法&#xff0c;按照行对图像进行游…

3D Gaussian Splatting复现

最近3D Gaussian Splatting很火&#xff0c;网上有很多复现过程&#xff0c;大部分都是在Windows上的。Linux上配置环境会方便简单一点&#xff0c;这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译&#xff0c;建议看这个up主的视频配置&#xff0c;讲解的很细…

[算法与数据结构][python]:Python参数传递,“值传递”还是“引用传递“?

Python中的函数参数传递方式是“传对象引用”&#xff0c;可以理解为“值传递”和“引用传递”的混合体。 在Python中&#xff0c;所有的数据类型都是对象。如果函数参数是不可变对象&#xff08;如整数、字符串、元组&#xff09;&#xff0c;那么传递的就是对象的值&#xf…

695岛屿最大面积

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…

逻辑回归简单案例分析--鸢尾花数据集

文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证&#xff08;Cross Validation&#xff09;来验证分类器性能2.1.6 完整代码&#xf…

malloc calloc 与 realloc

malloc 原型 void *malloc(size_t size);size字节为单位&#xff0c;保持原数据&#xff0c;不做初始化。 calloc 原型 void *calloc(size_t n, size_t size);分配n*size 字节数 初始化为零。 realloc 原型 void *realloc (void *ptr, size_t size)扩容&#xff0c;重新分配…

JavaWeb 里的Vue,Springboot,Mvc,Servlet,JSP,SSM都是什么?

在Java Web开发中&#xff0c;使用一系列技术和框架可以构建强大、高效的Web应用程序。在这个领域&#xff0c;一些关键的技术包括Vue.js、Spring Boot、MVC、Servlet、JSP以及SSM&#xff08;Spring Spring MVC MyBatis&#xff09;。本文将对这些技术进行详细解释&#xff…

copilot插件全解

COPILOT是一个基于AI的编程辅助工具&#xff0c;它可以帮助程序员自动编写代码&#xff0c;提高开发效率。COPILOT的插件主要是为了将其功能集成到不同的编程环境中&#xff0c;方便程序员使用。 目前&#xff0c;COPILOT支持多种编程环境&#xff0c;包括Visual Studio Code、…

钉钉审批流程解读

组织机构 部门 部门可以创建下级部门部门可以设置部门主管&#xff0c;可以是多人部门可以默认构建&#xff0c;沟通群可以设置部门信息&#xff0c;比如电话、简介可以设置部门的可见性&#xff0c;比如隐藏本部门&#xff0c;本部门将不会在组织机构、搜索&#xff0c;个人…

怎么让视频进行加速处理并保存

要加速处理视频并保存&#xff0c;可以使用专业的视频编辑软件或者一些在线工具。以下是一种常见的方法&#xff0c;使用FFmpeg这个开源工具。请确保你已经安装了FFmpeg。 打开命令行界面&#xff1a; 打开终端或命令提示符窗口。 使用以下命令进行视频加速处理&#xff1a; f…

如何从格式化的 Windows 和 Mac 电脑硬盘恢复文件

格式化硬盘可为您提供全新的体验。它可以是硬盘驱动器定期维护的一部分&#xff0c;是清除不再使用的文件的一种方法&#xff0c;在某些情况下&#xff0c;它是处理逻辑损坏的万福玛利亚。但是&#xff0c;许多用户发现自己格式化了错误的分区或驱动器&#xff0c;或者后来意识…

c语言-指针进阶

文章目录 前言一、字符指针二、数组指针2.1 数组指针基础2.2 数组指针作函数参数 总结 前言 在c语言基础已经介绍过关于指针的概念和基本使用&#xff0c;本篇文章进一步介绍c语言中关于指针的应用。 一、字符指针 字符指针是指向字符的指针。 结果分析&#xff1a; "ab…

Java中常见的设计模式及其实际应用

在软件开发中&#xff0c;设计模式是重要的指导原则&#xff0c;它们提供了解决特定问题的可重用方案。Java作为一种强大的编程语言&#xff0c;广泛应用了许多设计模式。让我们深入探讨几种常见的设计模式&#xff0c;并展示它们在实际Java应用中的用例。 1. 单例模式 (Singl…

elementui loading自定义图标和字体样式

需求&#xff1a;页面是用了很多个loading&#xff0c;需要其中有一个字体大些&#xff08;具体到图标也一样的方法&#xff0c;换下类名就行&#xff09; 遇见的问题&#xff1a;改不好的话会影响其他的loading样式&#xff08;一起改变了&#xff09; 效果展示 改之前 改之…

使用conda管理Python虚拟环境

标题&#xff1a;使用conda管理Python虚拟环境 摘要&#xff1a;本文将介绍如何使用conda工具创建、查看和删除Python虚拟环境。通过使用conda&#xff0c;我们可以轻松地在不同的项目中使用不同的Python版本和依赖库&#xff0c;避免不同项目之间的冲突。 一、简介 Python是…

使用 Kafka 和 CDC 将数据从 MongoDB Atlas 流式传输到 SingleStore Kai

SingleStore 提供了变更数据捕获 (CDC) 解决方案&#xff0c;可将数据从 MongoDB 流式传输到 SingleStore Kai。在本文中&#xff0c;我们将了解如何将 Apache Kafka 代理连接到 MongoDB Atlas&#xff0c;然后使用 CDC 解决方案将数据从 MongoDB Atlas 流式传输到 SingleStore…

IDEA好用插件

CodeGlance Pro 右侧代码小地图 Git Commit Template git提交信息模板 IDE Eval Reset 无限试用IDEA Maven Helper 图形化展示Maven项 One Dark theme 好看的主题 SequenceDiagram 展示方法调用链 Squaretest 生成单元测试 Translation 翻译 Lombok lombok插件…

【开题报告】基于JavaWeb的年货销售系统的设计与实现

1.选题背景 年货销售是中国传统文化的一部分&#xff0c;也是中国人过年必备的习俗之一。随着互联网的发展&#xff0c;越来越多的人选择在网上购买年货&#xff0c;以节省时间和精力。为了满足人们对年货的购买需求&#xff0c;设计一个基于JavaWeb的年货销售系统具有重要意义…

leecode | 829连续整数求和

给一个整数n 求连续整数的和等于n 的个数 这道题 是一个数论的思想 解决思路&#xff1a; 数必须是连续的&#xff0c;可以转化成一个通用的公式&#xff0c;以101为例做一般性推导&#xff0c;&#xff1a; 101 &#xff1d; 101 &#xff1d; 50 &#xff0b; 51 &#xff1d…

AQS原来是这么设计的,泰裤辣!

缘起 每门编程语言基本都离不开并发问题&#xff0c;Java亦如此。谈到Java的并发就离不开Doug lea老爷子贡献的juc包&#xff0c;而AQS又是juc里面的佼佼者 因此今天就一起来聊聊AQS 概念 AQS是什么&#xff0c;这里借用官方的话 Provides a framework for implementing blo…