react18中的函数组件底层渲染原理分析

news2024/11/23 22:06:36

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.coloradmin.cn/o/2224072.html

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

相关文章

Kafka之消费者客户端

1、历史上的二个版本 与生产者客户端一样&#xff0c;在Kafka的发展过程当中&#xff0c;消费者客户端主要有两个大的版本&#xff1a; 旧消费者客户端&#xff08;Old Consumer&#xff09;&#xff1a;基于Scala语言开发的版本&#xff0c;又称为Scala消费者客户端。新消费…

【力扣】GO解决子序列相关问题

文章目录 一、引言二、动态规划方法论深度提炼子序列问题的通用解法模式 三、通用方法论应用示例&#xff1a;最长递增子序列&#xff08;LeetCode题目300&#xff09;Go 语言代码实现 四、最长连续递增序列&#xff08;LeetCode题目674&#xff09;Go 语言代码实现 五、最长重…

ffmpeg视频滤镜:定向模糊-dblur

滤镜简述 dblur 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#dblur 有一个模糊滤镜&#xff0c;我试了一下&#xff0c;没有感觉到它的特殊之处, 这里简单介绍一下。 滤镜使用 滤镜的参数 angle <float> ..FV.....T. set angle (from 0 t…

找不到包的老版本???scikit-learn,numpy,scipy等等!!

废话不多说 直接上链接了&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/https://pypi.tuna.tsinghua.edu.cn/simple/xxx/ 后面的这个xxx就是包的名字 大家需要什么包的版本&#xff0c;直接输进去就可以啦 举个栗子&#…

零基础Java第十期:类和对象(一)

目录 一、拜访对象村 1.1. 什么是面向对象 1.2. 面向对象与面向过程 二、类定义和使用 2.1. 类的定义格式 2.2. 类的定义练习 三、类的实例化 3.1. 什么是实例化 3.2. 类和对象的说明 四、this引用 4.1. 什么是this引用 4.2. this引用的特性 一、拜访对象村 在…

<项目代码>YOLOv8路面病害识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

STMicroelectronics意法半导体车规芯片系列--亿配芯城(ICgoodFind)

在汽车电子领域&#xff0c;意法半导体的车规级芯片系列一直备受瞩目。亿配芯城作为电子元器件领域的可靠供应商&#xff0c;为大家介绍意法半导体车规级芯片系列的卓越之处。 意法半导体在车规级芯片领域拥有深厚的技术积累和丰富的经验。 其车规级芯片涵盖了多个关键领域&am…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

【Java】常用方法合集

以 DemoVo 为实体 import lombok.Data; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;Data ExcelIgnoreUnannotated public class ExportPromoteUnitResult {private String id;ExcelProperty(value &qu…

贪心算法记录 - 下

135. 分发糖果 困难 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c…

一文搞懂指令周期,机器周期和时钟周期

如图&#xff1a; 指令周期 > 机器周期 > 时钟周期 指令周期&#xff1a;一个指令&#xff0c;从取值到执行的全部周期。一个指令执行过程包括取值&#xff0c;译码和执行阶段。 机器周期&#xff1a;,取指、间址、执行和中断等 时钟周期&#xff1a;时钟频率的倒数&am…

什么样的JSON编辑器才好用

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也便于机器解析和生成。随着互联网和应用程序的快速发展&#xff0c;JSON已经成为数据传输和存储的主要格式之一。在处理和编辑JSON数据…

python查询并安装项目所依赖的所有包

引言 如果需要进行代码的移植&#xff0c;肯定少不了在另一台pc或者服务器上进行环境的搭建&#xff0c;那么首先是要知道在已有的工程的代码中用到了哪些包&#xff0c;此时&#xff0c;如果是用人工去一个一个的代码文件中去查看调用了哪些包&#xff0c;这个工作甚是繁琐。…

推荐一款三维数值建模软件:3DEC

3DEC是一种用于土壤、岩石、地下水、结构支撑和砖石等高级岩土工程分析的三维数值建模软件。该软件的数值公式基于离散元法(DEM)进行不连续建模。UDEC是它的二维版本。不连续材料是一组离散的块。不连续性充当着块之间的边界条件。允许块的大位移和旋转。常见的结构可以直接从地…

HTML5教程(一)- 网页与开发工具

1. 什么是网页 网页 基于浏览器阅读的应用程序&#xff0c;是数据&#xff08;文本、图像、视频、声音、链接等&#xff09;展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…

Cout输出应用举例

Cout输出应用 在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <stdlib.h> //使能exit(); #include <sstream> #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和res…

根据用户选择的行和列数据构造数据结构(跨行跨列)

方案一 这段代码的功能是根据用户选择的行和列数据&#xff0c;生成一个适合复制粘贴的字符串表格。代码会先按列的 id 从小到大排序&#xff0c;再根据行列的选择关系将数据按顺序填入表格&#xff0c;每行之间使用换行符分隔&#xff0c;每列之间使用制表符分隔。如果某一行…

【汇编语言】第一个程序(一)—— 一个源程序从写出到执行的过程

文章目录 前言1. 第一步&#xff1a;编写汇编源程序2. 第二步&#xff1a;对源程序进行编译连接3. 第三步&#xff1a;执行可执行文件中的程序结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程…

多元线性回归【正规方程/sklearn】

多元线性回归【正规方程/sklearn】 1. 基本概念1.1 线性回归1.2 一元简单线性回归1.3 最优解1.4 多元线性回归 2. 正规方程求最优解2.1 线性回归的损失函数&#xff08;最小二乘法&#xff09;2.2 推导正规方程2.3 正规方程练习2.4 使用sklearn计算多元线性方程2.5 凸函数 3. 线…

比例数据可视化(Python实现板块层级图绘制)——Instacart Market Basket Analysis

【实验名称】 实验一&#xff1a;绘制板块层级图 【实验目的】 1. 掌握数据文件读取 2. 掌握数据处理的方法 3. 实现板块层级图的绘制 【数据介绍】Instacart Market Basket Analysis 1. 数据说明 数据共有300 0000orders&#xff0c; 20 0000users&#xff0c; …