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实现选取月份插件附源码下载
Dec 28 Javascript
JavaScript实现随机数生成器(去重)
Oct 13 Javascript
JS实现的简单表单验证功能示例
Oct 13 Javascript
angular写一个列表的选择全选交互组件的示例
Jan 22 Javascript
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
详解vue-router传参的两种方式
Sep 10 Javascript
laydate时间日历插件使用方法详解
Nov 14 Javascript
mpvue 单文件页面配置详解
Dec 02 Javascript
javascript中数组的常用算法深入分析
Mar 12 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
js实现简单的点名器随机色实例代码
Sep 20 Javascript
详解Vue的options
May 15 Vue.js
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实现简单的上传进度条
2015/11/17 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
Node.js编码规范
2014/07/14 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
python解释器spython使用及原理解析
2019/08/24 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
金讯Java笔试题目
2013/06/18 面试题
私有程序集与共享程序集有什么区别
2013/04/05 面试题
公司委托书范本
2014/04/04 职场文书
研修心得体会
2014/09/04 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
行政处罚告知书
2015/07/01 职场文书
2015国庆节感想
2015/08/04 职场文书
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
超级详细实用的pycharm常用快捷键
2021/05/12 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis