浅谈 React 逻辑复用的几种方式

发布于 2023-09-30 05:50:29 字数 1402 浏览 42 评论 0

平时写 React,一旦发现业务逻辑有重复比较多的地方,我们就需要考虑拆分复用。在 React Hooks 没出现前,复用组件逻辑通常有 高阶组件render props 以及 有状态和无状态 几种方式。

高阶组件

所谓高阶组件(Higher Order Function),就是在函数里接收组件作为参数,然后包装一些自定义逻辑后返回新的组件。比如下面这个:

import utils from './utils'
const withDataProps = (WrappedComponent) => {
  const data = utils.getData()
  return (props) => (
      <WrappedComponent data={data} />
  )
}

可以看到,高阶组件能做的事情就是,接收一个组件,然后添加需要复用的逻辑作为 props 传给组件,最后返回一个新的包装后的组件。比如你现在同时有 A,B,C 三个组件需要用到上面这个 data,那你就可以直接调用 withDataProps 这个高阶组件:

const newComponentA = withDataProps(A)
const newComponentB = withDataProps(B)
const newComponentC = withDataProps(C)

render props

render props 跟高阶组件的区别在于 它是组件里接收 props 函数并作为子组件渲染 。它的基本思想是在 React 组件里通过调用 props 里某个属性,这个属性必须是个函数,然后函数必须返回一个 React 组件,通过 props 实现组件间的通信。比如下面这样:

import utils from './utils'
const withDataProps = (props) => {
  const data = utils.getData()
  return (
    <React.Fragment>
      {props.renderData({...props, data})}
    </React.Fragment>
  )
}

然后这样使用它:

<withDataProps
  renderData={(props) => {
    const {data} = props
    return <A data={renderData} />
  }}
/>

相比高阶组件,render props 更加灵活,因为它是通过 props 接收逻辑,这意味着组件可以选择性地接收一部分数据。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文