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
分步表单

文件目录

index.js
import { Card, Steps } from 'antd';import React, { Component } from 'react';import { PageHeaderWrapper } from '@ant-design/pro-layout';import { connect } from 'dva';import Step1 from './components/Step1';import Step2 from './components/Step2';import Step3 from './components/Step3';import styles from './style.less';const { Step } = Steps;class GiftSetting extends Component {getCurrentStep() {const { current } = this.props;switch (current) {case 'info':return 0;case 'confirm':return 1;case 'result':return 2;default:return 0;}}render() {const currentStep = this.getCurrentStep();let stepComponent;if (currentStep === 1) {stepComponent = <Step2 />;} else if (currentStep === 2) {stepComponent = <Step3 />;} else {stepComponent = <Step1 />;}return (<PageHeaderWrapper content="将一个冗长或用户不熟悉的表单任务分成多个步骤,指导用户完成。"><Card bordered={false}><><Steps current={currentStep} className={styles.steps}><Step title="填写转账信息" /><Step title="确认转账信息" /><Step title="完成" /></Steps>{stepComponent}</></Card></PageHeaderWrapper>);}}const mapStateToProps = ({ giftSystemAndgiftSetting }) => {console.log(giftSystemAndgiftSetting, "--------")return {current: giftSystemAndgiftSetting.current,}}export default connect(mapStateToProps)(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里的数据

通过解构获取相应的namespace下的数据,
({ giftSystemAndgiftSetting }) => {
console.log(giftSystemAndgiftSetting, "--------")
}
当修改名称使其与store中命名空间不匹配的时候,值也拿不到咯。
const mapStateToProps = ({ giftSystemAndgiftSetting1 }) => {
console.log(giftSystemAndgiftSetting1, "--------")
}

return 返回给谁
当吧retur注释掉后可以看到虽然状态变了,但视图并没有响应。
const mapStateToProps = ({ giftSystemAndgiftSetting1 }) => {
console.log(giftSystemAndgiftSetting1, "--------")
// return {
// current: giftSystemAndgiftSetting.current,
// }
}
