首页 > 其他分享 >React 高阶组件、Render props、hooks 有什么区别?

React 高阶组件、Render props、hooks 有什么区别?

时间:2024-03-05 17:46:38浏览次数:30  
标签:Render render hooks React hook props 组件 hoc

这三者是目前 react 解决代码复用的主要方式:

高阶组件(hoc)

官方解释: 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而 形成的设计模式。

简言之,HOC 是一种组件的设计模式,HOC 接受一个组件和额外的参 数(如果需要),返回一个新的组件。HOC 是纯函数,没有副作用。

// 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));

HOC 的优缺点∶
优点∶ 逻辑服用、不影响被包裹组件的内部逻辑。
缺点∶ hoc 传递给被包裹组件的 props 容易和被包裹后的组件重名, 进而被覆盖

Render props

官方解释∶ "render prop"是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术。
具有 render prop 的组件接受一个返回 React 元素的函数,将 render 的渲染逻辑注入到组件内部。在这里,"render"的命名可以是任何其 他有效的标识符。

// DataProvider组件内部的渲染逻辑如下
class DataProvider extends React.Components {
     state = {
    name: 'Tom'
  }
<span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
    <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>
      <span class="token operator">&lt;</span>p<span class="token operator">&gt;</span>共享数据组件自己内部的渲染逻辑<span class="token operator">&lt;</span><span class="token operator">/</span>p<span class="token operator">&gt;</span>
      <span class="token punctuation">{<!-- --></span> <span class="token keyword">this</span><span class="token punctuation">.</span>props<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state<span class="token punctuation">)</span> <span class="token punctuation">}</span>
  <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>

}
}

// 调用方式
<DataProvider render={data => (
<h1>Hello {data.name}</h1>
)}/>

优点:数据共享、代码复用,将组件内的 state 作为 props 传递给调 用者,将渲染逻辑交给调用者。
缺点:无法在 return 语句外访问数据、嵌套写法不够优雅。

Hooks

官方解释∶ Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情 况下使用 state 以及其他的 React 特性。通过自定义 hook,可以 复用代码逻辑。

// 自定义一个获取订阅数据的hook
function useSubscription() {
  const data = DataSource.getComments();
  return [data];
}
// 
function CommentList(props) {
  const {data} = props;
  const [subData] = useSubscription();
    ...
}
// 使用
<CommentList data='hello' />

以上可以看出,hook 解决了 hoc 的 prop 覆盖的问题,同时使用的方 式解决了 render props 的嵌套地狱的问题。

hook 的优点如下∶ 使用直观; 解决 hoc 的 prop 重名问题; 解决 render props 因共享数据 而出现嵌套地狱的问题; 能在 return 之外使用数据的问题。
需要注意的是:hook 只能在组件顶层使用,不可在分支语句中使用。

总结∶ Hoc、render props 和 hook 都是为了解决代码复用的问题,但是 hoc 和 render props 都有特定的使用场景和明显的缺点。hook 是 react16.8 更新的新的 API,让组件逻辑复用更简洁明了,同时也解 决了 hoc 和 render props 的一些缺点。

标签:Render,render,hooks,React,hook,props,组件,hoc
From: https://www.cnblogs.com/mounterLove/p/18054519

相关文章

  • 自定义Hooks:四个典型的使用场景
    一、如何用好hook要用好ReactHooks,很重要的一点,就是要能够从Hooks的角度去思考问题。要做到这一点其实也不难,就是在遇到一个功能开发的需求时,首先问自己一个问题:这个功能中的哪些逻辑可以抽出来成为独立的Hooks?这样问的目的,是为了让我们尽可能的吧业务陆奥及拆分......
  • React的7个常用Hooks及使用场景(含示例)
    React是一款非常流行的JavaScript库,它提供了许多Hooks,用于管理函数组件的状态和生命周期。下面是React的每个Hooks的使用场景和示例:No1、useStateuseState用于在函数组件中管理状态。它返回一个包含当前状态和一个更新状态的函数的数组。更新状态的函数可以接受一个新的值......
  • Vue源码解读:render和VNode
    Vue2.0相比Vue1.0最大的升级就是利用了虚拟DOM。在Vue1.0中视图的更新是纯响应式的。在进行响应式初始化的时候,一个响应式数据key会创建一个对应的dep,这个key在模板中被引用几次就会创建几个watcher。也就是一个key对应一个dep,dep内管理一个或者多个watcher......
  • Graphics2D.drawRenderedImage
    importjava.awt.Graphics2D;//导入方法依赖的package包/类publicstaticvoidrenderTest(Graphics2Dg2d,intw,inth){g2d.setColor(Color.yellow);g2d.fillRect(0,0,w,h);BufferedImageimage=getTestImage();//draworiginalimageg2d......
  • ElementUI——elementui2.0表格支持render渲染
    前言当前项目基于vue2.0+elementui来实现的,所以简单封装一个表格支持render函数来自定义渲染;内容custom-column封装自定义列的组件varcustomColumn={functional:true,render:(h,data)=>{constparams={row:data.props.row,column:dat......
  • React项目升级
    一、前端框架(或者库)升级的原因:a、前端技术更新比较快,需要不断更新保持技术和依赖都和社区同步;b、新版脚手架对性能和开发体验都进行了很多优化,新版脚手架基于社区2021年的相对最优解决方案和依赖。如vite2.0、react17(相比react16版本有了核心实现的重构)等;二、详细描述要升级的......
  • react native工程打包成apk
    react-native工程打包成apk1.生成签名密钥使用jdk自带的keytool生成密钥以管理员身份运行如下命令keytool-genkey-v-keystoremy-test3-key.keystore-aliasmy-key-test3-keyalgRSA-keysize2048-validity10000其中my-test3-key.keystore为生成的密钥库文件(给Andr......
  • React基础-下
    React目录ReactReact表单控制受控表单绑定非受控绑定(React中获取DOM)React组件通信父子通信—父传子props说明特殊的propchildren父子通信—子传父兄弟组件通信使用Context机制跨层级组件通信React副作用管理—useEffect概念useEffect基础使用useEffect依赖说明......
  • uni-app的renderjs示例 | app端使用window
    原文:https://juejin.cn/post/6974552469917401125<template><viewstyle="padding-top:200rpx;"><!--这里的:change:msg旨在于监听逻辑层的msg变化,有变化就调用renderjs内容--><!--这里要注意,render。receiveMsg中的render是下面renderjs定义的module名称-->......
  • 【PR】3D Gaussian Splatting for Real-Time Radiance Field Rendering
    最近开始接触基于深度学习的渲染,记录下阅读过的论文。欢迎交流。 这篇论文的主要作者来自法国Inria(国家信息与自动化研究所)。发表在ACMTransactionsonGraphics。 本文主要介绍了一种使用辐射场(RadianceFieldmethods)进行新视角合成的方法:Gaussiansplatting(也有描述说这种......