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

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

問題

如何對組件的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>
);

如下:

所以直接修改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對象即可。

posted @ 2019-06-23 01:52  tornoda  閱讀(...)  評論(...編輯  收藏
内蒙古快3开奖结果 河南快三走势一定牛 韩国快乐8官方开奖结果 内蒙古快3开奖跨度走势图 百度黑龙江11选5下载安装 对麻将一点不懂 怎么学 澳洲快乐8基本走势图 捕鱼大富翁红包版 二手麻将机多少钱一 安徽快3是国家的吗 可以在家兼职赚钱网 广东十一选五基本走 湖北福彩30选5开奖 20选5开奖号 幸运飞艇怎么抓3码 申城棋牌最新版下载 五分快三怎么玩稳赢