我是整个 reducer 和不可变事物的新手,所以也许有人可以回答我一些问题。我在 react native 中使用无缝不可变(https://github.com/rtfeldman/seamless-immutable)和 redux-semmless-immutable (https://github.com/eadmundo/redux-seamless-immutable)应用程序。
我对以下代码有一些疑问:
import { combineReducers } from 'redux-seamless-immutable';
import Immutable from 'seamless-immutable';
const PRODUCTS_INITIAL_STATE = Immutable({ data: Immutable([]), loading: true });
const productsReducer = (state = PRODUCTS_INITIAL_STATE, action) => {
switch (action.type) {
case "LOADING":
return { ...state, loading: action.payload };
case "LOADED":
return Immutable.merge(state, {data: Immutable(action.payload) });
case "ADD_PRODUCT":
return Immutable.merge(state, {data: Immutable(state.data).concat(action.payload) });
default:
return state;
}
};
const INIT_STORE = Immutable({
products: productsReducer
});
export default combineReducers(INIT_STORE);
- 我是否必须像 in 一样将每个属性定义为 Immutable 对象,
const PRODUCTS_INITIAL_STATE = Immutable({ data: Immutable([]), loading: true });
还是 Immutable 会处理这个问题,这足以做到const PRODUCTS_INITIAL_STATE = Immutable({ data: [], loading: true });
吗? - 我是对的,使用三个点的 JSX 方法与使用
{ ...state, loading: action.payload }
相同Immutable.merge
吗? - 是否有更简单的
ADD_PRODUCT
操作方法,将元素添加到嵌套在对象中的数组中?
更新
另一个问题出现了:我有一个不可变的数组,其中包含对象。当我想添加另一个元素时,我必须使用Immutable(array).concat(newElement)
. 但是,如果我只想替换其中一个对象内的值怎么办?
考虑这个数组:
const array = Immutable([
{ name: "foo" },
{ name: "bar" }
]);
如果我想将第一个元素的名称从更改为不可变的方法是foo
什么hello
?