【问题标题】:Replacing object in an array without state mutation in Redux在 Redux 中替换没有状态突变的数组中的对象
【发布时间】:2018-09-11 19:51:59
【问题描述】:

我正在尝试使用 React 和 Redux 编辑一个对象并在数组中替换它,如下所示:

case EDIT_LANGUAGE:
  let languages = [...state.languageSkills];
  languages[languages.findIndex(el => el.id === action.payload.id)] = action.payload;
  return {
    ...state,
    languageSkills: languages
  };

'languages' 数组在 return 语句之前查找 find,但不会重新呈现状态。我想我正在以某种方式改变状态。其他操作(删除、获取、设置)工作正常。有什么建议吗?

编辑。这是应该呈现的组件的相关部分

import { setLanguages, getLanguages } from '../../actions';
import {connect} from 'react-redux';
import {bindActionCreators} from "redux"
import React, { Component } from 'react';

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

  render() {   
    const languageSkillItems = this.props.languageSkills.map((languageSkill) => {
      return (
        <LanguageSkillItem key={languageSkill.id} item={languageSkill} />
      )
    });

    return (
        <div className="profile">            
            <Language languageSkillItems={languageSkillItems} />            
        </div>
    )
    } 
}

const mapStateToProps = (state) => {
  return {
    languageSkills: state.languageSkills
  };
};


const mapDispatchToProps = dispatch => {
  return {
    ...bindActionCreators({ setLanguages, getLanguages }, dispatch)
  }
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(UserProfile

);

【问题讨论】:

  • payload是如何创建的——新对象?
  • dashton 的答案是正确的。要遵循的基本规则是避免 redux 中的突变 => 永远不要改变状态
  • 我认为render 正在被触发? &lt;Language /&gt; 长什么样子?
  • 渲染实际上没有被触发。我明天要进行一些重构,整个设计还不错……不太好。

标签: reactjs react-redux


【解决方案1】:

你需要创建一个新的数组引用,最简单的方法就是使用map,像这样:

case EDIT_LANGUAGE:
  const languageSkills = state.languageSkills.map(el => {
    if(el.id === action.payload.id) {
        return action.payload;
    }
    return el;
  });
  return {
    ...state,
    languageSkills
  };

【讨论】:

  • 谢谢,我不知道我还需要一个新的数组引用。不幸的是,重新渲染仍然无法正常工作......
  • 好的,你需要发布你的代码(最好是可运行的),它可以是很多其他的东西。例如由于嵌套等原因,您的 react-redux 连接逻辑可能不会像您预期的那样运行。
  • 我接受这个作为答案。我的核心问题在其他地方,但回答你的问题会引导我走向正确的方向。该应用程序具有深度嵌套的组件和一个在构造函数中设置的使用状态。谢谢。
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 2017-02-14
  • 2017-07-28
  • 2019-05-07
  • 2019-11-12
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多