React - Redux:商店中的数组未正确更新
React - Redux: Array in the store is not being updated correctly
首先抱歉我的英语不好,我是一名法国开发人员,我从 React redux lib 开始,我想编写表单生成器代码,但我在渲染数组时遇到问题。我用代码图片向我解释。
(准确地说,目前它是静态的)
我想在问题数组中添加问题:问题:[] 构造为
questions : [
{
dataid: 1,
label:"coucou",
input: [
{
dataid: 1,
type:"radio",
value:"oui",
},
{
dataid: 2,
type:"radio",
value:"non",
}
]
},
],
添加问题的代码:
case ADD_OTHER_OPTION: {
// je recherche le nombre d'option dans une question
let questionsInputLength = state.questions.map((items) => {
return (items.input.length);
} )
// initialisation d'un dataid pour faire mon calcul et le rendre unique
let idMax;
if (state.questions.length > 0) {
// si j'ai supprimé toute les options d'une question, j'ai encore la question de présente
// et le [] input est à 0 donc je réinitialise le data id de la premier option à 0
if ((questionsInputLength.includes(0))) {
idMax = ['0'];
}
else {
// si j'ai déjà des options dans une question
state.questions.map((item) => {
idMax = item.input.map((inputs) => inputs.dataid)
return idMax;
});
}
}
else {
// si je n'ai pas encore de question,
// j'initie un dataid à 0 sous forme de []pour la fonction Math.max() +1
idMax = ['0'];
}
const hightId = Math.max(...idMax) + 1;
// initialisation d'une nouvelle option
let newOption;
// si j'ai le meme data id dans le state et dans l'action et que mon [] de questions est sup à 0
if (state.dataid == action.dataid && state.questions.length > 0) {
console.log('je suis dans le if du add option');
newOption = state.questions.map((question) => {
if (question.dataid == action.dataid) {
console.log('meme id' + ' ' + question.dataid + ' '+ action.dataid)
const newInput = {
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
};
return {
...question,
dataid: action.dataid,
label: state.inputQuizQuestionValue,
input: [ ...question.input, newInput]
};
}
else {
console.log('pas le meme dataid, autre question')
// TODO revoir tout ce code, j'ecrase la question au lieu de la rajouter et du coup je rajotue les autre input sous la premiere question.
const newQuestion = {
// ...question,
dataid: state.dataid,
label: state.inputQuizQuestionValue,
input:
[
{
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
},
]
}
return newQuestion
}
})
console.log('je vais return avant le else du add option');
console.log(newOption);
return {
...state,
questions: [...newOption],
inputSelectedOptionValue: '',
}
}
// si mon tableau de question est vide
else {
console.log('je suis dans le else du add option');
newOption = {
dataid: state.dataid,
label: state.inputQuizQuestionValue,
input:
[
{
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
},
]
}
}
console.log('dernier return du add option');
return {
...state,
questions: [...state.questions, newOption],
inputSelectedOptionValue: '',
}
}
当我的数组中没有问题时代码没问题,我可以添加一个。
当我有一个时,我可以添加相同类型和其他值和其他 dataId 的多输入。
但是当我想添加其他问题时,代码不正确,我粉碎问题添加其他,这是正常的,“return newQuestion”将问题放在“newOption”中,而这个return
return {
...state,
questions: [...newOption],
inputSelectedOptionValue: '',
}
粉碎所有问题..
但是,如果我将此 return 更改为“问题:[...state.questions,newOption]”,当我想在问题中添加其他输入时,它不起作用。
我尝试更改“return newQuestion”,我尝试了很多但没有什么是好的..我掉头发了
我希望你有勇气去阅读..
非常感谢..和“Passez une bonne journée les devs”
Thery
console.log(state.questions) after adding one question whith other input
When i add question
你的reducer
中有两种情况,1.在questions
数组中添加了一个新问题,2.在当前问题中添加了一个新问题option
。
您添加问题的实现如下所示:
return {
...state,
questions: [...state.questions, newQuestion],
inputSelectedOptionValue: '',
}
但是要为当前问题添加新选项,您需要知道要为其添加选项的问题 ID。
假设我们需要更新问题 id 2 以向其添加新选项。
有两部分,首先需要找到那个问题,然后为这个已创建的问题添加一个新选项。
return {
..state,
questions: state.questions.map(question =>
(question.id === 2 ?
{...question, input: [...question.input, newOption]}
: question)
)
}
注意: 假设目标问题 id 为 2,我们发现并将新选项添加到 input
数组。但是您必须将 hardcoded 问题 ID 2 替换为您要为其添加新选项的 questionId
。
首先抱歉我的英语不好,我是一名法国开发人员,我从 React redux lib 开始,我想编写表单生成器代码,但我在渲染数组时遇到问题。我用代码图片向我解释。 (准确地说,目前它是静态的)
我想在问题数组中添加问题:问题:[] 构造为
questions : [
{
dataid: 1,
label:"coucou",
input: [
{
dataid: 1,
type:"radio",
value:"oui",
},
{
dataid: 2,
type:"radio",
value:"non",
}
]
},
],
添加问题的代码:
case ADD_OTHER_OPTION: {
// je recherche le nombre d'option dans une question
let questionsInputLength = state.questions.map((items) => {
return (items.input.length);
} )
// initialisation d'un dataid pour faire mon calcul et le rendre unique
let idMax;
if (state.questions.length > 0) {
// si j'ai supprimé toute les options d'une question, j'ai encore la question de présente
// et le [] input est à 0 donc je réinitialise le data id de la premier option à 0
if ((questionsInputLength.includes(0))) {
idMax = ['0'];
}
else {
// si j'ai déjà des options dans une question
state.questions.map((item) => {
idMax = item.input.map((inputs) => inputs.dataid)
return idMax;
});
}
}
else {
// si je n'ai pas encore de question,
// j'initie un dataid à 0 sous forme de []pour la fonction Math.max() +1
idMax = ['0'];
}
const hightId = Math.max(...idMax) + 1;
// initialisation d'une nouvelle option
let newOption;
// si j'ai le meme data id dans le state et dans l'action et que mon [] de questions est sup à 0
if (state.dataid == action.dataid && state.questions.length > 0) {
console.log('je suis dans le if du add option');
newOption = state.questions.map((question) => {
if (question.dataid == action.dataid) {
console.log('meme id' + ' ' + question.dataid + ' '+ action.dataid)
const newInput = {
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
};
return {
...question,
dataid: action.dataid,
label: state.inputQuizQuestionValue,
input: [ ...question.input, newInput]
};
}
else {
console.log('pas le meme dataid, autre question')
// TODO revoir tout ce code, j'ecrase la question au lieu de la rajouter et du coup je rajotue les autre input sous la premiere question.
const newQuestion = {
// ...question,
dataid: state.dataid,
label: state.inputQuizQuestionValue,
input:
[
{
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
},
]
}
return newQuestion
}
})
console.log('je vais return avant le else du add option');
console.log(newOption);
return {
...state,
questions: [...newOption],
inputSelectedOptionValue: '',
}
}
// si mon tableau de question est vide
else {
console.log('je suis dans le else du add option');
newOption = {
dataid: state.dataid,
label: state.inputQuizQuestionValue,
input:
[
{
dataid: hightId,
type: action.value,
value: state.inputSelectedOptionValue,
},
]
}
}
console.log('dernier return du add option');
return {
...state,
questions: [...state.questions, newOption],
inputSelectedOptionValue: '',
}
}
当我的数组中没有问题时代码没问题,我可以添加一个。 当我有一个时,我可以添加相同类型和其他值和其他 dataId 的多输入。 但是当我想添加其他问题时,代码不正确,我粉碎问题添加其他,这是正常的,“return newQuestion”将问题放在“newOption”中,而这个return
return {
...state,
questions: [...newOption],
inputSelectedOptionValue: '',
}
粉碎所有问题.. 但是,如果我将此 return 更改为“问题:[...state.questions,newOption]”,当我想在问题中添加其他输入时,它不起作用。 我尝试更改“return newQuestion”,我尝试了很多但没有什么是好的..我掉头发了
我希望你有勇气去阅读..
非常感谢..和“Passez une bonne journée les devs”
Thery
console.log(state.questions) after adding one question whith other input
When i add question
你的reducer
中有两种情况,1.在questions
数组中添加了一个新问题,2.在当前问题中添加了一个新问题option
。
您添加问题的实现如下所示:
return {
...state,
questions: [...state.questions, newQuestion],
inputSelectedOptionValue: '',
}
但是要为当前问题添加新选项,您需要知道要为其添加选项的问题 ID。
假设我们需要更新问题 id 2 以向其添加新选项。
有两部分,首先需要找到那个问题,然后为这个已创建的问题添加一个新选项。
return {
..state,
questions: state.questions.map(question =>
(question.id === 2 ?
{...question, input: [...question.input, newOption]}
: question)
)
}
注意: 假设目标问题 id 为 2,我们发现并将新选项添加到 input
数组。但是您必须将 hardcoded 问题 ID 2 替换为您要为其添加新选项的 questionId
。