描述:
当点击按钮是应该调用dispatch进行Modal组件状态的改变,让他显示出来,但是不管怎么点击model中state改变了,但是怎么都不进行render,无法让Modal组件显示出来。
错误示范:
modal.js
import { Icon } from 'antd';
import React from 'react';
export default {
namespace: "workspaceBook",
state: {
...此处省略
modal: {
visible: false,
confirmLoading: false,
title: "新增知识库",
}
},
reducers: {
updateModalState: (state, {payload}) => {
let {modal} = state;
let {visible, confirmLoading} = payload;
if (visible !== undefined) {
modal.visible = visible;
}
if (confirmLoading !== undefined) {
modal.confirmLoading = confirmLoading;
}
return {...state, modal};
}
},
effects: {
}
}
index.js
import React from 'react';
import styles from './index.css';
import LeftMenu from '@/component/LeftMenu';
import { Button, Form, Icon, Input, Modal, Select, Switch, Table } from 'antd';
import { connect } from 'react-redux';
const namespace = "workspaceBook";
const stateConnector = ({workspaceBook}) => {
return {
...workspaceBook,
};
};
const optConnector = (dispatch) => {
return {
updateModalState: (payload) => {
dispatch({
type: namespace + "/updateModalState",
payload
})
}
}
};
@connect(stateConnector, optConnector)
class BookWorksp extends React.Component{
showModal = () => {
this.props.updateModalState({
visible: true,
});
}
render() {
let {Option} = Select;
let {columns, dataSource, modal} = this.props;
const { getFieldDecorator } = this.props.form;
const { TextArea } = Input;
return (
<LeftMenu {...this.props}>
<div>
... 此处省略
<Button type={"primary"} className={styles.newButton} onClick={this.showModal}>新建知识库</Button>
... 此处省略
<Form>
<Modal {...modal} onOk={this.handleModalOK} onCancel={this.handleModalCancel}>
... 此处省略
</Modal>
</Form>
</div>
</LeftMenu>
);
}
}
export default Form.create()(BookWorksp);
问题原因:
我理解的原因大概是这样的,因为我发现在执行updateModalState方法时,当走到return这句的时候,其实方法中前面的代码已经将state改变了,当return之后,框架会对新state与旧state进行比较,不同时才调用render,由于return之前就已经将旧state改变了,此时return出来的新state其实和旧state是一致的,所以不会进行render。各位大佬可以补充一下
修改后代码
model.js
updateModalState: (state, {payload}) => {
let newModal = {...state["modal"], ...payload}
return {...state, modal: newModal};
}