在卸载和销毁组件之前componentWillUnmount()
立即调用该方法。如果我们使用空数组 ([]) 作为第二个参数并将我们的函数放在 return 语句中,它将在组件卸载后执行,甚至在另一个组件安装后执行。据我所知,这是出于性能原因而完成的。为了不延迟渲染。useEffect
所以问题是 - 我们如何在卸载组件之前使用钩子调用某些函数?
我想要做的是一个应用程序,它在用户输入时保存他的输入(不提交表单)。我使用 setInterval 每 N 秒保存更新的文本。我需要在卸载组件之前强制保存更新。我不想在导航之前通过react-router使用提示。这是一个电子应用程序。我感谢有关如何实现此类功能的任何想法或建议。
更新
不幸的是,Effects with Cleanup在让浏览器绘制后运行。更多细节可以在这里找到:那么清理呢?. 它基本上意味着在卸载组件后运行清理,这与执行componentWillUnmount()
. 如果我将 console.log 语句放在清理代码和另一个组件中,我可以清楚地看到调用顺序。问题是我们是否可以在使用钩子卸载组件之前执行一些代码。
更新2
正如我所见,我应该更好地描述我的用例。让我们想象一个理论上的应用程序,它在 Redux 存储中保存其数据。我们有两个具有某种形式的组件。为简单起见,我们没有任何后端或任何异步逻辑。我们只使用 Redux 存储作为数据存储。
我们不想在每次击键时更新 Redux 存储。因此,我们将实际值保留在本地组件的状态中,当组件安装时,我们会使用存储中的值对其进行初始化。我们还创建了一个为 1 设置 setInterval 的效果。
我们有以下流程。用户键入一些东西。更新存储在本地组件状态中,直到调用我们的 setInterval 回调。回调只是将数据放入存储中(调度操作)。我们将回调放在 useEffect return 语句中,以在组件卸载时强制保存保存,因为我们希望在这种情况下尽快保存要保存的数据。
当用户在第一个组件中键入内容并立即转到第二个组件(快于 1 秒)时,问题就出现了。由于我们的第一个组件中的清理将在重新渲染后调用,因此我们的存储不会在第二个组件安装之前更新。正因为如此,第二个组件将获得其本地状态的过时值。
如果我们将回调放入componentWillUnmount()
其中,它将在卸载之前被调用,并且存储将在下一个组件安装之前更新。那么我们可以使用钩子来实现吗?