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" ] } } }