https://www.jianshu.com/p/4af924709b35 https://www.redux.org.cn/docs/react-redux/api.html#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options

原理解析

首先connect之所以会成功,是因为Provider组件:

  • 在原应用组件上包裹一层,使原来整个应用成为Provider的子组件
  • 接收Redux的store作为props,通过context对象传递给子孙组件上的connect

    那connect做了些什么呢?

    它真正连接 Redux 和 React,它包在我们的容器组件的外一层,它接收上面 Provider 提供的 store 里面的 state 和 dispatch,传给一个构造函数,返回一个对象,以属性形式传给我们的容器组件。

connect是一个高阶函数,首先传入mapStateToProps、mapDispatchToProps,然后返回一个生产Component的函数(wrapWithConnect),然后再将真正的Component作为参数传入wrapWithConnect,这样就生产出一个经过包裹的Connect组件,被包裹的组件就可以使用this.props获取包裹组件的属性。

antdpro demo

分步表单

image.png

文件目录

image.png

index.js

  1. import { Card, Steps } from 'antd';
  2. import React, { Component } from 'react';
  3. import { PageHeaderWrapper } from '@ant-design/pro-layout';
  4. import { connect } from 'dva';
  5. import Step1 from './components/Step1';
  6. import Step2 from './components/Step2';
  7. import Step3 from './components/Step3';
  8. import styles from './style.less';
  9. const { Step } = Steps;
  10. class GiftSetting extends Component {
  11. getCurrentStep() {
  12. const { current } = this.props;
  13. switch (current) {
  14. case 'info':
  15. return 0;
  16. case 'confirm':
  17. return 1;
  18. case 'result':
  19. return 2;
  20. default:
  21. return 0;
  22. }
  23. }
  24. render() {
  25. const currentStep = this.getCurrentStep();
  26. let stepComponent;
  27. if (currentStep === 1) {
  28. stepComponent = <Step2 />;
  29. } else if (currentStep === 2) {
  30. stepComponent = <Step3 />;
  31. } else {
  32. stepComponent = <Step1 />;
  33. }
  34. return (
  35. <PageHeaderWrapper content="将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成。">
  36. <Card bordered={false}>
  37. <>
  38. <Steps current={currentStep} className={styles.steps}>
  39. <Step title="填写转账信息" />
  40. <Step title="确认转账信息" />
  41. <Step title="完成" />
  42. </Steps>
  43. {stepComponent}
  44. </>
  45. </Card>
  46. </PageHeaderWrapper>
  47. );
  48. }
  49. }
  50. const mapStateToProps = ({ giftSystemAndgiftSetting }) => {
  51. console.log(giftSystemAndgiftSetting, "--------")
  52. return {
  53. current: giftSystemAndgiftSetting.current,
  54. }
  55. }
  56. export default connect(
  57. mapStateToProps
  58. )
  59. (GiftSetting);

model

import { fakeSubmitForm } from './service';

const Model = {
  namespace: 'giftSystemAndgiftSetting',
  state: {
    current: 'info',
    step: {
      payAccount: 'ant-design@alipay.com',
      receiverAccount: 'test@example.com',
      receiverName: 'Alex',
      amount: '500',
    },
  },
  effects: {
    *submitStepForm({ payload }, { call, put }) {
      yield call(fakeSubmitForm, payload);
      yield put({
        type: 'saveStepFormData',
        payload,
      });
      yield put({
        type: 'saveCurrentStep',
        payload: 'result',
      });
    },
  },
  reducers: {
    saveCurrentStep(state, { payload }) {
      return { ...state, current: payload };
    },

    saveStepFormData(state, { payload }) {
      return { ...state, step: { ...state.step, ...payload } };
    },
  },
};
export default Model;

关联

经过connect包裹后就可以通过props来获取关联的store里的数据
image.png

image.png

通过解构获取相应的namespace下的数据,

({ giftSystemAndgiftSetting }) => {
  console.log(giftSystemAndgiftSetting, "--------")
}

当修改名称使其与store中命名空间不匹配的时候,值也拿不到咯。

const mapStateToProps = ({ giftSystemAndgiftSetting1 }) => {
  console.log(giftSystemAndgiftSetting1, "--------")
}

image.png

return 返回给谁

当吧retur注释掉后可以看到虽然状态变了,但视图并没有响应。

const mapStateToProps = ({ giftSystemAndgiftSetting1 }) => {
  console.log(giftSystemAndgiftSetting1, "--------")
  // return {
  //   current: giftSystemAndgiftSetting.current,
  // }
}