浅谈 React 逻辑复用的几种方式
平时写 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论