gpt4 book ai didi

reactjs - 如何在 useEffect 中使用 setTimeout 重置 React 钩子(Hook)状态

转载 作者:行者123 更新时间:2023-12-03 17:23:00 24 4
gpt4 key购买 nike

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

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>
我正在尝试 useEffect像这样:
useEffect(() => {
setTimeout(() => {
setVisible(false);
}, 3000);
});

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

最佳答案

您可以从 copySuccess 导出可见状态状态,尝试将其添加到 useEffect dep 数组:

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>;
请参阅代码沙盒示例中的类似逻辑:
function Component() {
const [copyIsAvailable, setCopyIsAvailable] = useState(true);

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

return (
<button onClick={() => setCopyIsAvailable(false)}>
{copyIsAvailable ? "copy" : "copied"}
</button>
);
}
Edit Q-65373145-setTimeout

关于reactjs - 如何在 useEffect 中使用 setTimeout 重置 React 钩子(Hook)状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65373145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com