【问题标题】:React component not updating on changes to map (data structure) in redux state storeReact 组件未更新 redux 状态存储中映射(数据结构)的更改
【发布时间】:2019-05-24 19:23:10
【问题描述】:

我有一个存储在 redux 状态存储中的地图和一个反应组件,它呈现我存储在地图中的值。现在,当我从该地图中添加/删除值时,我的反应组件不会使用最新的更改进行自我更新。

注意:我看到我们可以使用mobX 模块来监听 map(或数组以外的其他数据结构)的变化,但我不想使用其他模块来实现这一点。

我的 Redux 商店

const initialState = {
    myNotes = new Map();
}

我的减速器

case CREATE_NEW_NOTE:
      const { noteAdded, success } = action.payload;
      let newOwnerNotes = state.myNotes;

      newOwnerNotes.set(noteAdded.note_id, noteAdded);

      if (success) {
        return {
          ...state,
          myNotes: newOwnerNotes
        };
      } else {
        return {
          ...state
        };
      }
case DELETE_NOTE:
      const noteIdToDelete = action.payload.note_id;
      const { success } = action.payload;
      let newState = Object.assign({}, state);

      if (success) {
        newState.myNotes.delete(noteIdToDelete);
        return {
          ...newState
        };
      } else {
        return {
          ...state
        };
      }

我的反应组件

import React from "react";
import { connect } from "react-redux";

// Components
import Notes from "../notes/Notes";
import Heading from "./Heading";

class Owner extends React.Component {
  render() {
    const { myNotes } = this.props;
    debugger;
    return (
      <div className="notes-owner">
        <div className="notes-owner-header">
          <Heading owner={true} />
        </div>
        <div className="notes-owner-content">
          {[...myNotes].map(([key, note]) => {
            return (
              <Notes note={note} owner={true} key={note.note_id}>
                {note.title}
              </Notes>
            );
          })}
        </div>
      </div>
    );
  }
}

const mapStateToProps = state => {
  return {
    myNotes: state.notes.myNotes
  };
};

export default connect(
  mapStateToProps,
  {}
)(Owner);

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    你不应该使用Map,至少不应该这样。你正在改变状态。看看这一行:

      let newOwnerNotes = state.myNotes;
    
      newOwnerNotes.set(noteAdded.note_id, noteAdded);
    

    你只是在引用同一个对象。试试这样:

      let newOwnerNotes = new Map(state.myNotes);
    
      newOwnerNotes.set(noteAdded.note_id, noteAdded);
    

    你应该永远记住,数组、对象、映射,都是reference types,看下面的sn-p:

    const arr = [1,2,3,4,5]
    const copy = arr
    const realCopy = [...arr]
    console.log(copy, realCopy) //[1,2,3,4,5],[1,2,3,4,5]
    console.log(copy === arr) //true
    console.log(realCopy === arr) //false
    

    当您像 const copy = arr 一样分配时,您并没有创建另一个数组,您只是在引用同一个对象,但在第二种情况下(使用扩展运算符),您正在创建另一个数组,其中包含所有项目的扩展arr。在此处查看有关immutability in JS 的更多信息。

    当您执行const newNotes = new Map(state.myNotes) 时,您正在创建另一个对象,现在您进行修改,最后:return {...state, myNotes: newOwnerNotes};

    【讨论】:

    • 我已经用正确的方式更新了问题,以“”“复制”“”旧地图对象
    • 欢迎来到stackoverflow
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2021-02-24
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多