Reactjs 以不可变的方式更新嵌套在对象中的数组
所以我有这个减速机,我想更新Reactjs 以不可变的方式更新嵌套在对象中的数组,reactjs,immutable.js,Reactjs,Immutable.js,所以我有这个减速机,我想更新 import { fromJS } from 'immutable'; const initialState = fromJS({ searchParams: { limit: 100, page: 1, order_by: 'name', filters: { and_keywords : [] } }, }) 当动作被触发时,我想将一个对象推入和\u关键字的数组中。到目前为止,我所做的是 case A
import { fromJS } from 'immutable';
const initialState = fromJS({
searchParams: {
limit: 100,
page: 1,
order_by: 'name',
filters: {
and_keywords : []
}
},
})
当动作被触发时,我想将一个对象推入和\u关键字的数组中。到目前为止,我所做的是
case ADD_KEYWORDS:
return state
.setIn(['searchParams', 'filters', 'and_keywords'], '123');
我也试过了
case ADD_KEYWORDS:
return state
.updateIn(['searchParams', 'filters', 'and_keywords'], arr => arr.push('123'))
基于中的文档,但我似乎无法使其工作。执行此命令后未进行任何更改您的更新版本应能正常工作:
您的setIn
版本代码也应该可以工作,只需稍加修改:
两者都应输出:
Map { "searchParams": Map { "limit": 100, "page": 1, "order_by": "name", "filters": Map { "and_keywords": List [ "123" ] } } }
不可变对象不会就地修改,您必须重新分配要修改的对象。因此,只要在行的开头添加state=
,它就可以工作了。我已经有了函数homePageReducer(state=initialState,action){
只是没有包括它,因为我只发布了我的代码片段。是的。是我这边的另一个bug导致了这个问题。接受了这个答案供其他人参考。谢谢!
const Immutable = require('immutable')
const initialState = Immutable.fromJS({
searchParams: {
limit: 100,
page: 1,
order_by: 'name',
filters: {
and_keywords : []
}
},
})
const newState = initialState.setIn(['searchParams', 'filters', 'and_keywords'], initialState.getIn(['searchParams', 'filters', 'and_keywords']).push('123'))
console.log(newState)
Map { "searchParams": Map { "limit": 100, "page": 1, "order_by": "name", "filters": Map { "and_keywords": List [ "123" ] } } }