react-redux 时 Redux 官方提供的 React 绑定库。
需要将 React 和 Redux 搭配使用,就需要 React 组件可以根据 Redux 中存储的状态(Store)更新视图(View)。并且可以改变状态(Store)。
其实 react-redux 主要就完成了两件事:
stor 传入根组件的 context 中,使子节点可以获取到 statestore.subscribe 订阅 store 的变化,更新组件另外还有对于性能的优化,减少不必要的渲染。
随着项目越大,如果将所有状态的 reducer 全部写在一个函数中,将会 难以维护;
可以将 reducer 进行拆分,也就是 函数分解,最终再使用combineReducers()进行重构合并;
由于 reducer 是一个严格的纯函数,因此无法在 reducer 中进行数据的请求,需要先获取数据,再dispatch(Action) 即可。
需要通过中间件实现异步行为:
视图层绑定引入了几个概念:
<Provider> 组件:这个组件需要包裹在整个组件树的最外层。这个组件让根组件的所有子孙组件能够轻松的使用 connect() 方法绑定 storeconnect() 高阶组件:这是 react-redux 提供的一个方法。如果一个组件想要响应状态的变化,就把自己作为参数传给 connect() 的结果,connect() 方法会处理与 store 绑定的细节,并通过 selector 确定该绑定 store 中哪一部分的数据selector:这是你自己编写的一个函数。这个函数声明了你的组件需要整个 store 中哪一部分数据作为自己的 propsdispatch:每当你想要改变应用中的状态时,你就要 dispatch 一个 action,这也是唯一改变状态的方法Provider:接收从 Redux 而来的 store,以供子组件使用Connect:高阶组件,当组件需要获取或者想要改变 store 的时候使用mapStateToProps:获取 store 应用状态数据,通过 props 注入关联组件mapDispatchToProps:当组件调用时使用 dispatch 触发对应的 actionmergeProps:可以在其中对 mapStateToProps、mapDispatchToProps 的结果进一步处理options:其余配置项API 原型
<Provider store>
使组件层级中的 connect() 方法能够获得 Redux 中的 store。通常情况下我们需要将根组件嵌套在标签中才能使用 connect() 方法。
import React from 'react';import ReactDOM from 'react-dom';import { Provider } from 'react-redux';import { App } from './App';import createStore from './createReduxStore';const store = createStore();ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root'));
API 原型:
connect([mapStoreToProps], [mapDispatchToProps], [mergeProps], [options])
mapStoreToProps:相当于一个过滤器函数,将 Store 中的某些或全部状态,以 Props 的形式传入将被包裹的子组件中mapDispatchToProps:自定义以 Props 传递到包裹子组件中的函数,可以使用函数传入的 dispatch 和 ownProps 参数mergeProps:用于自定义 ownProps、stateProps 和 dispatchprops 的合并组合顺序及方法等import * as actionCreators from './actionCreators';function mapStateToProps(state) {return {todos: state.todos,};}function mergeProps(stateProps, dispatchProps, ownProps) {return Object.assign({}, ownProps, {todos: stateProps.todos[ownProps.userId],addTodo: (text) => dispatchProps.addTodo(ownProps.userId, text),});}export default connect(mapStateToProps, actionCreators, mergeProps)(TodoApp);
连接 React 组件与 Redux store,连接操作会返回一个新的与 Redux store 连接的组件类,并且连接操作不会改变原来的组件类。
react-redux 提供了 connect 函数,connect 是一个高阶函数,首先传入 mapStateToProps 和 mapDispatchToProps,然后返回一个生产 Component 的函数(wrapWithConnect),然后再将真正的 Component 作为参数传入 wrapWithComponent(MyComponent),这样就生产出一个经过包裹的 Connect 组件。
例如:
export default connect(mapStateToProps)(HomePage);