2、Redux 的绑定

在一个大型的项目中,类似 Redux 的数据流框架是很有必要的,下面我们来演示下怎么样在这个简单的 Demo 中引入 Redux 来管理它的数据。首先安装 Redux 相关的依赖:

  1. npm i redux react-redux redux-thunk redux-logger -S

创建 store 对象,在 src/page 目录下创建 store.js 文件,这里添加了让 action 能支持异步的 redux-thunk 和方便在开发时候调试的 redux-logger 包。

  1. import { createStore, applyMiddleware } from 'redux';
  2. import thunk from 'redux-thunk';
  3. import { createLogger } from 'redux-logger';
  4. import rootReducer from '../reducers';
  5. const middleware = [thunk];
  6. if (process.env.NODE_ENV !== 'production') {
  7. middleware.push(createLogger()); // 非线上环境加载
  8. }
  9. const store = createStore(
  10. rootReducer,
  11. applyMiddleware(...middleware)
  12. );
  13. export default store;

然后修改下入口文件 index.js,将该 store 绑定到根组件上。

  1. import { Provider } from 'react-redux';
  2. import store from './store';
  3. ReactDOM.render(
  4. <Provider store={store}>
  5. <Root />
  6. </Provider>,
  7. document.getElementById('root')
  8. );

接下来,我们在 src 目录下创建一个 reducers 目录并在该目录下新建 index.js 文件作为根 Reducer,再把 Demo 中 List 数据相关的代码复制过来,此时的代码如下:

  1. let guid = -1;
  2. function getArrayByLength(length) {
  3. var ret = [];
  4. for (var i = 0; i < length; i++) {
  5. ret[i] = null;
  6. }
  7. return ret;
  8. }
  9. function getRandomList(size) {
  10. return getArrayByLength(size).fill(1).map(num => parseInt(Math.random() * 100));
  11. }
  12. function getRandomDataSource(size) {
  13. return getRandomList(size).map(num => ({ text: num, key: ++guid }));
  14. }
  15. export default (state = {
  16. list: getRandomDataSource(25)
  17. }, action) => {
  18. const { type, payload } = action;
  19. switch (type) {
  20. default: {
  21. return state;
  22. }
  23. }
  24. };

现在让我们回到列表页,引入 react-redux 的 connect 方法并将 Redux 的数据绑定到组件的 props 中去。

  1. import { connect } from 'react-redux';
  2. ...
  3. const mapStateToProps = state => ({
  4. list: state.list
  5. });
  6. export default connect(
  7. mapStateToProps,
  8. null
  9. )(Detail);

将 List 的 dataSource 属性值置为 props 中绑定的 Redux 数据项,此时 List 的初始数据项就是通过 Reducer 中得到的数据了。

  1. render() {
  2. const { list } = this.props;
  3. return {
  4. <List
  5. dataSource={list}
  6. >
  7. ...
  8. </List>
  9. }
  10. }