react之——render prop

在react 「從上至下的數據流原則」 背景下,常規的消息傳遞機制就是經過prop屬性,把父級數據傳遞給子級,這樣一種數據流通模式決定了——數據的接收方子組件要被」硬植入「進數據的數據的給予方父組件,模式以下:前端

圖1  傳統依賴props進行數據傳遞的組件「硬植入」模型react

基於上述的「硬植入」模式,就造成了組件之間的強耦合,進而會在代碼裏寫出不少這種基於「功能型」中間件——大組件裏嵌特定小組件。app

那若是大組件裏的數據要被多個子組件共享怎麼辦?若是繼續「硬植入」要繼續寫出「功能型組件1」,「功能型組件2」。。。這種方式很顯然破壞了前端功能化,讓維護和擴展都變的艱難。ide

render prop函數

render prop的出現,讓「子組件注入」變成了可能,在注入階段進行父子組件之間的傳值,從而實現了父子組件的解耦,具體參看react官網示例代碼,本地demo了一下,貼上來:ui

class Cat extends React.Component{
  render(){
    const mouse = this.props.mouse;
    return(
      <div>
        <img src={require("./cat.PNG")} style={{position:"absolute",left:mouse.x,top:mouse.y}} />
      </div>
    );
  }
}
//帶有函數prop的Mouse組件———render prop的由來
class Mouse extends React.Component{
  constructor(){
    super();
    this.state = {
      x:0,
      y:0
    };
    this.handleMouseMove = this.handleMouseMove.bind( this );
  }
  handleMouseMove( e ){
    this.setState( {
      x: e.clientX,
      y: e.clientY
    } );
  }
  render(){//用render注入的方式,能夠動態渲染注入對象
    return (<div style={{height:"900px",position:"relative"}} onMouseMove={this.handleMouseMove}>
      {this.props.render( this.state )}//調用render prop(函數引用),渲染注入的子組件 </div>);
  }
}
class MouseTracker extends React.Component{
  render(){
    return (<div className="customized-wrapper">
      <h1>Move the mouse around!</h1>
      <Mouse 
      render={ mouse => (//render接收一個箭頭函數引用,render做爲一個prop傳入子級 <Cat mouse={mouse}/>
        ) }
        />
    </div>);
  }
}

事實上,除了render prop以外,react組件也能夠接收用戶自定義的函數型屬性做爲注入依賴,固然也能夠在父級調用該prop實現render或其餘公用,用法於render相似,你們可在本地demo.this

render prop實現了什麼?spa

1. 爲減小「硬植入」的功能型組件編寫提供瞭解決方案,固然不能爲了解耦而解耦,當某個父級只須要給一個子級傳遞數據時,大可沒必要進行這樣的解耦操做code

2. 提供了一種簡單的「數據共享」機制,將數據使用方注入數據的提供方,實現了一種「按需供給」的機制,一份數據支持多方共享,很nice.中間件

上述機制數據模型以下:

 

 

end

 

——May stars guide your way.

相關文章
相關標籤/搜索