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与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
JavaScript Array Flatten 与递归使用介绍
Oct 30 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
jsonp原理及使用
Oct 28 Javascript
Jquery实现动态切换图片的方法
May 18 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
Sep 25 Javascript
提高Web性能的前端优化技巧总结
Feb 27 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 Javascript
微信小程序保存多张图片的实现方法
Mar 05 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 Javascript
vue如何实现动态加载脚本
Feb 05 Javascript
实例讲解JavaScript 计时事件
Jul 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
php实现可用于mysql,mssql,pg数据库操作类
2014/12/13 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
python实现udp聊天窗口
2020/03/31 Python
详解python的super()的作用和原理
2020/10/29 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
销售演讲稿范文
2014/01/08 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
联片教研活动总结
2014/07/01 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android
Python 统计序列中元素的出现频度
2022/04/26 Python