2

我是整个 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);
  1. 我是否必须像 in 一样将每个属性定义为 Immutable 对象,const PRODUCTS_INITIAL_STATE = Immutable({ data: Immutable([]), loading: true });还是 Immutable 会处理这个问题,这足以做到const PRODUCTS_INITIAL_STATE = Immutable({ data: [], loading: true });吗?
  2. 我是对的,使用三个点的 JSX 方法与使用{ ...state, loading: action.payload }相同Immutable.merge吗?
  3. 是否有更简单的ADD_PRODUCT操作方法,将元素添加到嵌套在对象中的数组中?

更新

另一个问题出现了:我有一个不可变的数组,其中包含对象。当我想添加另一个元素时,我必须使用Immutable(array).concat(newElement). 但是,如果我只想替换其中一个对象内的值怎么办?

考虑这个数组:

const array = Immutable([
  { name: "foo" },
  { name: "bar" }
]);

如果我想将第一个元素的名称从更改为不可变的方法是foo什么hello

4

1 回答 1

0

我也是不可变的新手。但这是我阅读朋友源代码后的无缝不变体验。

  1. 我是否必须将每个属性定义为不可变对象,如 const PRODUCTS_INITIAL_STATE = Immutable({ data: Immutable([]), loading: true }); 或者 Immutable 是否会处理这个问题,并且执行 const PRODUCTS_INITIAL_STATE = Immutable({ data: [], loading: true }); 就足够了?

是的,Immutable({ data: [], loading: true });就够了。无需在不可变对象中嵌套不可变对象。

  1. 我是对的,使用三个点 { ...state, loading: action.payload } 的 JSX 方法与使用 Immutable.merge 相同吗?

{ ...state, loading: action.payload }andstate.merge({ loading: action.payload })是一样的,但是 Immutable.merge 会返回 Immutable 对象。您可以使用isImmutable无缝不可变的功能来检查对象是否不可变。

const demo = Immutable({ foo: 1, bar: "hello" });

console.log("isImmutable", isImmutable({ ...demo, test: 69 }));   // false
console.log("isImmutable", isImmutable(demo.merge({ test: 1 })));   // true
  1. ADD_PRODUCT 操作是否有更简单的方法,可以将元素添加到嵌套在对象中的数组中?

像这样的东西,对吧?

const PRODUCTS_INITIAL_STATE = Immutable({ data: ['old item'], loading: true });

const newState = state.merge({ data: [...state.data, "new item"] });
  1. 如果我想将第一个元素的名称从 foo 更改为 hello,那么不可变的方法是什么?

很简单,只需使用setapi

const array = Immutable([{ name: "foo" }, { name: "bar" }]);

const mutatedArray = array.set(0, { name: "hello" });

您还有其他问题吗?

于 2019-06-03T01:53:11.950 回答