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中
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

Nestjs请求处理顺序

刚接触Nestjs的小白不知道Nestjs的请求处理顺序的话&#xff0c;这会非常使得咱们服务端不好使用。 下面是请求处理顺序图&#xff1a; 总结&#xff1a; 守卫&#xff08;Guards&#xff09; 守卫是请求处理的第一层&#xff0c;用于确定请求是否应该继续处理。它们通常用于身…

Detectron2和LSTM进行人体动作识别

1. 项目简介 本项目旨在开发一个人体动作识别系统&#xff0c;利用深度学习模型Detectron2和LSTM&#xff08;长短时记忆网络&#xff09;实现对视频中人体动作的精确识别与分类。项目背景是由于在现代智能监控、健康管理、体育分析等领域中&#xff0c;对人体动作的自动识别和…

旧电脑安装Win11提示“这台电脑当前不满足windows11系统要求”,安装中断。怎么办?

前言 最近有很多小伙伴也获取了LTSC版本的Win11镜像&#xff0c;很大一部分小伙伴安装这个系统也是比较顺利的。 有顺利安装完成的&#xff0c;肯定也有安装不顺利的。这都是很正常的事情&#xff0c;毕竟这个镜像对电脑硬件要求还是挺高的。 有一部分小伙伴在安装Windows11 …

C++对象模型:关于对象

C语言和C对比 ⭐ 关联知识点&#xff1a;C和C语言区别 &#xff08;1&#xff09;C 语言的特点 简洁与高效&#xff1a;C 语言被设计为一种系统级的编程语言&#xff0c;它提供了对硬件的直接访问能力&#xff0c;并且编译后的代码通常非常紧凑&#xff0c;运行效率高。 全…

Java SnakeYaml 反序列化漏洞原理

目录 SnakeYaml 使用 SnakeYAML 序列化与反序列化 SnakeYAML 序列化实现 SnakeYAML 反序列化实现 SnakeYaml 反序列化漏洞 基于 ScriptEngineManager 利用链 漏洞原因分析 SPI 服务提供者发现机制 命令执行 漏洞修复 SnakeYaml SnakeYAML 是一个用于 Java 语言的 YA…

面试题:JVM(一)

1. JVM概述 1.1 JVM的生命周期 说说Java虚拟机的生命周期&#xff08;阿里&#xff09; 虚拟机的启动 Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的&#xff0c;这个类是由虚拟机的具体实现指定的。 虚拟机的退出有如下…

接口测试(九)jmeter——关联(JSON提取器)

一、JSON提取器介绍 要检查的响应字段&#xff1a;样本数据源引用名称&#xff1a;可自定义设置引用方法&#xff1a;${引用变量名}匹配数字 匹配数字含义-1表示全部0随机1第一个2第二个…以此类推 缺省值&#xff1a;匹配失败时的默认值ERROR&#xff0c;可以不写 二、js…

2024年双十一有什么好物推荐?盘点2024双十一爆款好物分享

第一款&#xff1a;希亦ACE内衣洗衣机 一句话点评&#xff1a;常出口欧美等多个国家&#xff0c;被超百家专业媒体评为“洗护一体技术之王”&#xff0c;妇科细菌除菌率达99.99%&#xff0c;清洁度高达99.8%&#xff01; CEYEE希亦是清洁领域的实力大牌子了&#xff0c;也是母…

老照片如何修复变清晰?手把手教你4种模糊照片变清晰方法!

在洋溢着温情的生日聚会上&#xff0c;家人们围坐一堂&#xff0c;总会情不自禁地翻阅那些尘封已久的老照片&#xff0c;一同沉醉于往昔的温情岁月。然而&#xff0c;时光荏苒&#xff0c;许多承载着深情厚意的照片已变得泛黄、模糊&#xff0c;难以再现昔日的清晰与鲜活。但请…

vue2 a-input输入框使用正则限制为数字、英文及中文,出现吞字符和英文字符打断问题

