javascript - 如何添加到 React 中的嵌套数组?

标签 javascript arrays reactjs

我正在构建一个 Slack 克隆原型(prototype)。当我尝试将消息添加到数组 this.state.channels.message 时,它​​会将其添加为数组 channel 中的新对象:

期望的结果

class App extends React.Component {
state = {
    channels : [
        { id: 1, name: 'react', messages: ['React message 1', '**DESIRED MESSAGE**']},
        { id: 2, name: 'react-router', messages: ['react-router message 1']},
    ],

目前的结果

class App extends React.Component {
state = {
    channels : [
        { id: 1, name: 'react', messages: ['React message 1']},
        { id: 2, name: 'react-router', messages: ['react-router message 1']},
        { id: 1, messages: '**DESIRED MESSAGE**'}
    ],

更新组件状态的逻辑

handleSentMessage = (value) => {
    const {selectedChannelId, selectedPersonId, channels} = this.state;

    if(this.state.selectedChannelId) {
      this.setState({
        ...this.state,
          channels: [
            ...this.state.channels,
            this.state.channels[selectedChannelId-1].messages.push(value)
          ]
        }
      );
    }

    if(this.state.selectedPersonId) {
      this.setState({
        ...this.state,
          people: [
            ...this.state.people,
            this.state.people[selectedPersonId-1].messages.push(value)
          ]
        }
      );
    }
}

任何帮助将不胜感激! Github https://github.com/kingdomwilks/Slack2

最佳答案

传播channels不正确,因为第二个语句不会覆盖任何东西(它是一个array而不是object)。当 channelindex 等于 selectedChannelId - 1

this.setState(prevState =>({
    channels : prevState.channels.map((channel,i) =>{
        if(i === selectedChannelId -1) return {
            ...channel,
            messages: channel.messages.concat('foo') //Now you overwrite it
        }

        return channel
    })
}))

您也可以直接使用 id 来找到正确的 channel,这样您就不再需要 selectedChannelId - 1,只需 selectedChannelId

关于javascript - 如何添加到 React 中的嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016187/

相关文章:

arrays - 按值删除 jsonb 数组元素

php - 使PHP循环以相反的顺序回显

javascript - 交替背景颜色 react-bootstrap-table

javascript - 有没有办法更改 Material ui的自动完成组件上的关闭图标?

javascript - 如何停止在 reactJs 中的输入文本字段上重新呈现整个组件 onChange 事件

javascript - 可以切换驱动程序但不能切换焦点

javascript - JQuery - 更改事件链接颜色

javascript - 在对象中执行函数

arrays - 扩展数组以检查它是否在 Swift 中排序?

javascript - ReactJS 下拉菜单(使用语义 UI)不会触发 onChange 事件?