高階組件

高階函數

  • 高階函數是指滿足下列條件之一的函數
    1、接受一個或多個函數作為輸入;
    2、返回一個函數;

Mixins的缺點

1、破壞組件封裝性:Mixin可能會引入不可見的屬性。例如在渲染組件中使用Mixin方法,給組件帶來了不可見的屬性(props)和狀態(state)。并且Mixin可能會相互依賴,相互耦合,不利于代碼維護
2、不同的Mixin中的方法可能會相互沖突

高階組件

  • 定義
    高階組件指的是接受一個組件作為參數并返回一個新的組件。高階組件是一個函數,并非一個組件。
  • 高階組件的實現方式
    1、屬性代理 (Props Proxy)
    function ppHOC (WrappedComponent) {
        return class PP extends React.Component {
            render () {
                return <WrappedComponent {...this.props} />
            }
        }
    }
    

從代碼中我們可以看出高階組件的render方法中,返回被包裹組件。我們把高階組件收到的Props傳遞給他,因此得名Props Proxy
2、反向繼承 (Inheritance Inversion)

    function iiHOC(WrappedComponent) {
        return class Enhancer extends WrappedComponent {
            render() {
                return super.render()
            }
       }
    }

如代碼所示,高階組件返回的組件繼承了被包裹組件。

高階組件的作用

我們可以使用高階組件來實現代碼復用,代碼模塊化,邏輯抽象等。還可以進行如下使用

  • 操作Props
    原理: 傳給WrappedComponent的組件首先都會傳給WrapperComponent,所以我們在WrapperComponent中能對Props進行相應的修改。
    代碼:
 function ppHOC (WrappedComponent) {
        return class PP extends React.Component {
            render () {
                const nextProps = {
                    name: 'lta'
                }
                return <WrappedComponent {...this.props} {...nextProps} />
            }
        }
   }

通過上面的代碼,我們的WrappedComponent組件接收的Props中,就會增加一個name的屬性。

  • 抽象state
    可以通過向WrappedComponent傳遞Props和回調函數來抽象state
function ppHOC(WrappedComponent) {
  return class PP extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        name: ''
      }
      this.onNameChange = this.onNameChange.bind(this)
    }
    onNameChange(event) {
      this.setState({
        name: event.target.value
      })
    }
    render() {
      const newProps = {
        name: {
          value: this.state.name,
          onChange: this.onNameChange
        }
      }
      return <WrappedComponent {...this.props} {...newProps}/>
    }
  }
}

使用方法:

@ppHOC
class Example extends React.Component {
  render() {
    return <input name="name" {...this.props.name}/>
  }
}

通過這種操作是Input編程一個受控組件

  • 渲染劫持 (反向繼承)
function iiHOC(WrappedComponent) {
  return class Enhancer extends WrappedComponent {
    render() {
      if (this.props.loggedIn) {
        return super.render()
      } else {
        return null
      }
    }
  }
}

通過該方法可以條件性地渲染組件。

  • 與Mixin的區別
    高階組件是屬于函數式編程思想,對于被包裹的組件不會感知到高階組件的存在,而高階組件返回的組件能增強原來組件的的功能。Mixin是一種混入模式,會不斷增加組件的方法和屬性,組件本身不僅可以感知,甚至需要處理。一但使用Mixin的地方多時,整個組件就會變得難以維護。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在目前的前端社區,『推崇組合,不推薦繼承(prefer composition than inheritance)...
    Wenliang閱讀 77,710評論 16 124
  • 一、mixin 什么是mixin:創造一種類似多重繼承的效果。事實上,說它是組合更為貼切。 1.封裝mixin方法...
    南慕瑤閱讀 2,117評論 0 0
  • React高階組件探究 在使用React構建項目的過程中,經常會碰到在不同的組件中需要用到相同功能的情況。不過我們...
    緋色流火閱讀 2,580評論 4 19
  • 前言 學習react已經有一段時間了,期間在閱讀官方文檔的基礎上也看了不少文章,但感覺對很多東西的理解還是不夠深刻...
    Srtian閱讀 1,675評論 0 7
  • 高階組件是對既有組件進行包裝,以增強既有組件的功能。其核心實現是一個無狀態組件(函數),接收另一個組件作為參數,然...
    柏丘君閱讀 3,103評論 0 6