dva中renturn新的state后不执行render

描述:

当点击按钮是应该调用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};
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值