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 工具函数学习资料
Apr 29 Javascript
JavaScript聚焦于第一个字段的代码
Oct 15 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
关于Javascript 对象(object)的prototype
May 09 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
Feb 18 Javascript
JS定义类的六种方式详解
May 12 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
Dec 19 Javascript
关于Javascript闭包与应用的详解
Apr 22 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后退一页表单内容保存实现方法
2012/06/17 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
JavaScript内核之基本概念
2011/10/21 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python实现针对中文排序的方法
2017/05/09 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
2014年公司植树节活动方案
2014/03/04 职场文书
爱我中华演讲稿
2014/05/20 职场文书
工会换届选举方案
2014/05/21 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
公司承诺书格式范文
2015/04/28 职场文书
运动会100米加油稿
2015/07/21 职场文书
初中英语教学随笔
2015/08/15 职场文书