React18 函数组件的底层渲染机制与形参props的使用细节

news/2025/3/6 18:14:21/文章来源:https://www.cnblogs.com/jocelyn11/p/18755635

前言:
Vue中的组件开发:
1.全局组件和局部组件
2.函数组件和类组件(vue3不具备functional函数组件)
React中的组件化开发:
没有明确全局和局部的概念,可以理解为都是局部组件,不过可以把组件注册到React上,这样每个组件只要导入React中即可使用
1.函数组件
2.类组件
3.hooks组件:在函数组件中使用React Hooks函数

1.函数组件
创建:在src目录中,创建一个xxx.jsx的文件,即创建一个组件,在组件中创建一个函数,让函数返回JSX视图(jSX元素/virtualDOM虚拟DOM对象)。

调用:基于ES6Moudle规范,导入创建的组件,可以省去.jsx后缀,然后调用组件一样的方式使用,单标签或双标签都可以,双标签可以放置子节点,后续能被props接收。

import DemoFun from "@/views/demo";
// 基于render方法渲染编写的视图,把渲染后的内容全被插入到#root中进行渲染
const root = ReactDOM.createRoot(document.getElementById("root"));
//调用组件的时候,可以给调用的组件设置传递各种属性,非字符串格式则使用大胡子语法
root.render(<><DemoFun /><DemoFun title="demo" data={[100,200]} className="demo"> </DemoFun></>
);

渲染机制:

  1. 基于babel-preset-react-app把调用的组件转换为createElement格式
    React.createElement(DemoFun,{
    title: "demo",
    data: [100, 200],
    className: "demo",
    children: " "
    }
    //可以把标签丢进babel官网看看~

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

3)基于root.render把虚拟dom变成了真实的dom
当type是一个函数的时候,会执行函数 DemoFun,把virtualDOM中的props,作为实参传递给函数->DemoFun(props),接收函数执行的返回结果即当前组件的JSX视图,最后基于render把组件返回的虚拟DOM转为真实DOM,插入到#root容器中~

形参props在子组件中的使用细节

  1. 调用组件,传递的属性是只读的,原理使用Object.isFrozen(props)冻结了
    获取传递的参数值:通过点语法: props.xxx;
    直接修改则报错,一定要修改则可以先声明一个新的变量进行赋值后,修改新的变量的结果
    作用:父组件调用子组件的时候,可以基于属性,把信息传给子组件,子属性接收相应的属性值,呈现不同的效果,让组件的复用性更强~

2.直接修改是不行的,但是可以添加一些校验规则~
1)设置默认值:

2) 设置其他规则校验,是否必传、数据格式等。。。可使用prop-types插件
a)安装
b)引入:import PropTypes from "prop-types"
c)使用:

import PropTypes from "prop-types";
const DemoFun = (props) => {console.log(props,'props')return <div className="demo">I am demoone</div>;
};
DemoFun.defaultProps={x:0,title:'没有设置标题'
}
DemoFun.propTypes={title:PropTypes.string.isRequired,x:PropTypes.number
}
export default DemoFun;

常用的校验规则:
optionalArray: PropTypes.array,
optionalBool: PropTypes.bool,
optionalFunc: PropTypes.func,
optionalNumber: PropTypes.number,
optionalObject: PropTypes.object,
optionalString: PropTypes.string,
optionalSymbol: PropTypes.symbol,
官网
https://www.npmjs.com/package/prop-types

知识点补充:关于对象的规则设置
1)冻结:no修改、no新增、no删除、no劫持(Object.defineProperty)
冻结对象:Object.freeze(obj)
检测:Object.isFrozen(obj)
2) 密封:可改,no新增,no删除,no劫持
密封对象:Object.seal(obj)
检测:Object.isSealed(obj)
3) 不可拓展:only no新增,其余都可以处理
设为不可拓展对象:Object.preventExtensions(obj)
检测:Object.isExtensible(obj)

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

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

相关文章

c# 托管堆和垃圾回收的clr的控制

前言 简单讲述一下垃圾回收,我们能做的一些控制。 正文 强制回收 class Program {static void Main(){var str = new StringBuilder();var x = "";for (int i = 0; i < 500; i++){x += "xxxxxxxxsadasdasdsadsaewqeqczxcxzgsfaswqeqwrqwewqeasdasqweqwrqsda…

PHP调用redis消息队列案例

一、代码实例://需要成功引入并使用redis$redis = RedisManager::$redis;// 生产者:将订单加入队列(右端插入)function producer($orderId,$redis) { $redis->rPush(task_queue, $orderId); print_r("<br/>追加入列<br/>"); print_r($or…

redis消息队列案例

一、代码实例://需要成功引入并使用redis$redis = RedisManager::$redis;// 生产者:将订单加入队列(右端插入)function producer($orderId,$redis) { $redis->rPush(task_queue, $orderId); print_r("<br/>追加入列<br/>"); print_r($or…

conda创建虚拟环境并安装tensorflow-gpu

conda创建虚拟环境并安装tensorflow-gpu 命令行查看自己可支持的cuda版本 nvidia-smi如图,CUDA Version后面的就是电脑显卡可支持的cuda版本,所以我们要装的cuda版本需要<=12.7(可向下兼容)。不需要在意其提供的版本号,该版本是最高可支持的cuda 1.安装下载cuda,cudnn…

Echarts如何分别设置PC端图表标题显示和移动端显示?

Echarts绘制图表的时候,PC端界面较大,可以很好的展示,但是移动端界面较窄,需要调整,所以分开设置就要用到 media方法: 实例: 移动端: 源码设置: 注意:media需要设置在series同级; 源码:media: [{query: {maxWidth: 767 // 假设移动设备的最大宽度是767px},option: …

【Webshell不出网】reGeorg和Pystinger的使用

reGeorg+Proxifier: 在实战情况下有时会遇到外网Getshell准备内网渗透的时候发现目标机器不出网,所以就会用映射,代理..等等方式进行上线。 reGeorg项目地址为: https://gitcode.net/mirrors/sensepost/reGeorg?utm_source=csdn_github_acceleratorProxifier地址: https:…

【测试】钩子测试

图片钩子测试 仅收集了访问数据,未使用任何js信息,未窃取任何cookie 只用于匿名数据收集,以及,好玩。

什么!GIS地形与数字孪生结合,竟然能做出如此有趣的效果!

山海鲸可视化支持添加ArcGIS和Cesium地形,并且添加后的GIS地形能够完美与整个数字孪生系统进行融合。同时,我们也可以对GIS地形进行编辑,通过鼠标点击圈选编辑区域,可以将区域内的地形压平、抬升或下沉,结合数字孪生能够实现许多有趣的效果。下面我们就来看看,如何在山海…

中国PostgreSQL考试认证体系

中国PostgreSQL考试认证体系 一、关于举办PostgreSQL研修与评测的通知 为深入贯彻党的二十大和全国新型工业化推进大会精神,落实《关于加强和改进工业和信息化人才队伍建设的实施意见》等文件精神,由北京神脑资讯技术有限公司主办的PostgreSQL数据库管理人才研修与评测班将于…

模型上新!来通义灵码体验 QwQ-32B 推理模型!

通义灵码目前已经支持 QwQ-plus 模型,欢迎大家在【智能问答】里,选择切换模型,即可体验更小尺寸、更强性能的新模型!今天,阿里云发布并开源全新的推理模型通义千问QwQ-32B。通过大规模强化学习,千问QwQ-32B在数学、代码及通用能力上实现质的飞跃,整体性能比肩DeepSeek-R…