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 相关文章推荐
用javascript实现页面打印的三种方法
Mar 05 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
jQuery插件formValidator实现表单验证
May 23 Javascript
js html5 css俄罗斯方块游戏再现
Oct 17 Javascript
浅谈JavaScript的函数及作用域
Dec 30 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
Vue中的v-cloak使用解读
Mar 27 Javascript
JS正则表达式完美实现身份证校验功能
Oct 18 Javascript
vue组件实现进度条效果
Jun 06 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
JavaScript如何操作css
Oct 24 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
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
python同步两个文件夹下的内容
2019/08/29 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
2014年销售工作总结与计划
2014/12/01 职场文书
工会工作个人总结
2015/03/03 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers