我有全局状态通过Context/AppState/AppStateDispatch工作。我也有组件状态通过 useState 工作。
但有时避免使用这些可能会有所帮助:
-
我们需要立即访问当前函数中的值,并且不能等待下一次渲染来获取它。通过useState/AppStateDispatch存储它将阻止该值在下一次渲染之前可访问
-
。而且,整个应用程序全局都需要这些相同的值
-
。并且 useRef 将在组件卸载时被销毁
在这种情况下,似乎适合使用全局可用的非呈现导致的对象来保存这些项的状态。
这很容易实现...但它似乎不是反应性的。我错过了什么吗?
过去几天我对此进行了广泛的研究。以下是一些观察结果。
在我的用例中,我使用的是外部webRTC服务。他们的代码要求我的应用程序安装侦听器,以用于来电、响应视频流的发布等。列表器需要访问组件的 webRTC 特定变量
同时,这些变量不能是组件状态或应用状态的一部分,因为在更新时,它们的值在下次刷新之前不可用,并且组件的其余部分需要在当前呈现中访问它们。
当然,使用独立于 React 并且不触发刷新的应用程序全局变量是笨拙的。
这是我目前使用的方法。到目前为止,它似乎很有帮助。
- 创建一个应用程序状态对象来存储与我的组件使用 webRTC 相关的所有变量。
- 通过调用函数来初始化它,
getWebRTCDefaults()
. - 在组件装载时,将其从应用状态复制到组件级变量。注意 - 它不处于组件状态 - 它是一个组件级变量,可在组件中的任何位置访问。
- 因此,它可以随时在组件内更新,并且其值在整个组件中立即可用。
- 当调用开始和结束时 - 只有这样 - 我使用
React context dispatch
来更新应用程序状态对象。 即我不通过useEffect
更新该对象,因为这可能会导致不必要的渲染。
这种方法似乎很有帮助。我可以卸载组件,当我重新安装它时,它会从中断的地方继续 - webRTC视频仍在运行。