当前位置: 首页 > news >正文

react之React.cloneElement()

react提供的这个方法克隆组件的方法,可能我们在平常的开发中用的很少,主要可能是我们并不知道或者并不了解这个方法。因为我在之前react的children文章中用到过,所以我就进行了一系列的测试,发现真的非常的好用。我们同样使用一些小的demo来介绍他的功能。

React.cloneElement()接收三个参数第一个参数接收一个ReactElement,可以是真实的dom结构也可以是自定义的。第二个参数返回旧元素的props、key、ref。可以添加新的props,第三个是props.children,不指定默认展示我们调用时添加的子元素。如果指定会覆盖我们调用克隆组件时里面包含的元素。接下来我们开始测试

function CloneDemo(props){return React.cloneElement(<div/>,props,<p>这是一个克隆的元素</p>)
}
export default CloneDemo;
1.png
2.png

我先写了一个最简单的demo,克隆的元素div和给他添加的子元素p都正常展示了。接着测试他的功能,接着上面的例子

function CloneDemo(props){return React.cloneElement(<div/>,props,<p>这是参数传入的元素</p>)
}
function ContainerBox(){return <CloneDemo><h1>这是在父组件添加的元素</h1></CloneDemo>
}
export default ContainerBox;

我对代码进行了调整,增加了一个ContainerBox组件,并调用了克隆的元素,还给他添加了子元素,查看效果:


3.png

发现传入的参数元素覆盖了从父组件传入的元素,导致h1标签并没有被渲染。因为平常开发我们写公共组件可能从父组件传入的比较多,所以下面的例子都不传入第三个参数。

上面是直接渲染了一个div显然这样的写法很不友好,可能我们想渲染一个p元素,一个a元素甚至是一个自定义的,上面的写法显然已经不支持了,下面进行修改:

function CloneDemo({dom=<div/>,...props}){return React.cloneElement(dom,{...props})
}
function ContainerBox(){return <CloneDemo dom={<p></p>}><h1>这是在父组件添加的元素</h1></CloneDemo>
}
export default ContainerBox;

给克隆组件传入了一个dom,dom接收一个ReactElement,还给他赋予了一个默认值,如果没传入渲染div即可,我先给dom传入了一个p元素查看页面元素:


4.png

传入的p元素正常显示出来了。下来测试自定义的ReactElement看是否正常渲染

const Exam = (props) => <div>这是一个自定义的ReactElement元素{props.children}</div>
function CloneDemo({dom=<div/>,...rest}){return React.cloneElement(dom,{...rest})
}
function ContainerBox(){return <CloneDemo dom={<Exam style={{color: "red",textAlign: "center"}} />}><h1>这是在父组件添加的元素</h1></CloneDemo>
}
export default ContainerBox;

我创建了一个Exam组件,并将他传给克隆组件,我们还给他加上了样式查看效果:


5.png

可以正常显示但是发现样式并没有生效,接下来处理样式,主要需要两部分的样式,一部分是克隆的时候直接给的样式,一个是传入的组件的样式,处理原则是如果样式冲突,采用传入的样式。

const Exam = (props) => {return <div style={{...props.styles,...props.style}}>这是一个自定义的ReactElement元素{props.children}</div>
}
function CloneDemo({dom=<div/>, ...rest }){const styles = {color: "blue",minWidth: "1200px",margin: "100px auto",textAlign: "left"}return React.cloneElement(dom,{styles, ...rest})
}
function ContainerBox(){return <CloneDemo dom={<Exam style={{color: "red",textAlign: "center"}}  />}><h1>这是在父组件添加的元素</h1></CloneDemo>
}
export default ContainerBox;

我将CloneDemo中定义的styles,已经传入Exam组件时给他定义的样式都加到了Exam组件身上


6.png

继续优化克隆组件

const Exam = (props) => {return <div style={{...props.style}}>这是一个自定义的ReactElement元素{props.children}</div>
}
function CloneDemo({dom=<div/>, ...rest }){const styles = {color: "blue",minWidth: "1200px",margin: "100px auto",textAlign: "left"}return React.cloneElement(dom,{style: Object.assign({}, styles, dom.props.style), //将传入的样式放到最后提高他的优先级...rest})
}
function ContainerBox(){return <CloneDemo dom={<Exam style={{color: "red",textAlign: "center"}}  />}><h1>这是在父组件添加的元素</h1></CloneDemo>
}
export default ContainerBox;

这样在Exam组件中只需要传入一个props.style样式就可以了。

最后编辑于:2025-06-15 11:03:11


喜欢的朋友记得点赞、收藏、关注哦!!!

http://www.dtcms.com/a/322249.html

相关文章:

  • 深入剖析C++ STL原理:打开高效编程大门的钥匙
  • [每周一更]-(第155期):深入Go反射机制:架构师视角下的动态力量与工程智慧
  • Web3: DeFi借贷的安全基石, 了解喂价与清算机制的原理与重要性
  • Typora上传图片保存到assets目录下
  • ARM CPU 安全更新:Training Solo(关于 Spectre-v2 攻击中域隔离机制的局限性)
  • 学习:JS[8]本地存储+正则表达式
  • Matlab系列(004) 一 Matlab分析正态分布(高斯分布)
  • 《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】
  • pgAdmin 仪表盘的system部分不能显示,报SYSTEM_STATS扩展没有安装
  • git命令详解
  • TensorFlow深度学习实战(29)——强化学习(Reinforcement learning,RL)
  • elementui input无法输入问题
  • JAVA基础-使用BIO / NIO实现聊天室功能
  • Day 36: 复习
  • 康养休闲旅游服务虚拟仿真实训室:助力康养人才培养的创新引擎
  • 《算法导论》第 14 章 - 数据结构的扩张
  • SupChains团队:Animalcare公司供应链需求预测模型案例分享(十三)
  • [激光原理与应用-203]:光学器件 - 增益晶体 - 增益晶体的使用方法
  • GitCode 疑难问题诊疗:让你的开发流程重回正轨
  • 2025年渗透测试面试题总结-10(题目+回答)
  • C语言:构造类型
  • 【Python 语法糖小火锅 · 第 5 涮 · 完结】
  • 使用小诺框架报错:NoResourceFoundException: No static resource exercise/tag/page.
  • Go语言接口实战指南
  • VS Git巨坑合并分支失败导致多项无关改变
  • HarvardX TinyML小笔记1(番外2:神经网络)
  • ESP32之wifi_HTTP
  • 从 AI 到实时视频通道:基于模块化架构的低延迟直播全链路实践
  • 大语言模型提示工程与应用:前沿提示工程技术探索
  • spring的知识点:容器、AOP、事物