【问题标题】:Updating React state after calling document.onpaste?调用 document.onpaste 后更新 React 状态?
【发布时间】:2021-05-31 12:24:40
【问题描述】:

我正在尝试设置一个功能组件,允许用户将剪贴板图像复制/粘贴到应用程序中。在 useEffect 中,我设置了 document.onpaste 。这是有效的,我能够获取图像并上传它。但是我需要让它在粘贴后更新状态,这样我就可以允许他们粘贴多个图像并将它们保持在数组中。

我已经简化了下面的问题。基本上,当我粘贴时,我想让它更新计数器值,但它没有。计数器总是 = 0。如果我使用正常的反应按钮 onclick 事件,它工作正常。我猜 onpaste 事件在 React 之外,但是,

如何处理粘贴事件并更新功能状态?

import React, { useEffect, useState } from 'react';

const AddAttachmentsContainer = ({ zoneid, tableid, field }) => {
  const [counter,setCounter]=useState(0);

  useEffect(() => {
    document.onpaste=(e)=>{GetImage(e);e.preventDefault()}
  },[])

  const GetImage = (e) => {
    setCounter(counter+1)
    console.log(counter)
  }
 }

【问题讨论】:

  • 如果我的回答帮助解决了你的问题,你可以接受这篇文章。希望它有所帮助。

标签: reactjs


【解决方案1】:

如果我没记错的话,我敢打赌状态已经更新。 useState 将更新状态并触发重新渲染。由于它是异步的,console.log 将使用旧状态值调用。

useEffect(() => console.log(counter), [counter]);

...不要忘记在useEffect 的第二个参数中添加countersee here...

另见here

当然,您也可以使用refs,但请注意它们的用例。很容易让 ref 不必要地在您的代码中传播。

说实话,在你已经拥有的useEffect 中只使用setCounter 并在之后调用你的GetImage 函数可能是明智之举......从那里,你可以检索计数器。有多种方法可以解决此问题。

【讨论】:

  • 没更新,我点了四五下,一直显示0。
  • 我发现这篇文章讨论了类似的问题:他们概述的解决方案对我不起作用。 medium.com/geographit/…
  • Refs 可以解决这个问题。使用useRef 时得到相同的结果吗?如果有帮助,我已经更新了更多我的答案。
  • 实际上,那篇文章中的解决方案确实有效!只需引用 MyStateRef.current 即可查看更新的值。一切都好
  • 是的!我记得ref.current。好地方。
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多