日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

React拾遗:Render Props及其使用场景

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 React拾遗:Render Props及其使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是 Render Props?

新的context api使用了render props:


<ThemeContext.Consumer>{theme => (<button{...props}style={{backgroundColor: theme.background}}/>)} </ThemeContext.Consumer>
第一次見到這個語法時,大多會很驚訝,因為日常代碼里props.children必然是字符串或者元素。但事實上props.children可以是函數,只要最終生成的render的返回值是dom元素就行。例如:


// chilren props const Test = props => props.children('hello world') const App = () => (<Test>{text => <div>{text}</div>}</Test> )ReactDOM.render((<App />, root) // 返回<div>hello world</div>
雖然沒有實際意義,但這即是一個?render props。當然render props最初的意思是:組件不自己定義render函數,而是通過一個名為render的props將外部定義的render函數傳入使用。?以上例來說,會是這樣:


// render props const Test = props => props.render('hello world') const App = () => (<Testrender={text => <div>{text}</div>}/> )ReactDOM.render((<App />, root) // 返回<div>hello world</div>

因為現實中render函數很龐大,為了代碼整潔多半會使用children而不是自定義的render來接收外部的render函數。所以這一技巧也可以稱為children props(相對于render props更加不知所云的名稱),但一般統稱render props。

為何要使用如此怪異的語法呢?

為了重用性。React的組件化就是為了方便重用。大多數場景我們需要重用的是UI(例如文章列表,側欄),但也有少數情況需要重用的是功能和狀態(例如context)。

如果說React的核心是State => UI, 普通的組件是UI重用,那么render props就是為了State重用而應運而生的。

Render Props 小史

在 Demo 展開前插播一段?render props?的趣史。

  • 最早引人關注是從 Facebook 的 Cheng Lou 寫的?React Motion?動畫庫。

import { Motion, spring } from 'react-motion';<Motion defaultStyle={{x: 0}} style={{x: spring(10)}}>{value => <div>{value.x}</div>} </Motion>

之后這一寫法被各位大牛廣泛接受,寫過很多非常贊的前端教程的 Kent C. Dodds 就非常喜歡 render props, 他所任職的 PayPal 的輸入框組件 downshift 也使用了 render props

大家熟知的 react-router 的作者 Michael Jackson 也是 render props 的極力推崇者。他twitter過一句很有爭議的話:


Next time you think you need a HOC (higher-order component) in @reactjs, you probably don't.

翻譯過來就是:下次你想使用HOC解決問題時,其實大半不需要。 在回復中他補充說明到,

I can do anything you're doing with your HOC using a regular component with a render prop. Come fight me.

即是說,所有用 HOC 完成的事,render props 都能搞定。 值得一提的是 react-router 4 里唯一的一個 HOC 是withRouter, 而它是用 render props 實現的,有興趣的可以去看一下源代碼。

  • HOC 雖然好用,但寫一個“真正好用”的HOC卻要經過一道道繁瑣的工序(React的新api fowardRef 就幾乎是為此而生的),是個用著舒服寫著煩的存在。所以感覺最近大有“少寫 HOC 推崇 render props”的思潮。至于新的 Context api 雖然思路上和react-redux如出一轍,卻選擇了 render props 的寫法,在我看來也是順理成章。

Render Props 使用場景

實例1: 一個日常的使用場景是彈窗。App的彈窗UI可能千奇百怪,但它們的功能卻是類似的:無非有個顯示隱藏的狀態,和一個控制顯隱的方法,以 antd 為例:



