採用繼承關聯做爲參數的組件和返回的組件,若是傳進來的參數組件爲WrappedComponent,那麼返回中的組件將會繼承於若是傳進來的參數組件爲WrappedComponent。html
代理方式的高階組件
react
繼承方式的高階組件
數組
從以上兩張圖中能夠看出有兩點區別app
一、繼承方式的高階組件繼承於React.Component,而代理方式的高階組件直接繼承於傳入的組件參數。
二、返回值也是明顯不一樣的。繼承方式的高階組件須要把傳入組件返回出去,而代理方式的高階組件返回的是super.render()。
其有兩種操做:this
一、操縱props。
二、操縱生命週期。
1.操縱props
首先建立一個繼承方式的高階組件D,經過如下方法實現操縱props。spa
import React from 'react' const D = (WrappedComponent) => class NewComp extends WrappedComponent { render() { // 獲取繼承而來的傳入組件的元素內容 const element = super.render() // 對元素標籤判斷添加樣式屬性 const newStyle = { color:element.type === 'div' ? 'red' : 'yellow', fontSize: '50px' } // 定義新的props const newProps = {...this.props, style: newStyle} // React.cloneElement方法生成新的React對象 return React.cloneElement(element, newProps, element.props.children) } } export default D
建立普通組件E傳入繼承高階組件D3d
import React, { Component } from 'react' import D from './D' @D class E extends Component { render() { return ( <div>我是E中div</div> ) } } export default E
建立普通組件F傳入繼承高階組件D代理
import React, { Component } from 'react' import D from './D' @D class F extends Component { render() { return ( <p>我是F中p</p> ) } } export default F
最終實現以下效果:
code
2.操縱生命週期
首先在componentWillMount生命週期內打個log。component
import React, { Component } from 'react' import D from './D' @D class E extends Component { componentWillMount() { console.log('我是E中生命週期') } render() { return ( <div>我是E中div</div> ) } } export default E
在控制檯能夠看到以下效果:
這個你們確定都是沒問題,看的很明白。
下面咱們在繼承高階組件D中輸入一樣內容:
import React from 'react' const D = (WrappedComponent) => class NewComp extends WrappedComponent { componentWillMount() { console.log('我是繼承高階組件D中生命週期') } render() { const element = super.render() const newStyle = { color:element.type === 'div' ? 'red' : 'yellow', fontSize: '50px' } const newProps = {...this.props, style: newStyle} return React.cloneElement(element, newProps, element.props.children) } } export default D
在控制檯能夠看到以下效果:
哦吼,E中生命週期內容不見了,被繼承高階組件D給劫持了,這就是繼承高階組件操縱生命週期
雖然本文詳細介紹了繼承高階組件,可是react 官方文檔已經不推薦你們去使用繼承方式的高階組件了。不要改變原始組件,使用組合即爲應該使用代理方式的高階組件。
詳細內容請觀看官網解釋:
https://zh-hans.reactjs.org/d...