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 函数中的参数使用分析
Mar 27 Javascript
基于jquery的一个图片hover的插件
Apr 24 Javascript
来自国外的30个基于jquery的Web下拉菜单
Jun 22 Javascript
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
jQuery处理xml格式的返回数据(实例解析)
Nov 28 Javascript
append和appendTo的区别以及appendChild用法
Dec 24 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
简单的三步vuex入门
May 20 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
vue实现标签云效果的方法详解
Aug 28 Javascript
vuex的使用和简易实现
Jan 07 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函数指定默认值方法的小例子
2013/12/04 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
再探JavaScript作用域
2014/09/24 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
jQuery操作css样式
2017/05/15 jQuery
jquery实现企业定位式导航效果
2018/01/01 jQuery
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
详解微信UnionID作用
2019/05/15 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
python 实现堆排序算法代码
2012/06/05 Python
python异常和文件处理机制详解
2016/07/19 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python代码编写计算器小程序
2020/03/30 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
四种会话跟踪技术
2015/05/20 面试题
座谈会主持词
2014/03/20 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
明星邀请函
2015/02/02 职场文书
如何写观后感
2015/06/19 职场文书
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技