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实现 在光标处插入指定内容
May 25 Javascript
起点页面传值js,有空研究学习下
Jan 25 Javascript
JavaScript调用Activex控件的事件的实现方法
Apr 11 Javascript
js window.print实现打印特定控件或内容
Sep 16 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
JSON键值对序列化和反序列化解析
Jan 24 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
js实现下拉框二级联动
Dec 04 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
桌面中心(三)修改数据库
2006/10/09 PHP
PHP4之COOKIE支持详解
2006/10/09 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
javascript 常用方法总结
2009/06/03 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
基本DOM节点操作
2017/01/17 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
python读取图片并修改格式与大小的方法
2018/07/24 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
Python 导入文件过程图解
2019/10/15 Python
django框架cookie和session用法实例详解
2019/12/10 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
CAT鞋美国官网:CAT Footwear
2017/11/27 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
店长岗位的工作内容
2013/11/12 职场文书
招聘单位介绍信
2014/01/14 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
个人总结与自我评价2015
2015/03/11 职场文书