import { Modal, Button } from 'antd';class App extends React.Component {state = { visible: false }showModal = () => {this.setState({visible: true,});}handleOk = (e) => {// 做點什么this.setState({visible: false,});}handleCancel = (e) => {this.setState({visible: false,});}render() {return (<div><Button onClick={this.showModal}>Open</Button><Modaltitle="Basic Modal"visible={this.state.visible}onOk={this.handleOk}onCancel={this.handleCancel}><p>Some contents...</p><p>Some contents...</p><p>Some contents...</p></Modal></div>);} }
上面是最簡單的Modal使用實例,但大家心中理想的使用方式是如下的:

<div><Button>Open</Button><Modaltitle="Basic Modal"onOk={this.handleOk //做點什么}><p>Some contents...</p><p>Some contents...</p><p>Some contents...</p></Modal></div>

我只想寫業務邏輯的?onOK,其他部分不都是彈窗的實現細節嗎,為啥不能封裝起來?

答案是可以的。下面就使用 render props 來寫一個Pop組件,封裝所有邏輯。希望的最終使用方式是:


<Pop>{({ Button, Modal }) => (<div><Button>Open</Button><Modal title="Simple" onOK={() => alert("everything is OK")}><p>Some contents...</p><p>Some contents...</p><p>Some contents...</p></Modal></div>)}</Pop>
大家可以先嘗試自己寫一下。我寫的如下:


import { Modal, Button } from 'antd';class Pop extends React.Component {state = { on: false };toggle = () => this.setState({ on: !this.state.on });// 將antd 組件包裹上狀態和方法MyButton = props => <Button {...props} onClick={this.toggle} />;MyModal = ({ onOK, ...rest }) => (<Modal{...rest}visible={this.state.on}onOk={() => {onOK && onOK();this.toggle();}}onCancel={this.toggle}/>);render() {return this.props.children({on: this.state.on,toggle: this.toggle,Button: this.MyButton,Modal: this.MyModal});} }

完整的Demo

簡單的說,render props 將如何render組件的事代理給了使用它的組件,但同時以參數的形式提供了需要重用的狀態和方法給外部。實現UI的自定義和功能的重用。不過這個例子有點激進,不僅提供了狀態和方法,還提供了帶狀態的組件作為參數。如果大家有不同意見,請務必留言,互相學習。

實例2: 一般的render props只封裝 “state”。React官方文檔上 Dan Abromov 給出了一個很好的例子:鼠標跟蹤的功能。這個功能有很多應用場景,也很好實現:



class Mouse extends React.Component {state = { x: 0, y: 0 }handleMouseMove = e => this.setState({ x: e.clientX, y: e.clientY })render() {return (<div style={{ height: '100vh' }} onMouseMove={this.handleMouseMove}><p>鼠標位于 ({this.state.x}, {this.state.y})</p></div>)} }
但如何封裝和重用這個功能呢?比如要寫一個貓的圖案跟著鼠標走。大家可以先試試。 答案如下:

// 封裝 class Mouse extends React.Component {state = { x: 0, y: 0 }handleMouseMove = (e) => this.setState({ x: e.clientX, y: e.clientY })render() {return (<div style={{ height: '100%' }} onMouseMove={this.handleMouseMove}>{this.props.children(this.state)}</div>)} } // 重用 const Cat = () => <Mouse>{({x,y}) => <img src="/cat.jpg" style={{ position: 'absolute', left: x, top: y }} />}<Mouse>

結語

如果太長沒看的話,只有一句是我最想分享的:當你寫項目時碰到需要重用的是功能不是UI時,試著用render props封裝一個組件吧。當然 HOC 也是解決方法,不過關于 HOC vs render props 的討論,下篇再寫。


原文發布時間為:2018年06月25日
原文作者:FateRiddle
本文來源:?掘金?如需轉載請聯系原作者 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的React拾遗:Render Props及其使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中国黄色三级视频 | 亚洲黄v | 中国女人性猛交 | 欧美50p| 国产精品视频一二三 | 8x8ⅹ8成人免费视频观看 | 91免费黄视频 | 男女日皮视频 | 91美女片黄在线观看91美女 | 久久sp | 日韩在线专区 | 伊人网站在线观看 | 欧洲精品一区二区三区久久 | 在线观看欧美亚洲 | 国产精品久久久久久 | 一区二区在线视频观看 | 激情片网站 | www男人天堂 | 久久99精品国产麻豆婷婷洗澡 | 国产视频综合 | 亚洲天堂2015 | 国产又粗又长又大 | 久久久久久视 | 久久精品老司机 | 老版k8经典电影 | av中文天堂在线 | 黄色成人毛片 | 国产精品久久亚洲 | 亚洲免费三级 | 国产亚洲性欧美日韩在线观看软件 | 欧美日免费 | 欧美激情一区二区三区免费观看 | 日韩在线黄色 | 一级片一级片 | 国产a不卡 | 欧美日本一道本 | 九九热国产精品视频 | 在线小视频 | 激情五月婷婷综合 | 伊人激情影院 | 久久精品电影网 | 欧美三级电影在线观看 | 女性向小h片资源在线观看 日本天天操 | 最近日本中文字幕 | 日韩在线你懂的 | 亚洲免费在线看 | 98在线视频 | 日韩精品1区2区 | 久久精品大片 | 少妇xxx| 久久精品国产视频 | 亚洲一区二区自拍 | 亚洲怡春院 | 日韩精品免费一区二区 | 美腿丝袜亚洲综合 | 欧美日韩69 | 国产一区二区三区电影在线观看 | 91视| 超碰在线播放97 | a天堂中文网 | 久久国内精品 | 久一国产| 黄色国产在线观看 | 销魂美女一区二区 | 蜜桃久久av一区 | 日本免费小视频 | 色哟哟精品一区 | 亚洲国产精品自拍 | 亚洲天堂五码 | 亚洲一级片在线观看 | 无码人妻精品一区二区三区66 | 99在线精品免费视频 | 婷婷综合另类小说色区 | 一级黄色片在线 | 欧美日韩在线播放三区四区 | 中文欧美日韩 | 羞羞答答av | 日韩一级片av | 精品国产欧美一区二区三区成人 | 精品视频一二区 | 97人妻精品一区二区 | 亚洲欧美精品一区二区三区 | 99精品小视频 | 四虎精品在永久在线观看 | 伊人久久综合影院 | 精品日韩中文字幕 | 日日夜夜天天干 | 色图一区 | 亚洲精品欧美精品 | 欧美精品免费视频 | 午夜少妇av | 韩日三级视频 | 亚洲一区二区高清 | 亚洲精品一区二区三区在线观看 | 毛片女人 | 玉足调教丨vk24分钟 | 天天想你在线观看完整版电影免费 | 日日夜夜中文字幕 | 91在线网站 |