【问题标题】:How can I use Object.assign() to create this state object how I want it如何使用 Object.assign() 来创建我想要的状态对象
【发布时间】:2023-03-28 17:15:01
【问题描述】:

我正在使用 Redux 创建一个简单的联系人应用程序。我的状态对象如下所示:

{
  "contacts": [
    {
      "name": "Miguel Camilo",
      "phone": "123456789"
    },
    {
      "name": "Peter",
      "phone": "883292300348"
    },
    {
      "name": "Jessica",
      "phone": "8743847638473"
    },
    {
      "name": "Michael",
      "phone": "0988765553"
    }
  ],
  "activeContact": {
    "name": "Peter",
    "phone": "883292300348"
  }
}

我正在创建一个添加联系人的操作。我想在包含来自页面输入字段的名称和数字的状态内向contacts 数组添加一个新对象。我正在使用Object.assign() 来尝试执行此操作,但我收到了一个错误bundle.js:22875 Uncaught TypeError: Cannot convert undefined or null to object,我相信这是因为我在减速器中使用了Object.assign()。这是我的减速器代码:

export default function (state = {}, action) {
  switch (action.type) {
    case 'ADD_CONTACT':
      return Object.assign({}, state, {
      contacts: state.concat([
        {
          name: action.payload.name,
          phone: action.payload.phone
        }
      ])
    })
    default:
      return state;
    }
}

所以如果action.payload.name 是“Jeff”并且action.payload.phone 是“5647876578”,我希望返回的状态如下所示:

{
  "contacts": [
    {
      "name": "Miguel Camilo",
      "phone": "123456789"
    },
    {
      "name": "Peter",
      "phone": "883292300348"
    },
    {
      "name": "Jessica",
      "phone": "8743847638473"
    },
    {
      "name": "Michael",
      "phone": "0988765553"
    },
    {
      "name": "Jeff",
      "phone": "5647876578"
    }
  ],
  "activeContact": {
    "name": "Peter",
    "phone": "883292300348"
  }
}

我在使用 Object.assign() 时似乎找不到问题,但我很确定这是我的错误的来源。任何帮助表示赞赏!

编辑:reducer 中的记录状态返回以下内容:

[
  {
    "name": "Miguel Camilo",
    "phone": "123456789"
  },
  {
    "name": "Peter",
    "phone": "883292300348"
  },
  {
    "name": "Jessica",
    "phone": "8743847638473"
  },
  {
    "name": "Michael",
    "phone": "0988765553"
  }
]

我的联系人列表组件:

class ContactList extends Component {
  renderList() {
    return this.props.contacts.map((contact) => {
      return (
        <li
          key={contact.phone}
          onClick={() => this.props.selectContact(contact)}
          className='list-group-item'>{contact.name}</li>
      );
    });
  }
  render() {
    return (
      <ul className = 'list-group col-sm-4'>
        {this.renderList()}
      </ul>
    );
  }
}

function mapStateToProps(state) {
  return {
    contacts: state.contacts
  };
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators({ selectContact: selectContact }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(ContactList)

我的 ActiveContact 状态部分在它的减速器中被这样修改:

export default function (state = null, action) {
  switch (action.type) {
    case 'CONTACT_SELECTED':
      return action.payload
  }
  return state;
 }

【问题讨论】:

  • 如果您尝试不可变地更改状态,我认为您应该使用 JSON.parse(JSON.stringify(state)) 制作不可变副本,然后添加新联系人,然后返回修改后的状态

标签: javascript reactjs redux react-redux state


【解决方案1】:

您收到此错误的原因是您的初始状态没有contacts 数组:

export default function (state = {}, action) {
...
}

尝试修改您的状态,使其最初有一个空的联系人数组,如下所示:

export default function (state = { contacts : [] }, action) {
...
}

另外,请考虑修改您的 'ADD_CONTACT' 操作以使用 Array#concat,如下所示:

case 'ADD_CONTACT':
  return Object.assign({}, state, {
    contacts: state.contacts.concat([
      {
        name: action.payload.name,
        phone: action.payload.phone
      }
    ])
  })

【讨论】:

  • 嗯,好像不是这样。我仍然遇到同样的错误
  • 既然这个reducer只处理contacts,它应该返回完整的状态对象还是只是一个新的contacts
  • 没有。现在我得到Uncaught TypeError: Cannot read property 'concat' of undefined,所以看起来contacts 是未定义的?看起来很奇怪
  • 我将它添加到我的原始帖子中。似乎减速器中的state 只包含contacts。不知道为什么会这样,但这就是让我相信我应该只返回contacts
  • 好吧,我改变了我的 ADD_CONTACT 减速器并在 OP 上更新了它。我现在收到bundle.js:22563 Uncaught TypeError: this.props.contacts.map is not a function 并且错误发生在我的ContactsList 组件中。现在更深入地研究它,但仍然不确定发生了什么......我也在帖子中添加了 ContactList 代码
猜你喜欢
  • 2016-11-08
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多