我可以在不使用 useState 的情况下访问 useEffect 中的变量吗?

Posted

技术标签:

【中文标题】我可以在不使用 useState 的情况下访问 useEffect 中的变量吗?【英文标题】:Can I access a variable inside useEffect without use useState? 【发布时间】:2021-11-17 00:19:47 【问题描述】:

我想在不使用 useState 的情况下访问 useEffect 挂钩中的变量。我该怎么做?

这是我的代码:

let numberOfLessons;

useEffect(() => 
        getLessons()
            .then(response => 
                numberOfLessons = response.data().length // 6
            )
            .catch(error => 
                console.log(error)
            )
    , [])


console.log(numberOfLessons) // undefined

【问题讨论】:

您不能从函数外部访问函数内部声明的变量。使用useState有什么问题? let 的作用域问题是块作用域,因此在定义块之外引用它是不行的。 您是说在 useEffect 内部但在外部访问它? let 有一个块作用域,所以你不能在外面访问它。 首先,您尝试访问一个仅在“then”回调函数中声明且可用的变量。所以对你的问题的回答是否定的,如果你需要全局访问这个变量,你应该使用 useState 或者考虑使用状态管理工具,例如 Redux、MobX 等。 在您的原始帖子中,您使用let 在 then 回调中定义了变量。现在您可以在该特定代码块之间的任何位置访问该变量,即在 之间。现在在您编辑的帖子中,您已将声明向上移动,现在您可以使用它访问变量。但是您仍然会打印undefined,因为当console.log 执行时,您的numberOfLessons = response.data().length 正在callstack 中等待event loop 接收。这意味着您将获得undefined,因为这是您的numberOfLessons 变量的初始值。 【参考方案1】:

没有什么可以阻止你这样做。但缺点是你的变量不是 React 状态的一部分。

它的值最初设置为undefined。稍后当您将其设置为 6 时,不会触发 React 重新渲染视图,因此您的 6 可能永远不会出现在屏幕上。

但也许这对你来说并不重要。如果仅使用此变量,例如对于日志记录,React 是否知道它并不重要。


在您的确切示例中,console.log 未定义,因为您正在记录 值设置之前。这并不是真正的 React 特定问题。这就是异步代码的工作方式。如果你这样做了

setTimeout(() => console.log(numberOfLessons), 5000)

那么您将按预期获得6

【讨论】:

以上是关于我可以在不使用 useState 的情况下访问 useEffect 中的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不使用点运算符的情况下访问结构内部的结构吗?

HOOK—useState、useEffect的使用

如何在不使用帐户密钥的情况下访问存储帐户 blob 容器?

我可以在不提供 FTP 访问权限的情况下安装/更新 WordPress 插件吗?

可以在不使用内联绘图的情况下远程访问 IPython Notebook 吗?

有没有其他方法可以在不使用`getContentResolver()`的情况下访问联系人?