React.js 状态未在 useEffect Hook 的事件监听器中更新

Aka*_*ash 25 javascript reactjs react-state-management

因此,我想做的是将事件侦听器添加到按钮,按下该按钮时将获取状态值并控制台记录它。但即使在多次 setState 调用之后,记录的值也永远不会更新。

    useEffect(() => {
      const seamCarve = document.getElementById("process");
    
      seamCarve.addEventListener("click", (e) => {
        console.log(seamValue);
      });
    }, []);
Run Code Online (Sandbox Code Playgroud)

然后就是触发它的按钮

          <div id="seamvalue">
            <Typography variant="h6" align="center">
              Seams Reduction:<span id="valueOfSeam"> {seamValue} </span>
            </Typography>
          </div>
    
          <Button
            id="leftslider"
            variant="contained"
            color="primary"
            onClick={() =>
              seamValue - 10 > 0 ? setSeamValue(seamValue - 10) : setSeamValue(0)
            }
          >
            <Typography>{"<"}</Typography>
          </Button>
    
          <Button
            id="rightslider"
            variant="contained"
            color="primary"
            onClick={() => setSeamValue(seamValue + 10)}
          >
            <Typography>{">"}</Typography>
          </Button>
    
          <Button id="process" variant="contained" color="primary">
            <Typography>Carve</Typography>
          </Button>
Run Code Online (Sandbox Code Playgroud)

当我单击滑块时,该值会发生变化,但是当我按下 id="process" 的按钮以及与其关联的事件侦听器时,即使在更新状态后,它也只会打印 20。

Cer*_*nce 25

addEventListener如果可能的话,不要使用像 React 中那样的原生 DOM 方法- 相反,React 中工作以达到相同的效果。它将变得更有意义并且需要更少的复杂代码。

将点击侦听器放入返回的 JSX 语法中。

<Button
    id="process"
    variant="contained"
    color="primary"
    onClick={() => console.log(seamValue)}
>
    <Typography>Carve</Typography>
</Button>
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你绝对无法通过 React 附加点击监听器,那么当状态改变时再次附加监听器。另请注意,为了启动一个函数,您需要{在 后面加上一个=>,除非您使用简洁的 return (您不在这里)。

useEffect(() => {
    const seamCarve = document.getElementById("process");
    const handler = () => {
        console.log(seamValue);
    };
    seamCarve.addEventListener('click', handler);
    return () => seamCarve.removeEventListener('click', handler);
}, [seamValue]);
Run Code Online (Sandbox Code Playgroud)


Fir*_*ter 8

状态变量不会在 EventListener 内更新自身。如果您想更新和访问 EventListener 内的某些状态,请查看useRef. 另外,您需要将第二条useState语句替换为,useEffect因为这就是您想要实现的。应该回答您问题的相关帖子:错误的 React hooks 行为与事件侦听器

编辑:正如@CertainPerformance所述,事件监听器onClick可以直接在jsx内部使用。我的答案适用于在document.