【问题标题】:mapStateToProps not updating component on changemapStateToProps 不会在更改时更新组件
【发布时间】:2018-11-23 13:22:05
【问题描述】:

react/redux 的新手。想知道为什么我的组件在触发动作时没有刷新。也不确定 reducer 是否是操作 store 的好地方,但它是纯粹的,所以它应该可以工作。

发生的情况是触发了操作并更新了存储。但是点击的项目没有更新(道具更新应该添加added类)

组件:

通过 Id 引用 rcm_data 来切换类 added,onClick 触发动作

import React, { Component } from "react";
import { connect } from "react-redux";
import { addRateCard } from "../actions";

import "./RcmEditor.css";

class RcmEditor extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return (
      <table className="slds-table slds-table--cell-buffer slds-table--bordered">
        <thead>
          <tr>
            <th>Rate Card Name</th>
          </tr>
        </thead>
        <tbody>
          {group.rateCardIds.map(rcId => {
            return (
              <tr
                className={
                  "ed-group-rc " +
                  (this.props.rcm_data[rcId].added ? "added" : "")
                }
                key={rcId}
                onClick={() =>
                  this.props.addRateCard(this.props.rcm_data[rcId])
                }
              >
                <td colSpan="100">{this.props.rcm_data[rcId].Name}</td>
              </tr>
            );
          })}
        </tbody>
      </table>
    );
  }
}

const mapDispatchToProps = {
  addRateCard
};

const mapStateToProps = state => {
  return { rcm_data: state.rcm_data, group_data: state.group_data };
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(RcmEditor);

操作:

const ADD_RATE_CARD = "ADD_RATE_CARD";

export const addRateCard = rateCard => ({ type: ADD_RATE_CARD, payload: rateCard });

减速机:

复制状态(只是预防措施),增加 group_data 的 added_count 属性并更改操作引用的 rcm_data 的添加属性。有效载荷 Id,返回一个新的状态。这里的一切似乎都是纯净的

const initialState = {
    rcm_data: {},
    group_data: {},
};

const rootReducer = (state = initialState, action) => {
    case "ADD_RATE_CARD":

        let _state = { ...state };
        let rateCard = action.payload;

        _state.group_data[rateCard.GroupName].added_count++;
        _state.rcm_data[rateCard.Id].added = true;

        let data = {
            rcm_data: _state.rcm_data,
            group_data: _state.group_data
        };

        return { ...state, rcm_data: _state.rcm_data, group_data: _state.group_data };
    default:
        return state;
   }
};

export default rootReducer;

【问题讨论】:

  • not sure whether reducer is a good place to manipulate store。我个人更喜欢逻辑应该在行动中,reducer 应该只给出新的状态。您可以在您的操作中使用 redux-thunk 来添加逻辑
  • 我认为访问 store in action 创作者并不是最佳实践

标签: javascript reactjs redux


【解决方案1】:

您的 reducer 复制对象(rcm_datagroup_data)并对其进行变异。

Redux 比较浅 - 使用相同的对象引用没有区别,然后没有更新/重新渲染。

只需创建一个新的子对象,比如:

    let data = {
        rcm_data: {...state.rcm_data},
        group_data: {...state.group_data}
    };
    data.group_data[rateCard.GroupName].added_count++;
    data.rcm_data[rateCard.Id].added = true;
    return data

【讨论】:

  • 这虽然有效,但我看不出与我所做的不同
  • 创建了新的rcm_datagroup_data 对象(带有更新的数据)-在mapStateToProps 中使用-redux 的新对象shouldComponentUpdate
  • 会更仔细地研究它。我将 return 语句更改为 return {...state, ...data}; 也可以。以防我稍后添加更多状态
猜你喜欢
  • 2019-07-23
  • 2021-10-23
  • 2018-02-21
  • 2020-06-17
  • 2019-06-26
  • 2018-08-09
  • 2021-10-03
  • 2020-07-18
  • 2020-01-19
相关资源
最近更新 更多