为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信