【问题标题】:Material UI Checkbox is repeating the same value twice in one instanceMaterial UI Checkbox 在一个实例中重复相同的值两次
【发布时间】:2021-11-29 03:47:15
【问题描述】:

使用 React 和 Material UI 复选框

我正在尝试让复选框在选中时将状态更改呈现为特定值。

一切正常,但只有在前 2 次单击复选框时,状态才会正确更新

const [waterChecked, setWaterChecked] = React.useState(true);
const [data, setData] = useState(null);

const handleChangeWater = (event) => {
    setWaterChecked(event.target.checked);
    if (waterChecked) {
      setData([1, 2, 3, 4])
    } else if (!waterChecked) {
      setData([])
    }
  };

<ul>
            <Checkbox
              waterChecked={waterChecked}
              onChange={handleChangeWater}
              defaultChecked={false}
              inputProps={{ 'aria-label': 'controlled' }}
            />
            Water
          </ul>   

在我的 handleChangeWater 函数中放置一个 console.log(waterChcked) 可以授予这些输出。点击 5 次后,我得到:

真、真、假、真、假

它在前 2 次点击后完全按照预期工作,唯一的问题是顺序颠倒了,因为开始时的双真。

例如 7 次单击复选框输出

真、真、假、真、假、真、假

等等。

任何建议将不胜感激,我是新手,所以请原谅任何语法问题。

谢谢!

【问题讨论】:

    标签: javascript reactjs material-ui state


    【解决方案1】:

    setWaterChecked(event.target.checked) 异步设置waterChecked 状态。因此,以后不能使用它来设置data 状态。因此,使用event.target.checked 值设置data 状态如下。

    const [waterChecked, setWaterChecked] = React.useState(true);
    const [data, setData] = useState(null);
    
    const handleChangeWater = (event) => {
        const checked = event.target.checked;
      setWaterChecked(checked);
      if (checked) {
        setData([1, 2, 3, 4]);
      } else {
        setData([]);
      }
    };
    
    <ul>
      <Checkbox
        waterChecked={waterChecked}
        onChange={handleChangeWater}
        defaultChecked={false}
        inputProps={{ "aria-label": "controlled" }}
      />
      Water
    </ul>;
    

    或者您可以使用useEffect 跟踪waterChecked 状态并对data 状态进行必要的更改,如下所示。

    const [waterChecked, setWaterChecked] = React.useState(true);
    const [data, setData] = useState(null);
    
    const handleChangeWater = (event) => {
      setWaterChecked(event.target.checked);
    };
    
    useEffect(() => {
      if (waterChecked) {
        setData([1, 2, 3, 4]);
      } else {
        setData([]);
      }
    }, [waterChecked]);
    
    <ul>
      <Checkbox
        waterChecked={waterChecked}
        onChange={handleChangeWater}
        defaultChecked={false}
        inputProps={{ "aria-label": "controlled" }}
      />
      Water
    </ul>;
    
    

    【讨论】:

    • 感谢您的快速答复!这正是我需要的谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多