【问题标题】:Table Component is not re-rendered after state update状态更新后不重新渲染表格组件
【发布时间】:2019-10-11 22:43:15
【问题描述】:

我有一个表格组件来显示一些数据。在调度一个动作之后,状态中的表数据正在改变。但是我的表格组件没有更新。只有当我单击表格另一行中的另一个单选按钮时,它才会更新。我希望我的组件在数据更改时重新呈现。这是我的代码:

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
      };
    }

【问题讨论】:

  • 问题可能与您的减速器设置有关。你能发布你的代码吗?
  • @ChristopherNgo 你说的太对了..我把这个评估结果改成这个评估结果:[...评估结果]
  • 哈哈是的,我看到了……你正在做一个状态突变。我只是要告诉你把它散布在一个新的数组中。很高兴您花时间弄清楚并了解了更多有关 redux-principles 的知识。
  • 非常感谢!!如果您想将此添加为答案以获得更多积分。 ;)
  • 非常感谢 :)

标签: javascript reactjs state antd react-props


【解决方案1】:

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

 const evaluationResults = state.evaluationResults;

这导致了违反 Redux 原则的状态突变。尽管在 OP 的后续代码中更新了状态值,但对引用中的相同初始对象进行了更改。 Redux 没有将其注册为新状态,因此它发现不需要重新渲染我们的组件。为了让你的连接组件重新渲染,我们需要一个全新的 redux-state。

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

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

【讨论】:

  • 太棒了!也许有一天我会犯同样的错误。谢谢你的提示。
  • @JoaozitoPolo 不客气!我很高兴你发现这很有帮助:)
  • 你拯救了我的一天!
  • @Gimnath 很高兴为您提供帮助!
  • 对我有意义!谢谢!
猜你喜欢
  • 2019-06-17
  • 2021-05-19
  • 2022-01-26
  • 2021-01-27
  • 2018-06-05
  • 2023-03-09
  • 2019-06-29
  • 1970-01-01
  • 2022-06-30
相关资源
最近更新 更多