首页 > 其他分享 >React - 04 函数组件的底层渲染机制

React - 04 函数组件的底层渲染机制

时间:2023-06-10 10:32:14浏览次数:59  
标签:函数 04 对象 Object React props 组件 属性

1.函数组件

创建:在SRC目录中,创建一个 xxx.jsx 的文件,就是要创建一个组件;我们在此文件中,创建一个函数,让函数返回JSX视图「或者JSX元素、virtualDOM虚拟DOM对象」;这就是创建了一个“函数组件”!! 调用:基于ES6Module规范,导入创建的组件「可以忽略.jsx后缀名」,然后像写标签一样调用这个组件即可!! ...

调用组件的时候,我们可以给调用的组件设置(传递)各种各样的属性

  • 如果设置的属性值不是字符串格式,需要基于“{}胡子语法”进行嵌套
  • 调用组件的时候,我们可以把一些数据/信息基于属性props的方式,传递给组件!!

渲染机制

@1 基于babel-preset-react-app把调用的组件转换为createElement格式

React.createElement(DemoOne, {
  title: "\u6211\u662F\u6807\u9898",
  x: 10,
  data: [100, 200],
  className: "box",
  style: {
    fontSize: '20px'
  }
})

@2 把createElement方法执行,创建出一个virtualDOM对象!!

{
  $$typeof: Symbol(react.element),
  key: null,
  props: {title: '我是标题', x: 10, data: 数组, className: 'box', style: {fontSize: '20px'}}, //如果有子节点「双闭合调用」,则也包含children!!
  ref: null,
  type: DemoOne
}

@3 基于root.render把virtualDOM变为真实的DOM

type值不再是一个字符串,而是一个函数了,此时:

  • 把函数执行 -> DemoOne()
  • 把virtualDOM中的props,作为实参传递给函数 -> DemoOne(props)
  • 接收函数执行的返回结果「也就是当前组件的virtualDOM对象」
  • 最后基于render把组件返回的虚拟DOM变为真实DOM,插入到#root容器中!!

2.属性props的处理

  • 调用组件,传递进来的属性是“只读”的「原理:props对象被冻结了」

Object.isFrozen(props) -> true

获取:props.xxx

修改:props.xxx=xxx =>报错

  • 作用:父组件(index.jsx)调用子组件(DemoOne.jsx)的时候,可以基于属性,把不同的信息传递给子组件;子组件接收相应的属性值,呈现出不同的效果,让组件的复用性更强!!
  • 虽然对于传递进来的属性,我们不能直接修改,但是可以做一些规则校验
  • 设置默认值

函数组件.defaultProps = {

x: 0,

......

};

  • 设置其它规则,例如:数据值格式、是否必传... 「依赖于官方的一个插件:prop-types」

https://github.com/facebook/prop-types

import PropTypes from 'prop-types';

函数组件.propTypes = {

// 类型是字符串、必传

title: PropTypes.string.isRequired,

// 类型是数字

x: PropTypes.number,

// 多种校验规则中的一个

y: PropTypes.oneOfType([

PropTypes.number,

PropTypes.bool,

])

};

传递进来的属性,首先会经历规则的校验,不管校验成功还是失败,最后都会把属性给形参props,只不过如果不符合设定的规则,控制台会抛出警告错误{不影响属性值的获取}!!

  • 如果就想把传递的属性值进行修改,我们可以:
  • 把props中的某个属性赋值给其他内容「例如:变量、状态...」
  • 我们不直接操作props.xxx=xxx,但是我们可以修改变量/状态值!!

React - 04 函数组件的底层渲染机制_react

3.扫盲知识点:关于对象的规则设置

  • 冻结

冻结对象:Object.freeze(obj)

检测是否被冻结:Object.isFrozen(obj) =>true/false

  • 被冻结的对象:不能修改成员值、不能新增成员、不能删除现有成员、不能给成员做劫持「Object.defineProperty」
  • 密封

密封对象:Object.seal(obj)

检测是否被密封:Object.isSealed(obj)

  • 被密封的对象:可以修改成员的值,但也不能删、不能新增、不能劫持!!
  • 扩展

把对象设置为不可扩展:Object.preventExtensions(obj)

检测是否可扩展:Object.isExtensible(obj)

  • 被设置不可扩展的对象:除了不能新增成员、其余的操作都可以处理!!

被冻结的对象,即是不可扩展的,也是密封的!!同理,被密封的对象,也是不可扩展的!!

标签:函数,04,对象,Object,React,props,组件,属性
From: https://blog.51cto.com/u_12207234/6454202

相关文章

  • 前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页
    前端vue简单好用的上拉加载下拉刷新组件,支持列表分页本地分页, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12942效果图如下:    ####使用方法```使用方法<!--pullDown:下拉刷新back-top:回到顶部 --><ccPullScro......
  • React - 03 JSX语法示例及JSX渲染机制
    1.根据变量控制元素显示/隐藏2种方式,方式1会渲染但不显示,方式2不会渲染元素2.循环列表渲染用数组的map方法,直接将要循环的元素返回如果数组的每个元素都是empty,则为稀疏数组,否则为密集数组,即使每个元素都是null也是密集数组3.JSX渲染机制第一步:把我们编写的JSX语法,编译为虚拟DOM对......
  • Python使用tkinter的Treeview组件实现表格功能
    fromtkinterimportTk,Scrollbar,Framefromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使......
  • 004Arch的Docker卸载
    链接:Arch下面安装docker-Docker安装手册-docker中文社区Arch下面删除Docker删除Docker包。sudopacman-Rdocker删除Docker包,同时删除其依赖的包。sudopacman-Rnsdocker删除Docker运行过程中产生的镜像、容器等文件。用户生成的配置文件需要手工删除。r......
  • Ubuntu22.04更换阿里源的方法
    1、系统信息root@ubuntu2204test01:~#lsb_release-aNoLSBmodulesareavailable.DistributorID:UbuntuDescription:Ubuntu22.04LTSRelease:22.04Codename:jammy   2、进入/etc/apt/目录:root@ubuntu2204test01:~#cd/etc/apt/......
  • Python+tkinter动态创建与销毁组件小案例
    本文代码演示了如何在tkinter窗体上动态创建组件以及销毁组件的方法。importtkinterimporttkinter.messageboximporttkinter.simpledialogbtnList=[]#动态创建组件,并计算组件在窗体上的位置defplace(n):foriinrange(n):exec('btn'+str(i)+'=tkinter.B......
  • Python使用tkinter组件Label显示简单数学公式
    任务描述:使用Python+tkinter编写GUI程序界面,使用Label组件显示简单数学公式。参考代码:运行效果:......
  • Python+tkinter动态显示与隐藏窗口上的组件
    使用Python+tkinter创建应用程序窗口,根据需要动态显示和隐藏特定的组件。可能的应用场景:多个相似的功能共用同一个窗口,根据标志位来控制需要隐藏和显示哪些组件。如果整个界面在完成某个功能时完全不需要显示某个组件,也可以根据标志位的不同选择性地执行组件的place()方法。参考代......
  • 代码随想录算法训练营第十七天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404
    110.平衡二叉树力扣题目链接(opensnewwindow)给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树[3,9,20,null,null,15,7]返回true。示例2:给定二叉树[1,2,2,3,3,nu......
  • React技术栈
    React技术栈分享React、Redux和ReactRouter是当前前端开发中非常常用的技术栈组件,而他们之间的结合则可以带来更加强大和灵活的开发能力。本文将为大家分享使用React、Redux和ReactRouter的经验。首先,我们需要知道这三个技术组件的作用以及如何结合使用。React是一个......