Umi: 开启了immer以后如何直接返回新的state

Created on 4 Jun 2018  ·  9Comments  ·  Source: umijs/umi

参照immer文档这样写似乎不行,组件中接收到的state是空的:

reducers: {
    setInfo(state, { payload }) {
      return payload;
    }
  }

或这样也不行

reducers: {
    setInfo(state, { payload }) {
      state = payload;
    }
  }

难道只能state.xxx=payload.xxx这样用吗

type(question)

Most helpful comment

"umi-plugin-dva": "^0.9.1", 报错如下:
Uncaught Error: An immer producer returned a new value and modified its draft. Either return a new value or modify the draft

    changeStockItem(state, { payload }) {
      const { index, key, value } = payload
      const stockList = [...state.stockList]
      stockList[index][key] = value
      return { ...state, stockList }
    }

改成state.stockList = stockList 就ok

All 9 comments

dva-immer 用 0.2.0,兼容老的 reducer 返回方式的。

你是用 umi-plugin-dva + immer 的方式?

是的,刚更新了umi-plugin-dva和umi到最新版本,但问题还存在

更新到 [email protected] 试试。

@sorrycc thx.可以了

目测dva-immer不兼容老的 reducer 返回方式了,要改得一起改。。。

@superlbr 兼容的,我们有项目在用。

"umi-plugin-dva": "^0.9.1", 报错如下:
Uncaught Error: An immer producer returned a new value and modified its draft. Either return a new value or modify the draft

    changeStockItem(state, { payload }) {
      const { index, key, value } = payload
      const stockList = [...state.stockList]
      stockList[index][key] = value
      return { ...state, stockList }
    }

改成state.stockList = stockList 就ok

还有假设原state[index]['children'] = []

changeStockItem(state, { payload }) {
    const { index, key, value } = payload
    state[index]['children'] = [1,2,3]
}

这样也会报错,提示children属性只读

Was this page helpful?
0 / 5 - 0 ratings