【问题标题】:How to keep updated react context value inside a callback in a custom hook如何在自定义挂钩的回调中保持更新的反应上下文值
【发布时间】:2020-12-15 06:37:24
【问题描述】:

我有一个 userContext 包装了我的应用程序,我有一个自定义钩子 useAnalytics 用于发送分析事件,我有一个 Login 组件,它执行登录并更改上下文中的用户值并发送事件。

我的问题是,当我在登录组件中执行 setUser 时,更新的用户数据不会反映在 useAnalytics 钩子中,它总是在每个事件中发送用户数据

这里是一个沙盒:https://codesandbox.io/s/romantic-perlman-wzxti?file=/src/Login.js 点击SEND后可以打开控制台查看结果

我知道这可能是一种反模式,但最好知道我为什么会出现这种行为

谢谢!

【问题讨论】:

  • 据我了解,问题是在第一次点击时它会发送一个空对象而不是{user: "pippo"},对吗?
  • @BesoKakulia 是的!你说的对! :)
  • 下面的解决方案应该可以工作,你的问题是你在状态更新之前发送分析,因为在反应中更新状态是一个异步操作。

标签: reactjs react-hooks react-context


【解决方案1】:

问题是所有设置状态都是异步的,而事件的发送是同步的。因此,您分派更改,发送分析,并在超时后更新状态。 有两种主要方法可以解决此问题。

  1. 设置超时等待react更新状态并在状态更新后推送解析:
setUser({ type: "login", data: { user: "pippo" } });
setTimeout(sendEvent, 16);
  1. 使用中间件发送分析:

添加一个中间件来拦截所有 reducer 更改,并将这些更改推送到分析,而无需 hook 本身。这将确保您通过检查 action.type 并从 action.payload 发送新数据来获得需要跟踪的所有更改。

【讨论】:

  • 嗨!当我使用第二种解决方案时......为什么setTimeout 中的神奇数字16? @Domino987
  • 这是反应更新的时间范围。每帧最长为 16 毫秒。
  • 我知道,你能提供文档@Domino987 吗?
  • 一年前我听说过关于光纤内部的讨论,这里有一篇文章涵盖了它:blog.logrocket.com/deep-dive-into-react-fiber-internals
猜你喜欢
  • 2022-01-27
  • 2021-10-17
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多