如何對組件的children進行增強,如:添加屬性、綁定事件,而不是使用<div>{this.props.children}</div>
在<div>
上進行處理。react
今天寫組件遇到這個問題,在網上查閱了不少資料,都說能夠使用React.cloneElement
進行處理,可是結果並非預期想要的。this
先看看這個東西有什麼用:spa
React.cloneElement(element, [props], [...childrn])
根據React官網的說法,以上代碼等價於:code
<element.type {...element.props} {...props}>{children}</element.type>
這麼作其實也是給children
包了一層標籤,再對其進行間接處理,沒有直接修改children
。對象
如:blog
// 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' } } )
可是實際效果是這樣的:element
<div style={{ dispaly: 'inline-block' }}> <div style={{ color: 'red' }} onClick={() => console.log('hello')}> demo </div> <div>
哈!?子元素的父元素被設爲了inline-block
,和咱們想要的<div>demo</div>
被設爲inline-block
。結果與預期徹底不一樣,簡直大失所望!!!jsx
React.clone
根本對不起它clone
的名字!!!it
思路: jsx語法表示的元素只是react組件的一個語法糖。因此組件是對象。既然是對象咱們就能夠直接對其進行修改。
嘗試在控制檯打印一個以下react組件:
// this.props.children console.log( <div style={{ color: 'red' }} onClick={() => { console.log('hello'); }} > demo </div> );
以下:
因此直接修改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
對象便可。