[英]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 而沒有命名時第一次嘗試時無法工作
這里的問題不是push
或concat
,而是事實
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.