node.js - React Redux Push 嵌套数组中的对象
问题描述
如何从减速器的连接数组中推送新消息?我试图通过索引找到正确的连接然后推送它,但无法开始工作。连接架构例如:
_id: 3213213,
messages:[...]
消息模式例如:
_id: 123213,
author: '12312321',
body: 'Hi!'
因此需要从连接数组中找到正确的连接,然后将其推送到该连接内的消息数组中
问题代码:
const messagesReducer = (state = [], action) => {
switch (action.type) {
case RECIEVE_CONNECTIONS:
return action.payload;
case UPDATE_MESSAGES:
let index = state.findIndex(
connection => connection._id === action.update.id
);
return [...state, state[index].messages.concat(action.update.message)];
default:
return state;
}
};
export default messagesReducer;
解决方案
您实际上并没有使用此行更新状态:
return [...state, state[index].messages.concat(action.update.message)];
你实际上是在破坏你的 Redux 状态,因为state
它是一个连接列表,在这里你包括了串联的消息列表。
这是一个使您的状态相对不可变的示例(如果您想要完全不变,您还需要克隆所有现有的连接/消息,在此示例中,我只是复制数组)
let index = state.findIndex(
connection => connection._id === action.update.id
);
const conn = state[index];
const messages = [ ...conn.messages, action.update.message ];
const newState = state.slice();
newState[index] = { ...conn, messages };
return newState;
推荐阅读
- javascript - 带有 Webpack 的 VanillaJs,构建后无法在 index.html 中加载 bundle.js
- c# - 如何更改通过字符串从哪个类调用变量?C#
- javascript - 使用更改对话框的 JQuery 更改流程
- reactjs - 默认的material-ui间距在哪里定义?
- python - Python:Pandas 数据框对象无法转换为字符串
- c# - Docker:“成功” docker run 后无法在浏览器上启动 .Net Core 3 Api
- javascript - Javascript... 为什么这不会进入 if 语句的 else 部分?
- reactjs - 如何使声明的模块在酶浅渲染中可见?
- java - 删除特定空间
- android - 在 Mac 中更新到 Android Studio 4 后快捷方式不起作用?