状态更新后不重新呈现表组件

时间:2019-05-25 18:41:03

标签: javascript reactjs state antd react-props

我有一个用于显示一些数据的表格组件。分派动作后,处于状态的表数据正在更改。但是我的表组件未更新。仅当我单击表另一行中的另一个单选按钮时,它才会更新。我希望组件在数据更改时重新呈现。这是我的代码:

const mapStateToProps = state => ({
  evaluationData: evaluationResultsSelector(state)
});

const mapDispatchToProps = dispatch => ({
  setSelectedEvaluationRecord: record =>
    dispatch(setSelectedEvaluationRecord(record))
});


export default connect(mapStateToProps,
  mapDispatchToProps
  EvaluationDataTable,  
);

我的组件是这样的:

import React from 'react';
import Table from 'antd/lib/table';
import 'antd/lib/table/style/css';
import "antd/dist/antd.css";
import { columnEvaluation } from './evaluationDataStructure';

class EvaluationDataTable extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      selectedRowKeys: [0], // Check here to configure the default column
    };
  }
  // shouldComponentUpdate(prevProps, prevState) {
  //   return (prevProps.results !== this.props.results || prevState.selectedRowKeys !== this.state.selectedRowKeys);
  // }
  onRowChange = selectedRowKeys => {
    if (selectedRowKeys.length > 1) {
      const lastSelectedRowIndex = [...selectedRowKeys].pop();
      this.setState({ selectedRowKeys: lastSelectedRowIndex });
    }
    this.setState({ selectedRowKeys });
  };

  onRowSelect = (record) => {
    this.props.setSelectedEvaluationRecord(record)
  };

  render() {
    const { selectedRowKeys } = this.state;
    const rowSelection = {
      type: 'radio',
      selectedRowKeys,
      onChange: this.onRowChange,
      onSelect: this.onRowSelect
    };
    return (
      <React.Fragment>
        <div style={{ marginBottom: 16 }} />
        <Table
          rowSelection={rowSelection}
          columns={columnEvaluation}
          dataSource={this.props.evaluationData}
        />
      </React.Fragment>
    );
  }
}

export default EvaluationDataTable;

当我在另一行中单击时,将触发setState来重新呈现表,但是当更改数据时,不会重新呈现该表。仅当我单击另一行时。怎么处理呢?非常感谢

我对表进行变异的化简器也是这样:

case ACTION_TYPES.EDIT_EVALUATION_RESULTS: {
      const evaluationResults = state.evaluationResults;
      const editedRecord = action.payload.editedEvaluationData;
      evaluationResults.forEach((item, i)  => {
        if (item.id === editedRecord.id) {
          evaluationResults[i] = editedRecord;
        }
      });
      return {
        ...state,
        evaluationResults
      };
    }

1 个答案:

答案 0 :(得分:2)

问题就在这里,因为OP已经被推断出来了。

 const evaluationResults = state.evaluationResults;

这导致状态变更,这与Redux原则背道而驰。尽管状态值在OP的后续代码中进行了更新,但是更改是针对相同的初始对象进行的。 Redux并未将其注册为新状态,因此它无需重新渲染组件。为了使您的连接组件重新呈现,我们需要一个全新的redux状态。

要实现这一点,我们需要像这样创建评估结果的全新副本,然后OP的功能将按预期工作:

const evaluationResults = [...state.evaluationResults];