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)
状态变量不会在 EventListener 内更新自身。如果您想更新和访问 EventListener 内的某些状态,请查看useRef
. 另外,您需要将第二条useState
语句替换为,useEffect
因为这就是您想要实现的。应该回答您问题的相关帖子:错误的 React hooks 行为与事件侦听器
编辑:正如@CertainPerformance所述,事件监听器onClick
可以直接在jsx内部使用。我的答案适用于在document
.
归档时间: |
|
查看次数: |
20797 次 |
最近记录: |