如何更新减速器中的嵌套不可变?
How can I update nested immutable in reducer?
我对 immutable.js 很陌生。
我要更新 home.filmList[0].isDetailModalShow = false.
我该怎么做?
请帮我!
我的状态是这样的:
{
home: {
filmList: [
{
id: 1,
name: '111',
imgUrl: '111',
isDetailModalShow: false
},
{
id: 2,
name: '222',
imgUrl: '',
isDetailModalShow: false
},
]
}
}
我的减速器是这样的
import { createReducer } from 'redux-act'
import { fromJS } from 'immutable'
import { setFilmList, toggleDetailModal } from './actions'
const initialState = fromJS({
filmList: [],
})
export default createReducer({
[toggleDetailModal]: (state, payload) => {
const index = state.get('filmList').findIndex(item => item.id === payload)
// state.get(filmList) is filmList: [........]
// below line code do not work!
return state.updateIn(['filmList', index, 'isDetailModalShow'], value => !value)
},
}, initialState)
您可以使用 Immutable 的 setIn
函数:
state.setIn(['filmList', 0, 'isDetailModalShow'], false)
我找到了解决方案...
当我设置 filmList
我忘了使用 fromJS
// old
[setFilmList]: (state, payload) => {
return state.set('filmList', payload)
}
// new, it works!
[setFilmList]: (state, payload) => {
return state.set('filmList', fromJS(payload))
}
我对 immutable.js 很陌生。
我要更新 home.filmList[0].isDetailModalShow = false.
我该怎么做?
请帮我!
我的状态是这样的:
{
home: {
filmList: [
{
id: 1,
name: '111',
imgUrl: '111',
isDetailModalShow: false
},
{
id: 2,
name: '222',
imgUrl: '',
isDetailModalShow: false
},
]
}
}
我的减速器是这样的
import { createReducer } from 'redux-act'
import { fromJS } from 'immutable'
import { setFilmList, toggleDetailModal } from './actions'
const initialState = fromJS({
filmList: [],
})
export default createReducer({
[toggleDetailModal]: (state, payload) => {
const index = state.get('filmList').findIndex(item => item.id === payload)
// state.get(filmList) is filmList: [........]
// below line code do not work!
return state.updateIn(['filmList', index, 'isDetailModalShow'], value => !value)
},
}, initialState)
您可以使用 Immutable 的 setIn
函数:
state.setIn(['filmList', 0, 'isDetailModalShow'], false)
我找到了解决方案...
当我设置 filmList
我忘了使用 fromJS
// old
[setFilmList]: (state, payload) => {
return state.set('filmList', payload)
}
// new, it works!
[setFilmList]: (state, payload) => {
return state.set('filmList', fromJS(payload))
}