React組件中對子組件children進行增強

React組件中對子組件children進行增強

問題

如何對組件的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對象便可。

相關文章
相關標籤/搜索