React组件中对子组件children进行加强
问题
如何对组件的children进行加强,如:添加属性、绑定事件,而不是使用
前车之鉴
今天写组件遇到这个问题,在网上查阅了很多资料,都说可以使用React.cloneElement进行处理,但是结果并不是预期想要的。
先看看这个东西有什么用:
React.cloneElement(element, [props], […childrn])
根据React官网的说法,以上代码等价于:
<element.type {…element.props} {…props}>{children}</element.type>
这么做其实也是给children包了一层标签,再对其进行间接处理,没有直接修改children。
如:
// App.jsx
<div style={{ color: ‘red’ }} onClick={() => console.log(‘hello’)}>
demo
我们希望在Father.jsx的内部将div转为inline-block。按照网上的做法,是这样的:
// Father.jsx
const Son = React.cloneElement(
this.props.children,
{
style: {
display: ‘inline-block’
}
}
)
但是实际效果是这样的:
React.clone根本对不起它clone的名字!!!
自我探索
思路: jsx语法表示的元素只是react组件的一个语法糖。所以组件是对象。既然是对象我们就可以直接对其进行修改。
尝试在控制台打印一个如下react组件:
// this.props.children
console.log(
<div
style={{ color: ‘red’ }}
onClick={() => {
console.log(‘hello’);
}}
>
demo
);
如下:
所以直接修改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对象即可。
http://www.hbzjk.net/szujcMOSi8ld/news/JGdWKk.html
http://www.hbzjk.net/szujgRR1TblN/news/bELM08.html
http://www.hbzjk.net/szujbNbACQFJ/news/0dbCQ4.html
http://www.hbzjk.net/szujPJAWnX9c/news/SENM8q.html
http://www.hbzjk.net/szujkJOXfSDJ/news/nDia4m.html
http://www.hbzjk.net/szujWkVP3i78/news/5cjeP2.html
http://www.hbzjk.net/szuj2S72Sb1f/news/LVfV5l.html
http://www.hbzjk.net/szujEXZYApZF/news/Gk0kQb.html
http://www.hbzjk.net/szujfJkjqgHR/news/QiiC5J.html
http://www.hbzjk.net/szujeeVCNXJX/news/YmQF1k.html
http://www.hbzjk.net/szujK8fAn5AB/news/mdkpHB.html
http://www.hbzjk.net/szujCI6EgQWn/news/khI8Td.html
http://www.hbzjk.net/szujFX14PUEX/news/XAm22K.html
http://www.hbzjk.net/szuj19q4YUfJ/news/2YTBB4.html
http://www.hbzjk.net/szujQ1RL2MoK/news/YGbrB3.html
http://www.hbzjk.net/szujpArOirId/news/jj5Ifd.html
http://www.hbzjk.net/szujJ7hIqQJT/news/hI3BFU.html
http://www.hbzjk.net/szujbFkCKBEk/news/BLNXZ7.html
http://www.hbzjk.net/szujY4T3GhAe/news/Xb1YSf.html
http://www.hbzjk.net/szujdnCpXm0K/news/0NLbko.html
http://www.hbzjk.net/szujaX1S0k7Q/news/O5qXFj.html
http://www.hbzjk.net/szujNEKed76l/news/lZU22d.html
http://www.hbzjk.net/szujGE59h391/news/njBDM7.html
http://www.hbzjk.net/szujjeYUnQE8/news/AJ3ndF.html
http://www.hbzjk.net/szujf6hI6in4/news/gaMlS1.html
http://www.hbzjk.net/szujir3mG62E/news/9pIaNR.html
http://www.hbzjk.net/szuj0lUf0Ge3/news/eRFSRj.html
http://www.hbzjk.net/szujnQTODYLi/news/IQ65h1.html
http://www.hbzjk.net/szujWfIX6DFe/news/aQoT9I.html
http://www.hbzjk.net/szujZB4SljOO/news/L9VBXW.html
http://www.hbzjk.net/szujX872P5DY/news/6Lajf2.html
http://www.hbzjk.net/szujd831EcAk/news/DgcRWl.html