Podemos usar immutable-js de várias maneiras com Redux. Depende se queremos que nosso estado raiz seja imutável ou não.
Se escolhermos o modo Difícil, podemos ter alguns problemas com libs, como redux-form
no futuro (porém solucionáveis).
Há um problema discutindo se precisamos da maneira mais difícil: https://github.com/gajus/redux-immutable/issues/32 .
Maneira simples
npm install immutable --save
E agora podemos converter um redutor de cada vez:
const reducer = (courses = initialState, action) => {
courses = Immutable.fromJS(courses) // converting courses to an immutable object
if (action.type == 'FETCHING_COURSES_SUCCESS') {
return courses
.set('status', 'success')
.set('error', null)
.set('items', action.items)
.toJS() // returning usual JS object
}
};
Jeito difícil
npm install immutable redux-immutable --save
Importe sua
combineReducers
função recém-instaladaredux-immutable
, em vez deredux
import { combineReducers } from 'redux-immutable';
E agora podemos começar a mudar um redutor de cada vez.
Faça do estado inicial um objeto-js imutável.
Agora você pode usar métodos imuable-js em seus redutores, como
get
eset
.import Immutable from 'immutable';
const initialState = Immutable.fromJS({
status: null,
error: null,
items: []
});
const coursesReducer = (courses = initialState, action) => {
if (action.type == 'FETCHING_COURSES_SUCCESS') {
return courses
.set('status', 'success')
.set('error', null)
.set('items', action.items)
}
};Já que o estado é um objeto-js imutável agora, precisamos traduzi-lo para algo que nossos componentes de reação entenderão. Ou seja, simplesmente Js.
const mapStateToProps = (state) => {
return {
courseItems: state.toJS().courses.items
}
};