认识
一、认识
1.1 Redux
Redux
基于发布订阅的模式, Redux
创建一个 store
, 保存了状态信息。 React
应用的 state
统一放在store
里面维护,当需要修改state
的时候,dispatch
一个 action
给reducer
,reducer
算出新的state
后,再将state
发布给事先订阅的组件。所有对状态的改变都需要dispatch
一个action
,通过追踪action
,就能得出state
的变化过程。整个数据流都是单向的,可检测的,可预测的。当然,另一个额外的好处是不再需要一层一层的传递props
了。
Redux
使用了 useReducer
自己维护 forceUpdate()
的 function
,但是后在之后使用了 useSyncExternalStoreWithSelector
取代作为触发渲染的 function
。
1.2 React-Redux
由于 Redux
通过在入口文件中进行订阅 store.subscribe(render)
之后, 在需要状态的组件中, 引入 store
文件即可访问、更新状态。那这样的话无法做到精确更新, 比如 A
组件需要状态 a
,B
组件需要状态 b
,那么改变 a
,只希望 A
组件更新,不希望 B
组件更新。所以, React-Redux
应运而生。
React-Redux
是连接 React
应用和 Redux
状态管理的桥梁, React-redux
主要专注两件事,一是如何向 React
应用中注入 redux
中的 Store
,二是如何根据 Store
的改变,把消息派发给应用中需要状态的每一个组件。
-
向
React
注入redux
中的Store
:Redux
提供了一个Provider
组件, 可以全局注入redux
中的store
,所以使用者需要把Provider
注册到根部组件中。Provider
作用就是保存redux
中的store
,分配给所有需要state
的子孙组件。 -
订阅
Store
中的state
变化, 派发给应用中需要状态的每一个组件:Redux
提供了一个高阶组件connect
, 被connect
包装后组件将获得如下功能:-
能够从
props
中获取改变state
的方法Store.dispatch
-
如果
connect
有第一个参数,那么会将redux state
中的数据,映射到当前组件的props
中,子组件可以使用消费 -
当需要的
state
,有变化的时候,会通知当前组件更 新,重新渲染视图
-
React-Redux
通过 Provider
组件解决了 Redux
状态共享的问题, 通过 connect
高阶组件订阅状态, 并通过传递第一个参数 mapStateToProps
来订阅具体依赖状态, 只有订阅具体的依赖状态发生变化, 才会触发业务组件更新视图。当这个参数没有的时候,当前组件不会订阅 store
的改变。
二、思想
2.1 中间件
redux
应用了前端领域为数不多的中间件 compose
, compose
实现如下:
const compose = (...funcs) => {
return funcs.reduce((f, g) => (x) => f(g(x)));
}
Redux
中间件可以用来强化 dispatch
函数。传统的 dispatch
是不支持异步的,但是可以针对 Redux
做强化,于是有了 redux-thunk
,redux-actions
等中间件
2.2 发布订阅
Redux
基于发布订阅的模式, Redux
创建一个 store
, 保存了状态信息。 React
应用的 state
统一放在store
里面维护,当需要修改state
的时候,dispatch
一个 action
给reducer
,reducer
算出新的state
后,再将state
发布给事先订阅的组件。所有对状态的改变都需要dispatch
一个action
,通过追踪action