需求是输入框限制数字、英文和中文&#xff0c;原始使用的正则是&#xff1a; replace(/[^a-zA-Z0-9\u4E00-\u9FA5]/g,)1、使用这个正则表达式使用搜狗输入法没问题&#xff0c;使用微软自带输入法后会存在输入英文会吞并当前光标前的字符&#xff0c;也有英文打断问题。 输入…

2024年【制冷与空调设备安装修理】考试及制冷与空调设备安装修理最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备安装修理考试参考答案及制冷与空调设备安装修理考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备安装修理操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备安装修理最新解…

线上遇到的问题记录(说多了都是泪)

写在前面 我觉得&#xff0c;工作中最有价值的就是及遇到的问题了&#xff0c;特别时线上这种容易让人血压升高的环境中遇到的问题&#xff0c;本文就是记录这些血压升高时刻。 如果你遇到什么真实环境的问题&#xff0c;也欢迎评论或者私信分享给我&#xff01;&#xff01;&…

Angular 保姆级别教程高阶应用 - RxJs

RxJS 13.1.1 什么是 RxJS ? RxJS 是一个用于处理异步编程的 JavaScript 库&#xff0c;目标是使编写异步和基于回调的代码更容易。 13.1.2 为什么要学习 RxJS ? 就像 Angular 深度集成 TypeScript 一样&#xff0c;Angular 也深度集成了 RxJS。 服务、表单、事件、全局状…

经典功率谱估计的原理及MATLAB仿真(自相关函数BT法、周期图法、bartlett法、welch法)

经典功率谱估计的原理及MATLAB仿真&#xff08;自相关函数BT法、周期图法、bartlett法、welch法&#xff09; 文章目录 前言一、BT法二、周期图法三、Bartlett法四、welch法五、MATLAB仿真六、MATLAB详细代码总结 前言 经典功率谱估计方法包括BT法&#xff08;对自相关函数求傅…

基于Java的就业信息管理系统源码带本地搭建教程

技术框架&#xff1a;jQuery MySQL5.7 mybatis shiro Layui HTML CSs JS 运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 宝塔面板 实现了就业信息管理、就业统计、用户管理等功能。有普通用户和管理员两种角色。

开源限流组件分析(三):golang-time/rate

文章目录 本系列前言提供获取令牌的API数据结构基础方法tokensFromDurationdurationFromTokensadvance 获取令牌方法reverseN其他系列API 令人费解的CancelAt是bug吗 取消后无法唤醒其他请求 本系列 开源限流组件分析&#xff08;一&#xff09;&#xff1a;juju/ratelimit开源…

智能AI监测系统燃气安全改造方案的背景及应用价值

随着燃气行业的迅速发展和城市化进程的加快&#xff0c;燃气安全管理成为企业运营和城市管理中不可忽视的关键领域。燃气泄漏、管道破损等事故的发生不仅会造成严重的经济损失&#xff0c;还威胁到人民生命财产安全。传统的安全管理方法往往依赖人工巡检和手动监测&#xff0c;…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》&#xff0c;有朋友问光代码和文字不太真切&#xff0c;能否补充几张图片&#xff0c;今天我们演示一下&#xff1a; 这是第一帧画面&#xff1a;P1&#xff08;我们的参考帧&#xff09; 这是第二帧画面&#xff1a;P2&#xff08;需要编码的帧&…

C2W4.LAB.Word_Embedding.Part2

理论课&#xff1a;C2W4.Word Embeddings with Neural Networks 文章目录 Training the CBOW modelForward propagationInitialization of the weights and biasesTraining exampleValues of the hidden layerValues of the output layerCross-entropy loss BackpropagationGr…

大家都在用的HR招聘管理工具:国内Top5排名

招聘管理工具是专为HR及招聘团队设计的数字化助手&#xff0c;旨在简化招聘流程&#xff0c;提高效率。众所周知&#xff0c;招聘管理工具通常集成简历收集、筛选、面试安排、候选人跟踪等功能于一体&#xff0c;让招聘过程更加流畅。使用招聘管理工具&#xff0c;不仅能节省时…