登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025 年度开源项目评选中
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册