如何在useEffect中使用setTimeout重置React钩子状态

Mat*_*att 5 reactjs react-hooks use-effect use-state

我有一个简单的组件,可以将链接复制到剪贴板,并且想用复选标记交换链接图标。我有这样做的逻辑设置,但是在 3 秒后重置状态以将按钮重置回链接图标时遇到问题。如何正确设置我的useEffect和状态钩子以设置然后重置状态以显示/隐藏选中标记的链接并再次返回?

const [copySuccess, setCopySuccess] = useState('');
const [visible, setVisible] = useState(true);
const copyToClipBoard = async copyHeader => {
try {
  await navigator.clipboard.writeText(copyHeader);
    setCopySuccess('Copied!');
  } catch (err) {
    setCopySuccess('Failed to copy!');
  }
};

<Button>
    {copySuccess ? (
       <Icon name="success" />
    ):(
     <Icon
        name="linked"
        onClick={() => copyToClipBoard(url)}
     />
    )}
</Button>
Run Code Online (Sandbox Code Playgroud)

我正在尝试useEffect这样的:

useEffect(() => {
    setTimeout(() => {
      setVisible(false);
    }, 3000);
 });
  
Run Code Online (Sandbox Code Playgroud)

但不确定如何使用setVisible状态和超时,将图标交换回链接,让用户知道他们可以再次复制它。

Den*_*ash 1

您可以从 state 派生可见状态copySuccess,尝试将其添加到useEffectdep 数组:

const [copySuccess, setCopySuccess] = useState("");
const copyToClipBoard = async (copyHeader) => {
  try {
    await navigator.clipboard.writeText(copyHeader);
    setCopySuccess("Copied!");
  } catch (err) {
    setCopySuccess("Failed to copy!");
  }
};

useEffect(() => {
  if (copySuccess !== "") {
    setTimeout(() => {
      setCopySuccess("");
    }, 3000);
  }
}, [copySuccess]);

<Button>
  {copySuccess ? (
    <Icon name="success" />
  ) : (
    <Icon name="linked" onClick={() => copyToClipBoard(url)} />
  )}
</Button>;
Run Code Online (Sandbox Code Playgroud)

请参阅codesandbox示例中的类似逻辑:

function Component() {
  const [copyIsAvailable, setCopyIsAvailable] = useState(true);

  useEffect(() => {
    setTimeout(() => {
      setCopyIsAvailable(true);
    }, 1000);
  }, [copyIsAvailable]);

  return (
    <button onClick={() => setCopyIsAvailable(false)}>
      {copyIsAvailable ? "copy" : "copied"}
    </button>
  );
}
Run Code Online (Sandbox Code Playgroud)

编辑 Q-65373145-setTimeout