无法阅读其他部分

时间:2021-05-11 06:06:14

标签: javascript reactjs

我希望我的 div 选中/取消选中。 但是,其他部分无法读取我的代码(未定义) 请帮帮我...

(第一次点击没问题 第二次点击未定义)

import React, { useState } from "react";
import "./Blocking.css";

const Blocking = () => {
  const [checked, setChecked] = useState([false, false, false, false, false]);

  const onCheck = (e) => {
    e.preventDefault();
    console.log(e.target.getAttribute("name"));
    if (checked[e.currentTarget.getAttribute("name")] === false) {
      e.target.style.background = "aquamarine";
      setChecked(!checked[e.target.getAttribute("name")]);
      console.log("if " + checked[e.target.getAttribute("name")]);
    } else {
      e.target.style.background = "white";
      setChecked(!checked[e.target.getAttribute("name")]);
      console.log("else " + checked[e.target.getAttribute("name")]);
    }
  };

  return (
    <div className="container">
      <div className="items" name="0" onClick={onCheck}>
        1
      </div>
      <div className="items" name="1" onClick={onCheck}>
        2
      </div>
      <div className="items" name="2" onClick={onCheck}>
        3
      </div>
      <div className="items" name="3" onClick={onCheck}>
        4
      </div>
      <div className="items" name="4" onClick={onCheck}>
        5
      </div>
    </div>
  );
};

export default Blocking;

下面的代码块是 chrome 中的 console.log)

[HMR] Waiting for update signal from WDS...
Blocking.jsx:9 2
Blocking.jsx:14 if false
Blocking.jsx:9 2
Blocking.jsx:18 else undefined

首先,我单击任何块,然后打印正常。 第二,我点击任何块,然后打印未定义。

2 个答案:

答案 0 :(得分:0)

错误在于:

setChecked(!checked[e.target.getAttribute("name")]);

“checked”数组被一个布尔值替换。

你可以这样做:

let newChecked = [...checked];                     //Destructure
let index = e.currentTarget.getAttribute("name")   //Get index
newChecked[index] = !checked[index]                //Toggle check

setChecked(newChecked)

答案 1 :(得分:0)

问题

您正在改变 checked 状态数组。 setChecked(!checked[e.target.getAttribute("name")]); 将状态更改为单个布尔值,因此后续 checked[e.currentTarget.getAttribute("name")] 条件测试可能总是为假。

您也直接操作 DOM。这是 React 中的一种反模式。

您需要浅拷贝整个数组并更新特定索引。使用状态值导出背景颜色。

const onCheck = (e) => {
  e.preventDefault();
  const index = Number(e.currentTarget.getAttribute("name"));
  setChecked(checked => checked.map((val, i) => i === index ? !val : val));
};

return (
  <div className="container">
    <div
      className="items"
      style={{ background: checked[0] ? 'white' : 'aquamarine' }}
      name="0"
      onClick={onCheck}
    >
      1
    </div>
    ...etc
  </div>
);

Edit cant-read-else-part