Я новичок в редукторе и неизменяемой штуке, так что, может быть, кто-нибудь ответит мне на несколько вопросов. Я использую бесшовные неизменяемые (https://github.com/rtfeldman/seamless-immutable) вместе с redux-seammless-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);
- Должен ли я определять каждое свойство как неизменяемый объект, как в
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
?