react18中的函数组件底层渲染原理分析
react 中的函数组件底层渲染原理
react组件没有局部与全局之分,它是一个整体。这点跟vue的组件化是不同的。- 要实现 react 中的全局组件,可以将组件挂在
react上,这样只要引入了react,就可以直接使用该组件。

函数式组件的创建
- 创建一个函数,函数中返回一个
jsx或者jsx元素,virtualdom。 - 基于 es6 的模块导入导出方式,将函数作为模块的导出.可以忽略后缀名。
<Component />
<Component>...</Component>
- 命名:首字母大写,大驼峰命名。小写字母开头,编译器会认为这是一个标签,编译器也会报错。



关于 props 属性的细节知识
- 函数组件不能使用
this关键字。 - 函数组件不能使用生命周期钩子。
- 子组件的
props属性,不能直接修改。 - 获取子组件的
props属性,需要使用props.xxx。
对象的冻结,密封和不可扩展
- 被冻结的对象,不能添加、删除或修改其属性。也不能劫持对象。
Object.defineProperty方法不能修改这些属性。Object.isFrozen方法用来检测对象是否被冻结。 - 被密封的对象的属性,可以修改值,但是不能添加、删除。但不能劫持对象。
Object.isSealed方法用来检测对象是否被密封。 - 不可扩展的对象,除了不能新增成员,其他操作都正常。
Object.isExtensible方法用来检测对象是否可以扩展。
总结: 被冻结的对象,既是不可扩展的,也是密封的。被密封的,也是不可扩展的。
所以,我们在组件内部修改props属性时,需要先拷贝一份,然后才能修改。否则会报错。
组件的默认值
- 函数组件.
defaultProps属性,可以设置组件的默认值。
function Jsx({ name }) {return (<div>Jsx<hr /><p>{name}</p></div>);
}Jsx.defaultProps = { name: "zs22222222" };
export default Jsx;

函数的类型校验
- 函数组件.
propTypes属性,可以设置组件的默认值。 需要我们安装prop-types库。
跟Component组件一样,需要使用import导入。
import PropTypes from "prop-types";
Child.defaultProps = { name: "zs22222222", age: 18 };
Child.propTypes = {name: PropTypes.string,age: PropTypes.oneOfType([PropTypes.number.isRequired,PropTypes.string,PropTypes.bool,]),
};
函数组件中的插槽处理
-
插槽的作用,就是将父组件中的内容,原封不动的传递给子组件。想办法让组件更加灵活,具有更强的复用性
-
数据值用属性
-
html 片段用插槽


-
children 属性,传递子组件的
jsx元素,是数组的情况下,要使用下面的方式来接收,也可以使用React.Children里面的方法来进行处理


-
插槽内容可以根据不同的需求,放到不同的位置。

-
静态组件和动态组件
function Vote() {function handleSubmit() {}function handleCancel() {}return (<div className="vote-box"><div className="header"><h2 className="title">标题</h2><span>15人</span></div><div className="main"><p>支持人数: 10人</p><p>反对人数: 5人</p></div><div className="footer"><button onClick={handleSubmit} className="btn btn-primary">支持</button><button onClick={handleCancel} className="btn btn-danger">反对</button></div></div>);
}
export default Vote;
-
第一次渲染组件,执行函数,产生一个私有的上下文,把解析出来的
props包括children属性,保存到上下文,并冻结了props属性,不可修改。返回一个jsx元素的vdom。渲染jsx元素,生成virtualdom。 -
当我们点击按钮,再次渲染组件时
修改上下文中的变量,私有作用于发生了变化,但是视图不会更新。所以称为静态组件。
除非在父组件中,修改了子组件的props属性,才会重新渲染。 -
动态组件:实际项目中,我们会遇到在第一次渲染组件完成后,需要基于组件内部的状态变化,让组件可以更新,以呈现出不同的页面效果。 ====> 动态组件(
class组件,hooks组件) -
2、 初始化状态
状态:后期修改状态,可以触发视图的更新
需要手动初始化,如果我们没有去做相关的处理,则默认会往实例上挂载一个state,初始值是null =>this,state=null
手动处理:
state = {xxx:xxx
}
修改状态,控制视图更新this.state.xxx=xxx :这种操作仅仅是修改了状态值,但是无法让视图更新想让视图更新,我们需要基于React.Component.prototype提供的方法操作:「推荐」
- 1
this.setstate(partialstate)既可以修改状态,也可以让视图更新 partialstate:部分状态
this.setstate({xxx:xxx
})
- 2
this.forceUpdate()强制更新


