Exhaustive-deps 规则无法将自定义挂钩的结果识别为 React 参考

2023-12-26

想象一个钩子:

export function useMounted() {
    const mounted = React.useRef<boolean>(false);
    React.useEffect(() => {
        mounted.current = true;
        return () => {
            mounted.current = false;
        };
    }, []);
    return mounted;
}

我想使用该钩子来确定组件是否仍然安装。它的一种用例是异步加载图像并仅在浏览器获取并缓存图像时才显示图像。这种用例的简化版本可以是:

function useLazyImage(src: string, triggerCallback: any) {
    const mounted = useMounted();
    const image = useRef<HTMLImageElement>();

    useEffect(() => {
        if (!!src) {
            image.current = new Image();
            image.current.onload = () => {
                if (mounted.current)
                    triggerCallback();
            };
            image.current.src = src;
            return () => {
                image.current = undefined;
            };
        }
        return undefined;
    }, [src]);
}

它不包括错误处理,也不处理triggerCallback 的更改,但它显示了我的问题。 React-hooks/exhaustive-deps 警告我丢失mounted依赖,尽管它不应该是afaik。自从mounted是 Ref,通过使用它,我不会意外地关闭过时的范围,并且 eslint 事实上知道这一点。如果我将代码更改为

function useLazyImage(src: string, triggerCallback: any) {
    const mounted = React.useRef<boolean>(false);
    React.useEffect(() => {
        mounted.current = true;
        return () => {
            mounted.current = false;
        };
    }, []);
    const image = useRef<HTMLImageElement>();

eslint 不再警告我了。 ESLint 的限制是它无法知道我的自定义钩子的结果是什么,还是我做错了并且存在潜伏的错误?


在您的第一个示例中,您将从useMounted创建它的函数。因此,参考资料正在泄露,因此可能会被更改。在下面的示例中,引用被创建为函数本地值,因此不是组件状态的一部分。这就是为什么您没有看到底部示例中的警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Exhaustive-deps 规则无法将自定义挂钩的结果识别为 React 参考 的相关文章

随机推荐

  • 通过定义者角色权限在PL/SQL过程中执行动态DDL

    我想在管理员用户拥有的过程中执行一些动态 DDL 我想使用具有定义者权限的技术操作用户执行此过程 操作用户没有创建表角色 问题是 创建表 权限是通过使用角色授予管理员用户的 这不允许我执行 DDL 因为角色似乎不计入命名的 pl sql 块
  • mod_rewrite:如何重定向 HTTP DELETE 和 PUT

    我尝试使用 mod rewrite 在 php 中编写一些 REST API 我的问题是 如何处理 HTTP DELETE 和 PUT 例如 网址为 书 1234 其中 1234 是一本书的唯一 ID 我想将此 id 1234 重定向 到
  • 使用 Filehelpers 处理 DelimitedRecord 中的 NEWLINE

    我使用优秀的 FileHelpers 库来解析许多不同的文件 其中一个文件的 一些 行看起来像这样 id name comments date 01 edov bla bla bla bla 2012 01 01 02 john bla b
  • 如何从空手道中的 api 端点获取下载的 xlsx 文件?

    我有一个下载 xlsx 文件的端点 在我的测试中 我需要检查文件的内容 不是将文件与另一个文件进行比较 而是读取内容并检查 我正在使用空手道框架进行测试 并尝试使用 apache POI 来处理 Excel 工作表 但是 调用下载端点时我从
  • SQL查询获取每分钟的最后一条记录

    我有一个每秒更新一些值的表 我想检索每分钟的最后一条记录 我已经尝试过这段代码 但它返回所有记录 SELECT t0 brandID t0 brandName t0 cdt t0 udt t0 brandstatus FROM brands
  • laravel背包用户密码

    我在背包里为我的用户做了一个crud 当我创建用户时 一切正常 但如果我更新 我会收到 密码 错误 因为如果我不想更新它 我会将其留空 密码不能为空 如果我将其留空 如何才能不在 POST 中添加 密码 或者我如何默认当前密码 还有一个 确
  • 使用索引查找相似图像的算法

    有一些非常好的图像比较工具可以找到相似的图像 即使它不完全相同 例如 尺寸 壁纸 亮度 对比度的变化 我这里有一些示例应用程序 Unique Filer 1 4 共享软件 https web archive org web 20010309
  • 使用 --recursive 和 --bare 克隆 git 存储库

    为了克隆存储库及其所有子模块 我知道您可以这样做 git clone recursive
  • 作为 Snakemake 工作流程输入的值数组

    我开始将我的工作流程从Nextflow to Snakemake并且已经在我的管道开始处碰壁了 管道通常以数字列表开头 代表我们检测器的 运行编号 我所拥有的例如是run list txt like detector id run numb
  • 如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

    当我跑步时PM gt Remove Migration context BloggingContext在 VS2015 中使用 EF Core 的 ASP NET Core 项目出现以下错误 System InvalidOperationE
  • fastApi 中的 python 全局变量无法正常工作

    我有一个简单的 fastApi 演示应用程序 它实现了一个功能 通过调用名为changeResponse的post api来获取不同的响应json changeResponse api只是改变了一个全局变量 另一个api通过同一个全局变量返
  • 手机上的陀螺仪漂移

    很多帖子都讨论了陀螺仪漂移问题 有些人说陀螺仪读数有漂移 但其他人说积分有漂移 原始陀螺仪读数有漂移 link https stackoverflow com questions 1586658 combine gyroscope and
  • 在 ASCIIFoldingFilter 中使用静态“foldToAscii”方法

    我一直在使用 ASCII 折叠过滤器来处理变音符号 不仅适用于弹性搜索中的文档 还适用于各种其他类型的字符串 public static String normalizeText String text boolean shouldTrim
  • 单个解析服务器中的多个应用程序

    我花了整整一周的时间将 parse com 上托管的应用程序迁移到解析服务器 设法使一切完美运行 唯一的问题是让它在单个硬件上运行多个应用程序 而无需为此分配服务器应用程序它有 它会变得昂贵 我读了这个讨论 https github com
  • android 多数据源的分页库DataSource.Factory

    我有多个数据源 但只有一个DataSourceFactory 因此 所有来源都共享一个工厂 我需要每个数据源一个 DataSourceFactory 在我的应用程序中 我有多个 RecyclerViews 视图 因此有多个自定义数据源 那么
  • PHP 5.4 中删除 safe_mode 后的安全性在哪里

    我心里有一个棘手的问题 safe modePHP 5 4 中已删除 那么此删除的安全性如何 这是否意味着任何应用程序都可以执行任何程序 为此目的使用什么技术来防止此类暴力行为 本文 http ilia ws archives 18 PHPs
  • java.lang.SecurityException AWSCredentialsProvider 签名者信息不匹配

    我正在使用 2 个亚马逊提供的库 redshift jdbc42 1 2 27 1051 and aws java sdk core 1 11 600 两个库都定义了一个类AWSCredentialsProvider包装下com amazo
  • 将文件从服务器下载到 Ionic2 应用程序中

    我需要在我的中实现一个功能Ionic2用户可以将特定视频文件下载到 Ionic2 应用程序中 经检查Ionic Native部分 我发现以下插件可用 File 文件选择器 文件开启器 文件路径 但找不到诸如 cordova 插件 文件传输
  • 如何在Windows 10上更改Node JS进程名称?

    我有一个node js在 Windows 10 上运行的进程 我想更改进程的名称 以便可以获得一些性能详细信息 我尝试改变流程 标题的财产process对象但是 它不会反映在电源外壳中 我只能找到node作为进程名称 有没有其他方法可以更改
  • Exhaustive-deps 规则无法将自定义挂钩的结果识别为 React 参考

    想象一个钩子 export function useMounted const mounted React useRef