render props

了解render props之前先來回顧一下之前學習過的高階組件HOC,高階組件是接收一個組件作為參數(shù)须板,返回一個新的組件撕予。其作用就是提高組件的復用性。今天學習的render props也是為了簡化代碼做裙,提高組件復用性岗憋。

render props 組件接收一個函數(shù),該函數(shù)會調(diào)用另一個組件而不是直接渲染锚贱, 有一點我們需要注意仔戈,一般一個組件調(diào)用另一個組件,是將被調(diào)用的組件渲染到該組件中拧廊,然后進行硬編碼监徘,而render props是接收函數(shù),直接調(diào)用函數(shù)吧碾,其函數(shù)輸出結(jié)果作為 props 傳入主組件凰盔。

render props的一般格式是:

<CustomerComponent render={ data=> (

? ? ? ? <h1>Hello {data.target}

)} />

這里用官方文檔中的例子簡單說明。 獲取鼠標當前位置倦春,我們可以定義一個組件

class Cat extends React.Component {

? ? render() {

? ? ? ? const mouse = this.props.mouse;

? ? ? ? renturn (

? ? ? ? ? ? <img? style={{ left: mouse.x, top, mouse.y}}

}

class Mouse extends React.Component {

? ? ? ? constructor(props) {

? ? ? ? ? ? ? ? super(props)

? ? ? ? ? ? ? ? this.handleMouseMove = this.handleMouseMove.bind(this)

? ? ? ? ? ? ? ? this.state = {x:0, y:0}

? ? ? ? handleMouseMove(event) {

? ? ? ? ? ? ? ? this.setState(

? ? ? ? ? ? ? ? ? ? x:event.clientX,

? ? ? ? ? ? ? ? ? ? y: event.clientY

? ? ? ? ? ? ? ? )

? ? ? ? }

? ? ? ? render() {

? ? ? ? ? ? ? ? return (????

? ? ? ? ? ? ? ? ? ? <div onMouseMove={this.handleMouseMove}>?

? ? ? ? ? ? ? ? ? ? ? ? {this.props.render(this.state)}

? ? ? ? ? ? ? ? ? ? ? ? //原本應該直接輸出 <p>鼠標的位置為: x: { this.state.x } ; y: { this.state.y }

? ? ? ? ? ? ? ? ? ? </div>

? ? ? ? ? ? ? ? );

? ? ? ? ? }

}

class MouseTracker extends React.Component {? ?

????????render() { ????

????????????????return (?

????????????????????????<div>?

????????????????????????????<h1>移動鼠標!</h1>

????????????????????????????<Mouse render={mouse => ( <Cat mouse={mouse} /> )}/>?

????????????????? ? ? </div>?

????????????????);

????????}

}?


上面這個例子的效果是想渲染一個追著鼠標的貓咪的效果户敬。 可以看到MouseTracker組件中調(diào)用了獲取鼠標位置的組件Mouse, 而Mouse組件中使用了 render props ,傳入了一個函數(shù)溅漾, Mouse組件內(nèi)部是捕獲了這個 render props? “{this.props.render(this.state)}” 將 this.state 的值綁定到 Mouse 的 mouse參數(shù)中山叮, mouse 參數(shù)又通過調(diào)用 <Cat mouse={mouse} /> 作為 props 參數(shù)傳入到 Cat組件中。所以 Cat組件中用了 const mouse= this.props.mouse; 來捕獲該值添履。?


開頭我們簡單提到 高階組件HOC屁倔,這里再貼一個 HOC 結(jié)合 render props的方法,實現(xiàn)上面代碼相同的功能暮胧。

// 如果你出于某種原因真的想要 HOC锐借,那么你可以輕松實現(xiàn)

// 使用具有 render prop 的普通組件創(chuàng)建一個!

function withMouse(Component) {

????return class extends React.Component {

????????render() {

????????????return (?

????????????????<Mouse render={mouse => ( <Component {...this.props} mouse={mouse} /> )}/>

????????????);

????????}

????}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末往衷,一起剝皮案震驚了整個濱河市钞翔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌席舍,老刑警劉巖布轿,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡汰扭,警方通過查閱死者的電腦和手機稠肘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萝毛,“玉大人项阴,你說我怎么就攤上這事“拾” “怎么了环揽?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庵佣。 經(jīng)常有香客問我歉胶,道長,這世上最難降的妖魔是什么秧了? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任跨扮,我火速辦了婚禮,結(jié)果婚禮上验毡,老公的妹妹穿的比我還像新娘。我一直安慰自己帝嗡,他們只是感情好晶通,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哟玷,像睡著了一般狮辽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巢寡,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天喉脖,我揣著相機與錄音,去河邊找鬼抑月。 笑死树叽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谦絮。 我是一名探鬼主播题诵,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼层皱!你這毒婦竟也來了性锭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叫胖,失蹤者是張志新(化名)和其女友劉穎草冈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡怎棱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年哩俭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹄殃。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡携茂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诅岩,到底是詐尸還是另有隱情讳苦,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布吩谦,位于F島的核電站鸳谜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏式廷。R本人自食惡果不足惜咐扭,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滑废。 院中可真熱鬧蝗肪,春花似錦、人聲如沸蠕趁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俺陋。三九已至豁延,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腊状,已是汗流浹背诱咏。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缴挖,地道東北人袋狞。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像醇疼,于是被迫代替她去往敵國和親硕并。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • React的設計模式有很多種秧荆,比如無狀態(tài)組件/表現(xiàn)型組件倔毙,有狀態(tài)組件/容器型組件,render模式組件乙濒,高階組件等...
    Perkin_閱讀 6,947評論 1 9
  • 在軟件開發(fā)的過程中Code Reuse和可讀性一直是開發(fā)人員致力于解決的問題陕赃,在React社區(qū)中卵蛉,以往出現(xiàn)了很多的...
    aaronisme閱讀 768評論 0 1
  • 首先打個廣告,系列文章: 古老的React mixins HOC(高階組件) render props React...
    DC_er閱讀 1,280評論 0 0
  • 綠水肥鴨懶么库, 黃鸝啼柳暗傻丝。 農(nóng)家喝老牛, 歇雁驚飛天诉儒。
    花渡_a0d8閱讀 163評論 1 3
  • 女生+24:00(3月7日)=女神葡缰。這是個神奇的公式,神奇到不需要任何條件就能產(chǎn)生的反應忱反,所以泛释,到現(xiàn)在都無解。為什...
    噓星期五閱讀 304評論 0 0