从 Prop Drilling 到 Context:React 状态管理的演进与抉择

Context的出现解决了什么问题?

Vue中的provide/inject和React中的Context非常相似,具体区别如下:

在这里插入图片描述

可以看到实际上最大的区别在于Vue是响应式,React是非响应式

那么context具体解决了什么问题?我们先看下面这个例子:

function ComponentA() {
  const count = 10;
  return <ComponentB count={count} />
}

function ComponentB({ count }) {
  return <ComponentC count={count} />
}

function ComponentC({ count }) {
  return <ComponentD count={count} />
}

function ComponentD({ count }) {
  return <ComponentE count={count} />
}

function ComponentE({ count }) {
  return <div>{count}</div>
}

这种层层传递的形式就是典型的prop drilling (prop下钻),会产生什么问题?

1.性能损耗(props改变会导致所有传递组件重新渲染)

2.难以维护(这个就不用多说了吧,可读性很差)

3.心智负担(react经典问题)

**那使用Context足够完美吗?**当然是不够,Context依旧有性能损耗问题,Context中任意的属性变化会引起所有使用该Context的组件发生re-render(重新渲染),及无法只订阅局部变量,如何解决:
1.拆分Context,保证每个组件有属于自己的独立依赖空间且各组件间互不影响。

2.使用memo或者useMemo包裹组件(常见的react优化)。

为什么有Context还需要状态管理库,区别是什么?

根据上文我们可以知道context在优化是可以满足全局状态管理的需求的,那为什么还是要使用zustand这种状态管理库呢?

Context 可以实现全局状态管理,但优化(如避免重复渲染)会增加代码复杂度和心智负担,且功能性有限。Zustand 提供选择性订阅、异步支持等特性,易用性更强。

Context 依赖组件树,耦合度高,而 Zustand 独立于组件树,灵活性更高。Context 优势在于轻量、无依赖,适合简单场景。

状态管理库与设计模式

redux的核心是发布订阅模式,而zustand等大部分状态管理库的核心是观察者模式。

如何理解观察者模式?vue的响应式核心就是使用的观察者模式,一个观察者和多个被观察者直接通信,耦合度较高;发布订阅模式其实就是观察者模式的升级,多了一个用于派发的中间件(事件总线),发布者和订阅者不直接通信,耦合度较低;

redux和zustand有什么区别

redux的核心是发布订阅模式,zustand核心是观察者模式,从设计模式角度,redux比zustand多了事件总线用来派发任务,在任务量大的情况下由于发布订阅模式的中间件及事件派发会像虚拟dom一样造成一定的性能损耗,所以性能不如观察者模式,延迟也相对较高。

所以zustand就像一个功能性更强的全局useState更加轻量易用适合中小型项目,而redux更适合像企业级电商那种需要大量且复杂状态管理的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mebius1916

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值