亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Reducer 函數改變狀態,但屏幕不重新渲染

Reducer 函數改變狀態,但屏幕不重新渲染

繁花如伊 2023-03-18 16:20:31
在我使用 Android Studio 設置的 React Native 應用程序中,我使用 redux-persist 來持久化狀態,存儲引擎是 AsyncStorage。在應用程序中,我有一個“添加”按鈕和一個“刪除”按鈕,用于添加和刪除狀態中的項目。“添加”按鈕工作正常,它將一個項目添加到狀態并重新呈現屏幕。但是“刪除”按鈕雖然從狀態中刪除了一個項目(我在 React Native Debugger 上看到過),但它不會重新渲染屏幕并保持狀態。但是不同版本的代碼有效。我想知道為什么以前的版本不起作用。這是我的減速器功能://reducer.jsimport React from 'react';const initialState = {    key: [        { id: 0 },        { id: 1 }    ]};const reducer = (state = initialState, action) => {    switch (action.type) {        case 'SAVE':            return { key: [...state.key, action.payload] };        // this version doesn't re-render the screen and doesn't persist        case 'REMOVE':            let { key } = state;            key.pop();            return { key };                // this version re-renders the screen and persists        case 'REMOVE':            let { key } = state;            return { key : key.slice(0, key.length - 1)};        default:            return state;    }};export { reducer };
查看完整描述

2 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

您需要克隆該數組然后修改它,您試圖改變原始數組。

.pop()從和的文檔中查看.slice()

slice() 方法將數組的一部分的淺表副本返回到從開始到結束(不包括結束)選擇的新數組對象中,其中開始和結束表示該數組中項目的索引。原始數組不會被修改。

pop 方法從數組中刪除最后一個元素并將該值返回給調用者。

所以基本上這就是為什么在這種情況下.slice()有效而.pop()無效的原因。


查看完整回答
反對 回復 2023-03-18
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

前者不起作用,因為您正在改變數組。


考慮以下片段:


const bla = {

  key: [1, 2]

};


let {

  key

} = bla;


key.pop();


console.log(key);

console.log(bla);

展開片段

const bla = {

  key: [1, 2]

};

let {

  key

} = bla;


console.log(key.slice(0, key.length - 1));

console.log(bla)


請注意如何在修改數組console.log(bla)時記錄不同的值,同時創建一個新數組。popslice


查看完整回答
反對 回復 2023-03-18
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號