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 相关文章推荐
js截取字符串的两种方法及区别详解
Nov 05 Javascript
jquery实现简单易懂的图片展示小例子
Nov 21 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
在HTML代码中使用JavaScript代码的例子
Oct 16 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
Nov 23 Javascript
JavaScript数据类型之基本类型和引用类型的值
Apr 01 Javascript
JavaScript中的splice方法用法详解
Jul 20 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
Aug 04 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 Javascript
express框架实现基于Websocket建立的简易聊天室
Aug 10 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 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
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
Python专用方法与迭代机制实例分析
2014/09/15 Python
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
名片管理系统python版
2018/01/11 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
python中类的属性和方法介绍
2018/11/27 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python 操作hive pyhs2方式
2019/12/21 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
药学专业大学生个人的自我评价
2013/11/04 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
《乌塔》教学反思
2014/02/17 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
大学生党课心得体会
2016/01/07 职场文书
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers