登錄
註冊
開源
企業服務
高校版
搜索
幫助中心
使用條款
關於我們
開源
企業服務
高校版
私有雲
模力方舟
AI 队友
登錄
註冊
程式碼拉取完成,頁面將自動刷新
捐贈
捐贈前請先登錄
取消
前往登錄
掃描微信二維碼支付
取消
支付完成
支付提示
將跳轉至支付寶完成支付
確定
取消
Watch
不關註
關註所有動態
僅關註版本發行動態
關註但不提醒動態
3
Star
47
Fork
21
DreamCoders
/
CoderGuide
程式碼
Issues
1169
Pull Requests
0
Wiki
統計
流水線
服務
JavaDoc
PHPDoc
質量分析
Jenkins for Gitee
騰訊雲托管
騰訊雲 Serverless
悬镜安全
阿里雲 SAE
Codeblitz
SBOM
我知道了,不再自動展開
更新失敗,請稍後重試!
移除標識
內容風險標識
本任務被
標識為內容中包含有代碼安全 Bug 、隱私洩露等敏感信息,倉庫外成員不可訪問
React 高阶组件、Render props、hooks 有什么区别,为什么要不断迭代
待處理
#IAGAPU
陌生人
擁有者
創建於
2024-07-29 16:23
<p style="text-align: start;">这三者是目前react解决代码复用的主要方式:</p><ul><li style="text-align: start;"><strong>高阶组件(HOC):</strong>是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。</li><li style="text-align: start;"><strong>render props:</strong>是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术,更具体的说,render prop 是一个用于告知组件需要渲染什么内容的函数 prop。</li><li style="text-align: start;">通常,render props 和高阶组件只渲染一个子节点。让 Hook 来服务这个使用场景更加简单。这两种模式仍有用武之地,(例如,一个虚拟滚动条组件或许会有一个 renderltem 属性,或是一个可见的容器组件或许会有它自己的 DOM 结构)。但在大部分场景下,Hook 足够了,并且能够帮助减少嵌套。</li></ul><blockquote style="text-align: start;"><strong>1)HOC</strong> 官方解释∶ 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 <strong>React 的组合特性而形成的设计模式</strong>。</blockquote><p style="text-align: start;">简言之,HOC是一种组件的<strong>设计模式</strong>,HOC接受一个组件和额外的参数(如果需要),返回一个新的组件。<strong>HOC 是纯函数,没有副作用。</strong></p><p style="text-align: start;"><br></p><pre><code class="language-js">// hoc的定义 function withSubscription(WrappedComponent, selectData) { return class extends React.Component { constructor(props) { super(props); this.state = { data: selectData(DataSource, props) }; } // 一些通用的逻辑处理 render() { // ... 并使用新数据渲染被包装的组件! return <WrappedComponent data={this.state.data} {...this.props} />; } }; // 使用 const BlogPostWithSubscription = withSubscription(BlogPost, (DataSource, props) => DataSource.getBlogPost(props.id)); </code></pre><p style="text-align: start;">HOC的优缺点∶</p><ul><li style="text-align: start;">优点∶ 逻辑服用、不影响被包裹组件的内部逻辑。</li><li style="text-align: start;">缺点∶ hoc传递给被包裹组件的props容易和被包裹后的组件重名,进而被覆盖</li></ul><p style="text-align: start;"><strong>(2)Render props</strong> 官方解释∶</p><blockquote style="text-align: start;">"render prop"是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术</blockquote><p style="text-align: start;">具有render prop 的组件接受一个返回React元素的函数,将render的渲染逻辑注入到组件内部。在这里,"render"的命名可以是任何其他有效的标识符。</p><pre><code class="language-js">// DataProvider组件内部的渲染逻辑如下 class DataProvider extends React.Components { state = { name: 'Tom' } render() { return ( <div> <p>共享数据组件自己内部的渲染逻辑</p> { this.props.render(this.state) } </div> ); } } // 调用方式 <DataProvider render={data => ( <h1>Hello {data.name}</h1> )}/> </code></pre><p style="text-align: start;">由此可以看到,render props的优缺点也很明显∶</p><ul><li style="text-align: start;">优点:数据共享、代码复用,将组件内的state作为props传递给调用者,将渲染逻辑交给调用者。</li><li style="text-align: start;">缺点:无法在 return 语句外访问数据、嵌套写法不够优雅</li></ul><p style="text-align: start;"><strong>3)Hooks</strong> 官方解释∶</p><blockquote style="text-align: start;">Hook是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。通过自定义hook,可以复用代码逻辑。</blockquote>
<p style="text-align: start;">这三者是目前react解决代码复用的主要方式:</p><ul><li style="text-align: start;"><strong>高阶组件(HOC):</strong>是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。</li><li style="text-align: start;"><strong>render props:</strong>是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术,更具体的说,render prop 是一个用于告知组件需要渲染什么内容的函数 prop。</li><li style="text-align: start;">通常,render props 和高阶组件只渲染一个子节点。让 Hook 来服务这个使用场景更加简单。这两种模式仍有用武之地,(例如,一个虚拟滚动条组件或许会有一个 renderltem 属性,或是一个可见的容器组件或许会有它自己的 DOM 结构)。但在大部分场景下,Hook 足够了,并且能够帮助减少嵌套。</li></ul><blockquote style="text-align: start;"><strong>1)HOC</strong> 官方解释∶ 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 <strong>React 的组合特性而形成的设计模式</strong>。</blockquote><p style="text-align: start;">简言之,HOC是一种组件的<strong>设计模式</strong>,HOC接受一个组件和额外的参数(如果需要),返回一个新的组件。<strong>HOC 是纯函数,没有副作用。</strong></p><p style="text-align: start;"><br></p><pre><code class="language-js">// hoc的定义 function withSubscription(WrappedComponent, selectData) { return class extends React.Component { constructor(props) { super(props); this.state = { data: selectData(DataSource, props) }; } // 一些通用的逻辑处理 render() { // ... 并使用新数据渲染被包装的组件! return <WrappedComponent data={this.state.data} {...this.props} />; } }; // 使用 const BlogPostWithSubscription = withSubscription(BlogPost, (DataSource, props) => DataSource.getBlogPost(props.id)); </code></pre><p style="text-align: start;">HOC的优缺点∶</p><ul><li style="text-align: start;">优点∶ 逻辑服用、不影响被包裹组件的内部逻辑。</li><li style="text-align: start;">缺点∶ hoc传递给被包裹组件的props容易和被包裹后的组件重名,进而被覆盖</li></ul><p style="text-align: start;"><strong>(2)Render props</strong> 官方解释∶</p><blockquote style="text-align: start;">"render prop"是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术</blockquote><p style="text-align: start;">具有render prop 的组件接受一个返回React元素的函数,将render的渲染逻辑注入到组件内部。在这里,"render"的命名可以是任何其他有效的标识符。</p><pre><code class="language-js">// DataProvider组件内部的渲染逻辑如下 class DataProvider extends React.Components { state = { name: 'Tom' } render() { return ( <div> <p>共享数据组件自己内部的渲染逻辑</p> { this.props.render(this.state) } </div> ); } } // 调用方式 <DataProvider render={data => ( <h1>Hello {data.name}</h1> )}/> </code></pre><p style="text-align: start;">由此可以看到,render props的优缺点也很明显∶</p><ul><li style="text-align: start;">优点:数据共享、代码复用,将组件内的state作为props传递给调用者,将渲染逻辑交给调用者。</li><li style="text-align: start;">缺点:无法在 return 语句外访问数据、嵌套写法不够优雅</li></ul><p style="text-align: start;"><strong>3)Hooks</strong> 官方解释∶</p><blockquote style="text-align: start;">Hook是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。通过自定义hook,可以复用代码逻辑。</blockquote>
評論 (
0
)
登錄
後才可以發表評論
狀態
待處理
待處理
進行中
已完成
已關閉
負責人
未設置
標籤
React
未設置
標籤管理
里程碑
未關聯里程碑
未關聯里程碑
Pull Requests
未關聯
未關聯
關聯的 Pull Requests 被合併後可能會關閉此 issue
分支
未關聯分支
未關聯分支
master
開始時間   -   結束時間
-
置頂選項
不置頂
置頂等級:高
置頂等級:中
置頂等級:低
優先級
不指定
嚴重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
點此查找更多幫助
搜索幫助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
評論
倉庫舉報
回到頂部
登錄提示
該操作需登錄 Gitee 帳號,請先登錄後再操作。
立即登錄
沒有帳號,去註冊