当我在反应中设置其他对象的状态时,为什么我的数组值会发生变化?

奥姆卡尔·戈达克
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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我将其写入文件时,为什么3D numpy数组中的值会发生变化?

为什么当我转换为 ndarray 时我的日期列会发生变化

为什么当我将其设为链接时,文本的位置会发生变化?

为什么当我使用动画时项目的位置会发生变化?

为什么在使用React Redux过滤时我的原始状态会发生变化

React:useState 向我展示了以前的状态值,而当我查看 DevTools 时它会发生变化

当我向查询中添加内容时,为什么对象会在非对象中发生变化

为什么在Java中调用setTimeout函数之前,我的值会发生变化?

当我们切换到其他页面时范围是否会发生变化?

为什么当我使用不应对视图作出反应的着色器在模型周围移动视图时,它会发生变化?

当我将 javascript 对象添加到数组时,它们的属性会发生变化

当我从孩子那里调用它时 useState 值会发生变化

如果我使用传播运算符,为什么状态会发生变化?

为什么我重新安装时代码块设置会发生变化?

为什么我的按钮使用 React-icon 组件时返回值会发生变化?

为什么我移动时游戏中的事物会发生变化?Java处理环境

为什么在应用算术运算时我的“dtype”会发生变化?

通过JNI在Java代码中运行EGL函数时,为什么我对EGL函数的调用会发生变化?

滚动时,为什么RecyclerView中的CardView内容(以我为例)会发生变化?

为什么滚动后我的单元格中的图标会发生变化?

当我将数组传递给函数时,值发生变化

为什么数组元素中的值发生变化?

为什么当我分别使用“ if”语句和在“ if”中使用“ if”时值会发生变化?

为什么当我在 redux 中的这个 reducer 中的状态发生变化时,我的状态没有重新渲染

为什么当 pinia 中的状态发生变化时我的 vue 组件不更新?

为什么当我在网格上的立方体之间添加一个空间时,整个网格大小会发生变化?

在将我的欢迎频道 ID 设置为 mongodb 时,为什么我的最后两位数会发生变化

当我使用 bitmap.copy() 时,位图的方向会发生变化

当我运行 ```npm run dev`` 时,CSS 文件会发生变化