在 React Native Expo 中使用 react-redux 更改另一个键的值

Change another key's value using react-redux In React Native Expo

首先,我的英语不好。对不起。

我正在为一款游戏创建每日和每周的任务检查应用程序,在这个应用程序中,用户可以在注册用户角色后检查每个角色的每日任务。但是,如果我检查一个角色的日常任务,所有其他角色都会被检查。这种现象在 :

之后继续
  1. 创建角色直到应用程序重新启动并且
  2. 按应用程序的完全初始化按钮直到应用程序重新启动

我试了一个多星期。而且我发现这出现在redux(react-redux)的reducer中。但是以我的技术完全看不懂,所以发帖提问

首先,图片是: my imgur

而且我以为你看图看不懂,所以准备了一个 YouTube link .

This is 这两个字符的复选框排列在 redox devtool 中实际上是如何变化的。 抱歉,我还没有插入图片。

const initialState = {
    LoaData: {},
    weekADay: '',
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case 'CHECKBOX_REDUX':
        return changeCheckbox(state, action);

    default:
        return state;
};

以上代码是react-redux的reducer。 而改变Checkbox(state, action)函数如下

const changeCheckbox = (state, action) => {
    let {
        contentType,  // in this question, i use 'daily' only
        firstIndex,   // this used dividing content
        id,           // this is character's unique id(=new Date) and checked character
        value         // i send checkbox array ex) [false, false, false]. 
    } = action.payload;

    let newState = Object.assign({}, state);
    let character = newState.LoaData.characters[id];
    let filteredContents = character.contents[contentType];

    if(contentType === 'daily') { // for test, show only 'daily'
        let weekADay = newState.weekADay; // Mon or Tue or Wed ... 
        for(let i = 0; i < filteredContents[weekADay][firstIndex].value.length; i++) { 
            filteredContents[weekADay][firstIndex].value[i] = value[i];
        }
    }
    return newState;
}

底部是console.log(action.payload)

{
    "contentType": "daily",
    "firstIndex": 0,
    "id": "1632050917445",
    "value": [ true, false, false ],
}

通过多次测试,发现问题出现在for语句中。我也确认了想要的角色的昵称是正常变化的。但是,在for语句中,确认每次迭代也更改了'不同字符的值'的相同索引的布尔值。

请帮帮我

redux: 4.1.1

react-redux: 7.2.4

反应:16.13.1

世博会:42.0.1

这取决于您在商店的其余部分中创建和更新角色的方式,但您可能会在彼此之间共享角色对象的引用。你正在改变你不应该在 redux 中做的商店。

您在旧状态上调用 object.assign,然后创建新状态。但是,这只会为新状态本身创建一个新对象。它的所有属性仍然引用与旧状态相同的对象。

与您的作业相同 - let character = newState.LoaData.characters[id]; 实际上并没有在任何时候创建新对象。您需要为此使用 object.assign,一直到您要更改的 属性,或者使用扩展运算符。