React useUndo 钩子
我是 Web 开发新手,这是我的第一篇博客,欢迎任何建议或评论,这将有助于我学习和成长。
那么,我们就从钩子开始吧useUndo
。
上周,我们公司接到一个需求,需要一张卡片,上面有两个选项Accept
和Decline
,在选择任意一个选项后,我们会给用户一个时间,比如说 10 秒,在这段时间内,他们可以撤消操作。
eg --->
如果他们接受/删除
所以我想做一个撤销函数,它能帮我解决这个问题,而且如果我想在任何地方使用这个撤销函数,我都会用到它。所以我想出了一个useUndo
办法,可以用React lifecycle
因此,让我们讨论一下代码以及我如何实现它。
首先我将展示完整的代码,然后将其分成不同的部分并讨论每个部分。
首先我使用useState
react hook
- 调用撤消功能
- 存储超时 ID
- 检查方法执行是否完成。
它会在你尝试关闭标签页或窗口时抛出异常并发出警报。我们这样做是因为我们使用了 setTimeout 和 clearTimeout,所以它们是窗口作用域的,每次我们关闭或打开一个新标签页时都会创建一个新的作用域。所以,如果我们关闭标签页,setTimeout(web-api)将从回调队列中清除,即使时间间隔结束后也不会进入执行堆栈。
因此我们将监听event-listener
ie beforeunload
。
接下来,我认为此代码中最重要的部分useEffect
是
所以我们在这里做的是
- 首先,我们检查是否
invokeUndo
为真,如果是,则beforeunload
在窗口上添加一个事件监听器。然后,我们将函数放入超时函数中,该函数将在 10000 毫秒(即 10 秒)后执行。现在,setTimeout
每次运行 web-api 时,它都会返回一个唯一的数字,用于清除超时函数。
在 setTimeout 内部,我们调用该函数,当函数执行完成时,该函数被resolveMethod()
设置为 null,当函数执行完成时,该函数被设置为 true,并且当使用钩子时,如果我们在执行后有任何要执行的操作,则可以执行 & 。undoTimerId
setMethodExecuted
setInvokeUndo(false)
现在重要的部分是我们需要在 component-unmount 上做一些清理,因此我们将在 useEffect 中有一个返回语句来清除 eventListener。
现在要调用撤消,我们有invokeUndoMethod,它将是一个返回值,并且在使用这个钩子时我们可以使用它。
我们有一个undoMethod
将执行撤消方法(即将clearTimeout
setInvokeUndo 设置为 false)。
现在我们将得到最终的回报声明
undoMethod
执行撤消操作invokeUndoMethod
调用 undo 或启动 undo 方法isMethodExecuted
这将判断方法执行是否完成。
现在正在使用它。
我们可以导入这个 useUndo 钩子并将其传递到onAcceptance
我们需要在 10 秒后执行的方法中。
就这些了,伙计们😃
Update ---> github repo link
https://github.com/mishrabhavesh/useUndo
文章来源:https://dev.to/mishrabhavesh/react-useundo-hook-4h34