在 React Native Expo 中使用 react-redux 更改另一个键的值
Change another key's value using react-redux In React Native Expo
首先,我的英语不好。对不起。
我正在为一款游戏创建每日和每周的任务检查应用程序,在这个应用程序中,用户可以在注册用户角色后检查每个角色的每日任务。但是,如果我检查一个角色的日常任务,所有其他角色都会被检查。这种现象在 :
之后继续
- 创建角色直到应用程序重新启动并且
- 按应用程序的完全初始化按钮直到应用程序重新启动
我试了一个多星期。而且我发现这出现在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,一直到您要更改的 属性,或者使用扩展运算符。
首先,我的英语不好。对不起。
我正在为一款游戏创建每日和每周的任务检查应用程序,在这个应用程序中,用户可以在注册用户角色后检查每个角色的每日任务。但是,如果我检查一个角色的日常任务,所有其他角色都会被检查。这种现象在 :
之后继续- 创建角色直到应用程序重新启动并且
- 按应用程序的完全初始化按钮直到应用程序重新启动
我试了一个多星期。而且我发现这出现在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,一直到您要更改的 属性,或者使用扩展运算符。