React组件对子组件children进行加强的方法


Posted in Javascript onJune 23, 2019

问题

如何对组件的children进行加强,如:添加属性、绑定事件,而不是使用<div>{this.props.children}</div>在<div>上进行处理。

前车之鉴

今天写组件遇到这个问题,在网上查阅了很多资料,都说可以使用React.cloneElement进行处理,但是结果并不是预期想要的。

先看看这个东西有什么用:

React.cloneElement(element, [props], [...childrn])

根据React官网的说法,以上代码等价于:

<element.type {...element.props} {...props}>{children}</element.type>

这么做其实也是给children包了一层标签,再对其进行间接处理,没有直接修改children。

如:

// App.jsx
<Father>
 <div style={{ color: 'red' }} onClick={() => console.log('hello')}>
  demo
 </div>
<Father>

我们希望在Father.jsx的内部将div转为inline-block。按照网上的做法,是这样的:

// Father.jsx
const Son = React.cloneElement(
 this.props.children,
 {
  style: {
   display: 'inline-block'
  }
 }
)

但是实际效果是这样的:

<div style={{ dispaly: 'inline-block' }}>
 <div style={{ color: 'red' }} onClick={() => console.log('hello')}>
  demo
 </div>
<div>

哈!?子元素的父元素被设为了inline-block,和我们想要的<div>demo</div>被设为inline-block。结果与预期完全不同,简直大失所望!!!

React.clone根本对不起它clone的名字!!!

自我探索

思路: jsx语法表示的元素只是react组件的一个语法糖。所以组件是对象。既然是对象我们就可以直接对其进行修改。

尝试在控制台打印一个如下react组件:

// this.props.children
console.log(
 <div
  style={{ color: 'red' }}
  onClick={() => {
   console.log('hello');
  }}
 >
  demo
 </div>
);

如下:

React组件对子组件children进行加强的方法

所以直接修改this.props.children即可:

// Father.jsx
const { children } = this.props;
const Son = {
 ...children,
 props: {
   ...children.props,
  dispaly: {
   ...children.style,
   display: 'inline-block'
  },
  onTransitionEnd: () => { console.log('hello world') }
 }
}

总结

如何对组件的children进行直接加强,直接修改this.props.children对象即可。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
Mar 16 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
Oct 14 Javascript
非阻塞动态加载javascript广告实现代码
Nov 17 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
jQuery scroll事件实现监控滚动条分页示例
Apr 04 Javascript
模拟一个类似百度google的模糊搜索下拉列表
Apr 15 Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 Javascript
AngularJS变量及过滤器Filter用法分析
Nov 22 Javascript
详解Node.js:events事件模块
Nov 24 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
Oct 31 Javascript
VScode格式化ESlint方法(最全最好用方法)
Sep 10 Javascript
vue使用websocket的方法实例分析
Jun 22 #Javascript
JS实现简单的文字无缝上下滚动功能示例
Jun 22 #Javascript
js图片查看器插件用法示例
Jun 22 #Javascript
JS实现继承的几种常用方式示例
Jun 22 #Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 #Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 #Javascript
如何在JavaScript中谨慎使用代码注释
Jun 21 #Javascript
You might like
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php array_slice 取出数组中的一段序列实例
2016/11/04 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
php json相关函数用法示例
2017/03/28 PHP
MSN消息提示类
2006/09/05 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
关于jquery的多个选择器的使用示例
2013/10/18 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
js中this用法实例详解
2015/05/05 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
绩效专员岗位职责
2013/12/02 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
迎新晚会主持词
2014/03/24 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
复试通知单模板
2015/04/24 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技