title version
react & react-dom ≥ 16.8.0
concent 2.20.7

在逐步深入理解 React 整体架构发现的状态管理库之一。

与其它状态管理库不同的是 concent 提出的几个关键概念:

title desc
依赖标记 基于注解实现的为组件实例提供的用户配置标记方法
引用收集 收集组件实例信息并封装特有上下文对象到 concent 管理的全局上下文
状态分发 经由全局上下文对象,将单个组件实例的状态更新派发到指定的若干个组件实例的过程

依赖标记指 concent 通过 register 注解标记被收集的 React ClassComponent 实例。该注解支持若干属性配置。在收集实例和用户配置属性以后,通过反向继承的方式构建基于原有实例的新 HOC(高阶组件)。

Untitled

上述 HOC(被注册组件实例返回的高阶组件)用于为 concent 的全局上下文 ccContext 提供一个与 HOC 集合一一对应的实例上下文对象 ctx。这一步称为引用收集。

这里的 ccContext 类似于 Spring 的应用上下文对象 ApplicationContext。 具体来讲,Spring 通过 BeanFactory 完成 Bean(通过 BeanDefinition 及其子类型定义的各种对象)的生产,并交由其子类型 ApplicationContext 负责进一步的扩展,例如事件发布。

我将其类比到 ccContext 的状态分发,Bean 对应到 react 组件,BeanDefinition 对应 register 注解提供的配置对象。那么 concent 是如何通过 ccContext 完成状态分发?需要回到 register 注解方法返回的 HOC。在 HOC 看到代码 this.ctx.reactSetState = hf.makeRefSetState(this); 对劫持 setState 的实现。这里意味着 concent 对 setState 方法的逻辑注入。因为被注册的实例上下文对象都被 ccContext 持有,当用户执行被劫持的 setState 时,将经由 ccContext 并派发到其持有的其它实例对象。

因为 concent 实现类似 IOC 容器的机制,除状态派发,它还完成一系列的性能增强,例如官方提到的精确渲染 renderKey、合并 reducer states 更新的 lazyDispatch 等等。