简单理解高阶组件
2022-11-19
520 字约 2 分钟
...什么是高阶组件
高阶组件是包装了另一个React组件的React组件
怎么理解高阶组件
可以简单将其理解成 “类工厂”
将一些可复用的逻辑写在高阶组件中,把一个普通组件传入高阶组件,通过返回值的形式,将处理好的组件return出来
即:高阶组件为一个函数,接收一个组件作为参数,并且返回值为一个新组件
`function HOC (OneComponent) {
return class NewComponent extends Component {
render() {
return <OneComponent {...this.props} />
}
}
}`
高阶组件的目的
将可复用的逻辑进行组件化封装,更好的将逻辑与 UI 分离
让我们在增强原有组件的功能的同时,不破坏组件原有的特性
`// 通过高阶组件给基础组件添加新属性
function HOC (OneComponent) {
return class NewComponent extends Component {
const newProps = {
id: 1,
name: '张三'
}
render() {
return <OneComponent {...this.props} {...newProps} />
}
}
}
// 可以在 OneComponent 中,通过this.props.id/this.props.name去获取新添加的属性`
`// 通过高阶组件给基础组件添加新方法
function HOC (OneComponent) {
return class NewComponent extends Component {
constructor(props) {
super(props)
this.state = {
count: 0 // 定义一个私有属性
}
}
const add = () => {
this.setState({
count: this.state.count + 1
})
}
const newProps = {
num: this.state.count,
add: () => this.add()
}
render() {
return <OneComponent {...this.props} {...newProps}/>
}
}
}
// 通过HOC这个高阶组件,给基础组件添加了一个'num'属性和'add'这个方法`
demo
场景:
简单计数器:在页面记录总数,给出两个按钮,一个控制总数加,一个控制总数减
方案一:
通过高阶组件的形式实现
`// 主函数
// 这里直接解构props
const Main = ({count, add, minus}) => {
return (
<div>
<p>当前总数{count}</p>
<button onClick={() => add()}>加</button>
<button onClick={() => minus()}>减</button>
</div>
)
}
export default HOC(Main)`
`// 高阶组件函数
const HOC = (OneComponent) => {
return class NewComponent extends Component {
constructor(props) {
super(props)
this.state = {
count: 0 // 总数
}
// 点击事件:总数加一
const add = () => {
this.setState({
count: this.state.count + 1
})
}
// 点击事件:总数减一
const minus = () => {
this.setState({
count: this.state.count - 1
})
}
render() {
// 通过props的方式传出
return <OneComponent
{...this.props}
count={this.state.count}
add={() => this.add()}
minus={() => this.minus()}
/>
}
}
}
}`
优点:
`* 更方便的实现相同逻辑的复用,可以直接给其他组件反复使用
* 通过高阶组件的state,驱动无状态组件的数据刷新,实现逻辑和UI分离,代码清晰`
缺点:
`* 对属性名称限制大,若同样功能,属性名称不一致,就导致高阶组件失效`
方案二:
通过自定义Hooks的方式实现
`// 主函数
const Count = () => {
const [count, add, minus] = useCount()
return (
<div>
<p>当前总数{count}</p>
<button onClick={() => add()}>加</button>
<button onClick={() => minus()}>减</button>
</div>
)
}`
`// 自定义hook
const useCount = () => {
// 初始化总数值
const [count, setCount] = useState(0)
// 点击事件:总数加一
const add = () => {
setCount(count => count + 1)
}
// 点击事件:总数减一
const minus = () => {
setCount(count => count - 1)
}
// 将属性值和方法导出
return [
count,
add,
minus
]
}`
优点:
- 代码量减少,逻辑相对清晰
- 结构相对于高阶组件更加简单明了
- 不受属性名称限制
个人总结:
高阶组件是在使用class组件时,state被定义在了内部,导致逻辑上的复用困难,才出现的一种设计模式。
但是在新版的React中,整个React社区都在推崇函数式的编程方式,所以Hooks的学习就变得重要起来。一些简单的逻辑复用完全可以使用Hooks去实现,避免使用高阶组件使组件变得极其复杂。
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →react2025-12-02
useEffect与useLayoutEffect对比
在 React Hooks 中, 和 都用于处理副作用逻辑,例如订阅、事件监听、DOM 操作等。但它们有着本质性的执行时机差异,这影响到页面渲染、布局抖动、性能表现等关键点。 1\. 执行时机的核心区别 在 React 的渲染流程中: 1. 渲染(Render phase) React 根据 state/props 计算 UI,生成虚拟 DOM,不访问真实 DOM。 2. 提交(Commit phase) React 将虚拟 DOM 变...
学习
react2025-08-03
在 React 中实现倒计时功能会有什么坑
倒计时 倒计时是一个非常常见的业务场景,但是在 React 中实现起来,却不算简单。 首先我们来看这段倒计时代码,它能否正常执行? 来看看实际表现效果 可以看到计时器在不断执行,但是 的值却没有变。 这是一个很经典的问题:React 闭包陷阱 。 我们来详细分析下: 的依赖数组 是空的,这意味着 effect 只会在组件挂载时执行一次,而不会在 状态更新时重新执行。所以 回调函数中捕获的 值始终是初始值 。 这个问题解决起来也很简单,有...
学习面试
react2025-07-30
React性能优化三剑客:memo、useMemo和useCallback详解
前言 在React开发中,性能优化是一个永恒的话题。今天我们就来深入探讨React提供的三个重要性能优化工具: 、 和 ,它们如何帮助我们构建更高效的React应用。 1\. 为什么需要性能优化? 🤔 React的核心机制是当组件的state或props发生变化时,组件会重新渲染。但有时这种重新渲染是不必要的: 父组件更新导致所有子组件重新渲染 ,即使子组件的props没有变化 复杂计算在每次渲染时重复执行 ,消耗大量资源 函数引用在...
学习面试
react2025-06-05
React 中 useDeferredValue 和 startTransition 的核心区别与使用场景
React 中 和 ,两者都用于优化性能,但适用场景和实现方式不同。 核心概念解析 1\. useDeferredValue:延迟值更新 作用 :告诉 React 延迟更新某个值 ,直到所有高优先级渲染任务完成。 适用场景 :当某个值的更新会触发计算密集型渲染(如复杂列表、图表),但需要优先保证其他高优先级 UI(如输入框)的响应。 机制 : 保持旧值显示,后台计算新值。 计算完成后,用新值更新 UI,期间允许用户继续交互。 示例 :...
学习
react2024-12-18
Antd 样式覆盖
目前作者所在的业务正在升级 Antd5.0,不得不说 Antd5.0 真的太香了,但是由于团队的 UE 规范进行了大改版,Antd5.0 所有的 必须对齐最新的规范,因此就需要对 Antd5.0 组件做主题定制。 现状 目前针对项目中使用的 antd 高频组件进行了梳理,并且根据规范基于 design token 对这些高频组件进行样式定制,对于主题色、圆角、边框、字体等用户 高的主题都已经满足团队规范。 虽然 Desig...
学习
react2024-12-06
React 19 终于发布,一大波新功能正式升级
这篇文章主要介绍了 React 19 的新功能,包括 Actions 自动处理数据突变相关状态,新增的 useActionState、useFormStatus、useOptimistic 等 hook,新的 use API 读取渲染资源,新的 React DOM 静态 API 生成静态站点,以及 React 服务器组件中的 RSC 和 RSA 等内容。同时提到后续会分享针对旧版功能的优化和改良。 关联问题: React 19 性能如何...
学习面试
评论
请登录后发表评论
去登录