簡體   English   中英

為什么 slice push 在 redux 中有效,但在 concat 中無效?

[英]Why does slice push work in redux but not concat?

最近我換成了切片,我看到一些奇怪的行為有人可以解釋一下:

const initialState = {
  []
};

export const userSlice = createSlice({
  name: "user",
  initialState,
  reducers: {
    loadUsers(state, action) {
      state = state.concat(action.payload);
    },
  },
});

當我做這樣的事情時,state 不會改變,有效負載也不會添加到 state 數組

我可以 go 喜歡

for(let i=0; i < action.payload.length; i++) {
    state.push(action.payload[i]
}

一切正常,然后我意識到如果將 state 初始 state 命名為:

const initialState = {
  users: [],
};

然后我可以像 go 這樣:

state.users = state.users.concat(action.payload);

loadUsers reducer 上,這項工作也很好有人可以解釋為什么concat在我有 [] 的初始 state 而沒有命名時第一次嘗試時無法工作

這里的問題不是pushconcat ,而是事實

state = something

永遠不會做任何事情。

Redux Toolkit 監視處於變量state的對象以進行修改 - 但該賦值會丟棄該對象並將新對象放入變量中而不是更改它。

這是無法觀察到的。

相反,你可以做

return something

有關更多信息,請參閱使用immer編寫immer ,尤其是重置和替換 state ,其中說:

一個常見的錯誤是嘗試直接分配state = someValue 這行不通! 這只會將局部狀態變量指向不同的引用。 這既不會改變內存中現有的狀態對象/數組,也不會返回全新的值,因此 Immer 不會進行任何實際更改。

添加到先前的答案,以進行區分。 你不應該像在行中那樣嘗試改變整個 state

State = something

但是你可以而且應該以這種方式改變 state 屬性,事實上它是 redux 工具包和 immer 的主要好處之一,所以

State.prop = something 

沒問題。 現在是重申這種 state 突變的好時機,只有在 redux 工具包中 immer 正在做它的工作。

同樣,這里是相關文檔的鏈接

https://redux-toolkit.js.org/usage/immer-reducers#resetting-and-replacing-state

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM