为什么当我在反应中设置其他对象的状态时我的数组值正在改变?
Why my value of array is changing when I'm setting state of other object in react?
const [dataToAdd, setDataToAdd] = useState({
name: '', gender: '', email: '', imgUrl: '', website: '', skills: ''
});
const handleEnrollClick = () => {
console.log(skillsAdd.toString())
setStudentData([...studentData, dataToAdd]);
setDataToAdd({ name: '', gender: '', email: '', imgUrl: '', website: '', skills: '' });
}
const onChange = (e) => {
setDataToAdd({ ...dataToAdd, [e.target.name]: e.target.value });
}
let skillsAdd = []
const onChangeRadio = (e) => {
if (e.target.checked) {
skillsAdd.push(e.target.value);
} else if (!e.target.checked) {
skillsAdd.splice(skillsAdd.indexOf(e.target.value), 1);
}
console.log(skillsAdd)
// setDataToAdd({...dataToAdd, skills: skillsAdd.toString()});
}
有 3 个复选框,'JAVA'、'HTML' 和 'CSS'。 'if' 和 'else if' 中的逻辑添加和删除复选框的这些值,即数组 'skillsAdd' 中的 'JAVA'、'HTML' 和 'CSS',效果很好美好的。但是,当我使用函数 'setDataToAdd' 设置 'dataToAdd' 的状态时,'skillsAdd' 数组会完全改变。以下是输出:
注释 'setDataToAdd' 并且选中所有三个复选框即 'JAVA'、'HTML' 和 'CSS' 时的输出:['java'、'html', 'css']
未注释 'setDataToAdd' 并且选中所有三个复选框即 'JAVA'、'HTML' 和 'CSS' 时的输出:['css']
当写入'setDataToAdd'时,它应该只会影响'dataToAdd',但它会影响'skillsArray'。这怎么可能?
您需要为 skillsAdd
维护一个单独的状态并使用它来更新 dataToAdd
状态。
const [dataToAdd, setDataToAdd] = useState({
name: "",
gender: "",
email: "",
imgUrl: "",
website: "",
skills: "",
});
// Use state for skillsAdd array
const [skillsAdd, setSkillsAdd] = [];
const handleEnrollClick = () => {
console.log(skillsAdd.toString());
setStudentData([...studentData, dataToAdd]);
setDataToAdd({
name: "",
gender: "",
email: "",
imgUrl: "",
website: "",
skills: "",
});
};
const onChange = (e) => {
setDataToAdd({ ...dataToAdd, [e.target.name]: e.target.value });
};
const onChangeRadio = (e) => {
const tempSkillsArray = [...skillsAdd];
if (e.target.checked) {
tempSkillsArray.push(e.target.value);
} else if (!e.target.checked) {
tempSkillsArray.splice(tempSkillsArray.indexOf(e.target.value), 1);
}
// update the skillsAdd state
setSkillsAdd(tempSkillsArray);
// update dataToAdd using tempSkillsArray
setDataToAdd({ ...dataToAdd, skills: tempSkillsArray.toString() });
};
// keep console log outside the onChangeRadio function
console.log(skillsAdd);
const [dataToAdd, setDataToAdd] = useState({
name: '', gender: '', email: '', imgUrl: '', website: '', skills: ''
});
const handleEnrollClick = () => {
console.log(skillsAdd.toString())
setStudentData([...studentData, dataToAdd]);
setDataToAdd({ name: '', gender: '', email: '', imgUrl: '', website: '', skills: '' });
}
const onChange = (e) => {
setDataToAdd({ ...dataToAdd, [e.target.name]: e.target.value });
}
let skillsAdd = []
const onChangeRadio = (e) => {
if (e.target.checked) {
skillsAdd.push(e.target.value);
} else if (!e.target.checked) {
skillsAdd.splice(skillsAdd.indexOf(e.target.value), 1);
}
console.log(skillsAdd)
// setDataToAdd({...dataToAdd, skills: skillsAdd.toString()});
}
有 3 个复选框,'JAVA'、'HTML' 和 'CSS'。 'if' 和 'else if' 中的逻辑添加和删除复选框的这些值,即数组 'skillsAdd' 中的 'JAVA'、'HTML' 和 'CSS',效果很好美好的。但是,当我使用函数 'setDataToAdd' 设置 'dataToAdd' 的状态时,'skillsAdd' 数组会完全改变。以下是输出:
注释 'setDataToAdd' 并且选中所有三个复选框即 'JAVA'、'HTML' 和 'CSS' 时的输出:['java'、'html', 'css']
未注释 'setDataToAdd' 并且选中所有三个复选框即 'JAVA'、'HTML' 和 'CSS' 时的输出:['css']
当写入'setDataToAdd'时,它应该只会影响'dataToAdd',但它会影响'skillsArray'。这怎么可能?
您需要为 skillsAdd
维护一个单独的状态并使用它来更新 dataToAdd
状态。
const [dataToAdd, setDataToAdd] = useState({
name: "",
gender: "",
email: "",
imgUrl: "",
website: "",
skills: "",
});
// Use state for skillsAdd array
const [skillsAdd, setSkillsAdd] = [];
const handleEnrollClick = () => {
console.log(skillsAdd.toString());
setStudentData([...studentData, dataToAdd]);
setDataToAdd({
name: "",
gender: "",
email: "",
imgUrl: "",
website: "",
skills: "",
});
};
const onChange = (e) => {
setDataToAdd({ ...dataToAdd, [e.target.name]: e.target.value });
};
const onChangeRadio = (e) => {
const tempSkillsArray = [...skillsAdd];
if (e.target.checked) {
tempSkillsArray.push(e.target.value);
} else if (!e.target.checked) {
tempSkillsArray.splice(tempSkillsArray.indexOf(e.target.value), 1);
}
// update the skillsAdd state
setSkillsAdd(tempSkillsArray);
// update dataToAdd using tempSkillsArray
setDataToAdd({ ...dataToAdd, skills: tempSkillsArray.toString() });
};
// keep console log outside the onChangeRadio function
console.log(skillsAdd);