網站首頁 編程語言 正文
介紹
-
Render Props
是指在React組件之間使用一個值為函數
的prop共享代碼的技術 - 具有
render prop
的組件接受一個返回React元素的函數
,并在組件內部通過調用此函數來實現自己的渲染邏輯 - 主要用于抽離邏輯,進行代碼復用
使用
以官方文檔的Mouse & Cat
示例為例
- 創建
Mouse
組件,此組件僅用于提供復用的狀態邏輯代碼(狀態、方法等) - 將復用的狀態作為
props.render(state)
方法的參數,暴露到組件外部 - 使用
props.render()
的返回值作為要渲染的內容
import React from 'react' class Mouse extends React.Component { // 省略操作方法 render(){ return this.props.render(this.state) } } //根組件 export default class App extends React.Component { render(){ <Mouse render={ mouse => ( <div>當前鼠標位置 {mouse.x} {mouse.y}<div> )}/> //此處的mouse參數實際上為Mouse組件的state,因為這個函數是在Mouse組件的render()中傳參調用的 } }
注意:并不是該模式名叫render props
就一定要用名為render
的prop
。你可以使用任意名稱的prop
,它只是一個接收返回React元素的函數的prop
。
實際上,視圖是由父組件傳入的返回React元素的函數決定的,Mouse
組件中的render()
生命周期函數只是調用這個由prop
傳入的函數,并由該函數返回視圖
使用children prop代替render prop
也可以使用組合模式來實現組件間的代碼重用,該方法類似于Vue中Slot
的概念
import React from 'react' class Mouse extends React.Component { // 省略操作方法 render(){ return this.props.children(this.state) } } //根組件 export default class App extends React.Component { render(){ <Mouse> { mouse => ( <div>當前鼠標位置 {mouse.x} {mouse.y}<div> )} </Mouse> } }
由于這一技術需要向組件傳遞一個函數,所以推薦對children
進行類型檢查
import PropTypes from 'prop-types' Mouse.propTypes = { children: PropTypes.func.isRequired }
Render props 與 React.PureComponent 同時使用
注意
如果在render
方法中創建函數,那么使用render prop
會抵消使用React.PureComponent
帶來的優勢
因為每次調用render()
進行渲染時都會創建一個新的函數,這將導致淺比較props
的時候prevProps === nextProps
始終為false
class Mouse extends React.PureComponent { // 與上面相同的代碼...... } class MouseTracker extends React.Component { render() { return ( <div> <Mouse render={mouse => ( <Cat mouse={mouse} /> )}/> </div> ); } }
在這個示例中,由于Mouse
組件的render prop
傳輸的函數是在render()
中定義的,這將導致每次MouseTracker
渲染時生成一個新的函數作為Mouse
組件的render prop
,因而抵消了繼承自React.PureComponent
的效果
解決方案
為了解決這一問題,可以定義一個實例方法傳給render prop
class MouseTracker extends React.Component { // 定義為實例方法,`this.renderTheCat`始終 // 當我們在渲染中使用它時,它指的是相同的函數 renderTheCat(mouse) { return <Cat mouse={mouse} />; } render() { return ( <div> <h1>Move the mouse around!</h1> <Mouse render={this.renderTheCat} /> </div> ); } }
原文鏈接:https://blog.csdn.net/m0_52761633/article/details/123009406
相關推薦
- 2022-07-20 spring boot 配置文件
- 2022-10-06 修復python-memcached在python3.8環境中報SyntaxWarning的問題(完
- 2022-02-17 Chrome瀏覽器/Jupyter lab下載文件提示已經被禁止
- 2022-12-07 C++中的自定義函數返回類型_C 語言
- 2022-04-08 Python實現自定義異常實例_python
- 2022-07-09 C++深入淺出講解隱藏this指針的用法_C 語言
- 2022-04-26 JQuery實現電梯導航特效_jquery
- 2022-12-24 React重新渲染超詳細講解_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支