如何删除 reducer 内 immutable-js 中的嵌套状态对象?
How to delete nested state object in immutable-js inside reducer?
我想从 data
中删除一个实体(对象 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')
的输出在上面的例子中。当我键入 state.get
时,我的预期输出(当 action.id
为 2 时)应该是:
{
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",
...
}
]
}
你可以使用过滤功能
const sampleData = [{id: 1},{id: 2},{id: 3}]
const idToRemove = 2;
const updatedData = sampleData.filter(el => {
return el.id !== idToRemove
})
console.log(updatedData);
终于!知道了!
这个:
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 会更新状态本身,但它不会 returns 更新的对象。所以只返回 updateIn 就可以了。
我想从 data
中删除一个实体(对象 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')
的输出在上面的例子中。当我键入 state.get
时,我的预期输出(当 action.id
为 2 时)应该是:
{
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",
...
}
]
}
你可以使用过滤功能
const sampleData = [{id: 1},{id: 2},{id: 3}]
const idToRemove = 2;
const updatedData = sampleData.filter(el => {
return el.id !== idToRemove
})
console.log(updatedData);
终于!知道了! 这个:
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 会更新状态本身,但它不会 returns 更新的对象。所以只返回 updateIn 就可以了。