当前位置: 首页 > 知识库问答 >
问题:

useEffect挂钩中事件侦听器中的react.js状态未更新

濮佑运
2023-03-14

所以,我要做的是在一个按钮上添加一个事件监听器,当按下该按钮时,它将接受一个状态的值,并将其记录在控制台中。但即使在多次调用setState之后,记录的值也不会更新。

const [seamValue, setSeamValue] = useState(20);

useEffect(()=>
    const seamCarve = document.getElementById("process");
    
    seamCarve.addEventListener('click',(e)=>{

      console.log(seamValue)
    })


  },[]);

然后是触发它的按钮

        <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>

当我单击滑块时,该值会发生变化,但当我按下带有id=“process”的按钮并与之相关联的事件侦听器时,即使在更新状态后,它也只打印20。

共有1个答案

松阳泽
2023-03-14

尽可能不要在React中使用本机DOM方法,如AddEventListener-而是在React中工作以达到相同的效果。这样会更有意义,而且需要更少的复杂代码。

将click侦听器放在返回的JSX语法中。

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

如果由于某种原因无法通过React附加click侦听器,则在状态更改时再次附加侦听器。还要注意,要启动一个函数,您需要在=>后面加上一个{,除非您使用的是简洁的返回(这里没有)。

useEffect(() => {
    const seamCarve = document.getElementById("process");
    const handler = () => {
        console.log(seamValue);
    };
    seamCarve.addEventListener('click', handler);
    return () => seamCarve.removeEventListener('click', handler);
}, [seamValue]);
 类似资料:
  • 我有以下Useffect钩子: 然而,我得到以下警告: React Hook useEffect缺少依赖项:“image.height”、“image.img”、“image.width”、“scaleProperties.scaleInstance”和“scaleProperties.scaleValueMm”。请包含它们或删除依赖项数组 Image和scaleProperties也是组件的状态

  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这

  • 问题内容: 可以说我有一些状态依赖于其他状态(例如,当A更改时,我希望B更改)。 创建一个观察A并将B设置在useEffect钩内的钩子是否合适? 效果是否会级联,从而在我单击按钮时会触发下一个效果,从而导致b发生变化,从而导致第二个效果在下一次渲染之前触发?这样构造代码是否有性能下降? 问题答案: 效果始终在渲染阶段完成后执行,即使您将setState放在一个效果中,另一个效果也将读取更新后的状

  • 问题内容: 我正在尝试新的React Hooks,并有一个带有计数器的Clock组件,该计数器应该每秒增加一次。但是,该值不会增加到超过一。 问题答案: 原因是传递给的闭包中的回调仅访问第一个渲染器中的变量,而无法访问后续渲染器中的新值,因为第二次未调用。 回调中的值始终为0 。 就像您熟悉的状态挂钩一样,状态挂钩有两种形式:一种是处于更新状态的状态,另一种是将当前状态传入的回调形式。您应该使用第

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?