javascript - 如何在reducer内的immutable-js中删除嵌套状态对象?
问题描述
我想从中删除一个实体data
(它是 List inside object someData
)。我fromJS
在减速器中使用不可变 js 来保持状态不可变
我尝试使用updateIn, deleteIn, update, removeIn
以及在 immutable-js 上可以找到的任何内容。但这对我不起作用。很可能我以错误的方式使用这些功能。
import { fromJS, updateIn } from 'immutable';
import * as type from './constants';
export const initialState = fromJS({
someData: [],
loading: true,
});
function someReducer(state = initialState, action) {
switch (action.type) {
case type.DELETE_SINGLE_ENTITY:
updateIn(state, ['someData', 'data'], val =>
val.filter(x => x.id !== action.id),
);
return state;
default:
return state;
}
}
export default someReducer;
//example someData
/*
{
date: "",
data: [
{
"id": "1",
"machine_type": "xyz",
"created_time": "2019-06-18T10:36:60Z",
...
},
{
"id": "22",
"machine_type": "abc",
"created_time": "2019-06-20T10:36:60Z",
...
},
{
"id": "2",
"machine_type": "kjhkh",
"created_time": "2019-06-11T12:36:60Z",
...
}
]
}
*/
我想删除与传入的 id 匹配的实体。在删除state.get('someData')
上面示例中的输出之前。action.id
我键入时的预期输出(何时为 2)state.get
应该是:
{
date: "",
data: [
{
"id": "1",
"machine_type": "xyz",
"created_time": "2019-06-18T10:36:60Z",
...
},
{
"id": "22",
"machine_type": "abc",
"created_time": "2019-06-20T10:36:60Z",
...
}
]
}
解决方案
最后!知道了!这:
return updateIn(state, ['someData', 'data'], val =>
val.filter(x => x.id !== action.id),
);
而不是这个:
updateIn(state, ['someData', 'data'], val =>
val.filter(x => x.id !== action.id),
);
return state;
以前我认为 updateIn 会更新状态本身,但它不会返回更新的对象。因此,只需返回 updateIn 就可以了。
推荐阅读
- android - 如何使用绑定适配器从 ImageView 中的 drawable 加载动画 gif?
- java - 无法为元素 Appenders 调用类 org.apache.logging.log4j.core.config.AppendersPlugin 中的工厂方法:java.lang.NullPointerException
- swift - 计算两个坐标之间的距离并将其显示在 UITableViewCell 的标签内
- java - 何时使用接口变量与实现变量
- elasticsearch - 在 Kibana 仪表板中使用 SQL
- python - 为什么我要为 Python 中数据框的每个索引获取列标题?
- c++ - 冒泡排序降序
- javascript - laravel 在提交表单时没有获取文件
- laravel - 重定向到 Laravel 路由 VueJS
- accessibility - 在网站上的两个选项之间进行选择,我应该使用按钮还是单选按钮?