为什么 react 上下文需要一个提供者?

问题描述 投票:1回答:1

上下文状态可以只是一个可观察的状态,并像观察者模式一样更新订阅的组件。

如果你需要组件中的上下文状态,只需要订阅一个特定的上下文即可。

为什么我们需要在应用程序的根部呈现上下文提供者,以便在其他地方使用它?

我问这个问题是因为我看到很多库和应用程序现在使用上下文作为组件之间共享状态的主要方式,但我不明白为什么需要在应用程序的根部渲染提供者,因为每个共享状态(上下文)可以在渲染函数之外进行初始化。

我做了一个npm包,做了一些类似的事情,以简化应用程序的上下文共享状态,作为一个例子,我的意思。

https:/www.npmjs.compackagejstates还有一个反应绑定的包https:/www.npmjs.compackagejstates-react

reactjs
1个回答
2
投票

原因是IMHO是recat试图遵循一个范式,你没有全局状态。一般来说,你希望状态尽可能的本地化。这允许更好的测试,在那里你可以很容易地将模拟状态反馈到提供者。

如果你有一个全局对象,每个人都会订阅,那就不清楚状态来自哪里。有了上下文提供者,这就非常清楚了,状态被封装在组件树中(没有全局对象)。


1
投票

Context API必须支持同一上下文提供者的多个实例(例如,当把项目的一部分迁移到某个库的新版本时)。

即使使用Context的库最常见的是 用过的 为单子(用于管理全局状态),当 用React思考,作者需要支持可组合的Components,而不仅仅是全局单子。在可行的情况下,React API设计也更倾向于Components,而不是其他模式(如 <Suspense /><Provider />但不是生命周期钩子)。)

当设计支持多个实例时,为了便于调试(更多的约束==更少的可能出错的东西),最好采用一些控制反转的模式。

因此,React Components树中的显式可见性是比较好的(注意,即使是生命周期方法和钩子在树节点细节中也是可见的--但你只需要看到单个节点的这些,而不是识别 "所有能够访问这个上下文的子节点")。

© www.soinside.com 2019 - 2024. All rights reserved.