forceUpdate在类组件中生效的使用方法,当你必须使用这个api页面才更新的时候,说明你的业务代码中就已经出现了问题了。如果我们是基于 this.forceUpdate()强制更新视图,会跳过 shouldcomponentUpdate 周期函数的校验,直接从willUpdate开始进行更新,这时视图就一定会更新。
import { Component } from "react";
class Vote extends Component {state = {oppPerson: 0,aggPerson: 0,};handleSubmit() {}handleCancel = () => {this.state.oppPerson++; //这种使用是不对的,this.forceUpdate();};render() {const { oppPerson, aggPerson } = this.state;return (<div className="vote-box"><div className="header"><h2 className="title">标题</h2><span>15人</span></div><div className="main"><p>支持人数: {aggPerson}人</p><p>反对人数: {oppPerson}人</p></div><div className="footer"><button onClick={this.handleSubmit} className="btn btn-primary">支持</button><button onClick={this.handleCancel} className="btn btn-danger">反对</button></div></div>);}
}
export default Vote;

父子组件的更新顺序
- vue中

- react中



相关文章:
react18中的函数组件底层渲染原理分析
react 中的函数组件底层渲染原理 react组件没有局部与全局之分,它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件,可以将组件挂在react上,这样只要引入了react,就可以直接使用该组件。 函数式组件的创建 …...
提升产品竞争力之--IPD产品成本篇
在汉捷的咨询过程中,很多企业老总交流时都会提起这个抱怨:“现在产品竞争太激烈了,客户买产品首先看价格,你价格高一点就买别家的啦……” 汉捷咨询在前文谈到“通过定义产品包需求,来提升产品竞争力。差异化开发&…...
如何在Debian操作系统上安装Docker
本章教程,主要介绍如何在Debian 11 系统上安装Docker。主要使用一键安装Docker脚本和一键卸载脚本来完成。 一、安装Docker #!/bin/bashRED\033[0;31m GREEN\033[0;32m YELLOW\033[0;33m BLUE\033[0;34m NC\033[0mCURRENT_DIR$(cd "$(dirname "$0")…...
ArrayList和Array、LinkedList、Vector 间的区别
一、ArrayList 和 Array 的区别 ArrayList 内部基于动态数组实现,比 Array(静态数组) 使用起来更加灵活: ArrayList 会根据实际存储的元素动态地扩容或缩容,而 Array 被创建之后就不能改变它的长度了。ArrayList 允许…...
Linux开发环境配置(下)
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿…...
系统开发常用命令合集
本文还会持续更新,大家可以点赞收藏~ ifconfig ifconfigwlan0表示无线网络接口 eth0表示以太网接口(有线) HWaddr是接口的物理地址(MAC地址) inet addr是接口的IPv4地址 Bcast是广播地址,Mask是子网掩码 …...
Termius工具在MAC的使用出现的问题:
Termius工具在MAC的使用出现的问题: 在使用SFTP时,出现不了本地的文件的位置 解决方案: 在Apple store下载的使用不了LOCAL SFTP, 需要在网页上进行下载才可以: 官网下载地址:https://termius.com/down…...
浅析Android中View的绘制流程
前言 在《浅析Android中View的测量布局流程》中分析了VSYNC信号到达App进程之后开启的View布局过程,经过对整个View树进行遍历进行测量和布局,最终确定View的大小以及在屏幕中所处的位置。但是如果用户想在屏幕上看到View的内容还需要经过绘制来生成图形…...
pikachu靶场- 文件上传unsafe upfileupload
pikachu靶场- unsafe upfileupload 概述client checkMIME typegetimagesize() 概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断…...
java中this的内存原理是?
在Java中,this关键字是一个特殊的引用,指向当前对象的实例。它在以下几个方面发挥重要作用: 指向当前对象:this可以用来访问当前对象的属性和方法,尤其在参数命名与实例变量重名时,用于区分。 构造函数&a…...
Matlab 车牌识别技术
1.1设计内容及要求: 课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…...
CUDA-求最大值最小值atomicMaxatomicMin
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 atomicMax和 atomicMin是 CUDA 中的原子操作,用于在并行计算中安全地更新共享变量的最大值和最小值。它们确…...
新的Midjourney就是一个增强版的Photoshop,你现在可以轻松的用它换衣服、换发型了
好久没有聊 Midjourney 了,昨晚他们发布了一项引人注目的新功能:AI 图像编辑,一个基于网页的加强版的 Photoshop 呼之欲出,让我大为震撼,也让用户们赞叹不已。 基于现有图像进行参考,进而生成新的图片&…...
Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】
一.源码安装 linux安装软件采用源码安装灵活自由,适用于不同的平台,维护也十分方便。 (一)源码安装流程 源码的安装一般由3个步骤组成: 1.配置(configure) Configure是一个可执行脚本…...
基于Spring Boot的洪涝灾害应急信息管理系统设计与实现
摘要 近年来,全球气候变化加剧,洪涝灾害频发,给各国的经济发展和人民生活带来了巨大的威胁。为了提高洪涝灾害的应急响应能力,开发高效的应急信息管理系统变得至关重要。本文基于Spring Boot框架,设计并实现了一个洪涝…...
912.排序数组(桶排序)
目录 题目解法 题目 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…...
IPC 进程间通信 消息队列
操作系统内核中采用一个链式队列管理消息,每个节点就对应一个消息: 操作系统规定了单个消息的数据长度不能超过8k(8192个字节),一个消息队列的表长(节点数)最多不超过256个 利用消息队列进行通信的特点: 1. 全双工:任何参与通信的…...
opencv 图像翻转- python 实现
在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下: #-*-coding:utf-8-*- # date:2021-03 # Author: DataBall - XIAN # Function: 图像翻转import cv2 # 导入OpenCV库path test.jpgimg cv2.imread(path)# 读取图片 cv2.namedWindow(image,1) …...
使用DolphinScheduler接口实现批量导入工作流并上线
使用DS接口实现批量导入工作量并上线脚本 前面实现了批量生成DS的任务,当导入时发现只能逐个导入,因此通过接口实现会更方便。 DS接口文档 DS是有接口文档的地址是 http://IP:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&lang…...
pycharm导出环境安装包列表
pycharm导出环境安装包列表 一、导出安装包列表二、安装requirements.txt三、列表显示已安装的包四、显示特定包的信息 一、导出安装包列表 pip freeze > requirements.txt二、安装requirements.txt pip install -r requirements.txt三、列表显示已安装的包 pip list四、…...
AI编程助手工程化实践:六大技能解决智能体记忆、验证与协作难题
1. 项目概述:从“玩具”到“工具”的智能体技能包如果你正在用 Claude Code、Codex 或者 OpenClaw 这类智能体来辅助编程,大概率经历过这样的挫败感:你让它改一个功能,它信誓旦旦地说“完成了”,结果你一跑测试&#x…...
如何轻松实现Windows风扇智能控制:5个关键技巧打造完美散热系统
如何轻松实现Windows风扇智能控制:5个关键技巧打造完美散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...
5分钟掌握ViGEmBus:Windows游戏控制器模拟终极指南
5分钟掌握ViGEmBus:Windows游戏控制器模拟终极指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款强大的Windows内核级驱动程序&…...
终极指南:使用LSLib专业工具进行《神界原罪》和《博德之门3》MOD开发
终极指南:使用LSLib专业工具进行《神界原罪》和《博德之门3》MOD开发 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib LSLib是一款功能强大的开源游戏MO…...
Switch大气层系统:从零开始掌握自定义固件的完整指南
Switch大气层系统:从零开始掌握自定义固件的完整指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层系统(Atmosphere)是任天堂Switch平台上最强大…...
SQL线索
插入insert into 表 (列) value (),(),...;从另一个表插入数据:insert into 表 (列) select 列 from 另一个表 where 限制;删除delete from 表 where 限制;子查询删:delete from 表 where 列 in (select 列 from 另一个表 where 限制);改update 表 set 列…...
LaTeX2Word-Equation:三步实现网页公式到Word的精准转换
LaTeX2Word-Equation:三步实现网页公式到Word的精准转换 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 在学术写作和文档编辑过程中…...
用MATLAB手把手复现CT图像重构:从原理到代码,避开R-L滤波器的Gibb‘s现象
MATLAB实战:CT图像重构中的滤波反投影与Gibbs现象规避指南 在医学影像处理领域,CT图像重构算法的实现质量直接影响诊断准确性。本文将带您深入滤波反投影法的核心原理,通过MATLAB代码实现全流程,并重点解决R-L滤波器导致的Gibbs现…...
深入Acid引擎架构:模块化设计与现代C++17的最佳实践指南
深入Acid引擎架构:模块化设计与现代C17的最佳实践指南 【免费下载链接】Acid A high speed C17 Vulkan game engine 项目地址: https://gitcode.com/gh_mirrors/ac/Acid Acid引擎是一个基于Vulkan API的高性能C17游戏引擎,采用先进的模块化架构设…...
把边界立起来,理解 ABAP Cloud 的几根主梁
项目里最让人头疼的时刻,往往不是写代码那天,而是系统升级后的那个早晨。很多团队都有过类似体验,业务明明没有改,几个增强点、几段直连标准表的逻辑、几次对未发布对象的调用,却在升级后一起冒烟。表面上看,这是兼容性问题,往深处看,其实是开发边界没有真正立起来。AB…...
