Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >React挂钩缺少依赖项

React挂钩缺少依赖项
EN

Stack Overflow用户
提问于 2019-09-17 00:19:08
回答 2查看 333关注 0票数 2

我希望有人能向我解释在这种情况下React钩子的正确用法,因为我似乎找不到它。

以下是我的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  useEffect(() => {
    _getUsers()
  }, [page, perPage, order, type])

  // This is a trick so that the debounce doesn't run on initial page load
  //  we use a ref, and set it to true, then set it to false after
  const firstUpdate = React.useRef(true);
  const UserSearchTimer = React.useRef()
  useEffect(() => {
    if(firstUpdate.current)
      firstUpdate.current = false;
    else 
      _debounceSearch()
  }, [search])

  function _debounceSearch() {
    clearTimeout(UserSearchTimer.current);
    UserSearchTimer.current = setTimeout( async () => {
        _getUsers();
    }, DEBOUNCE_TIMER);
  }

  async function _getUsers(query = {}) {
    if(type) query.type = type;
    if(search) query.search = search;

    if(order.orderBy && order.order) {
      query.orderBy = order.orderBy;
      query.order = order.order;
    }

    query.page = page+1;
    query.perPage = perPage;

    setLoading(true);
    try {
      await get(query);
    }
    catch(error) {
      console.log(error);
      props.onError(error);
    }
    setLoading(false);
  }

因此,实际上我有一个表,当页面更改、perPage更改、顺序更改或类型更改时,我会在其中显示用户,因此我希望重新查询用户列表,以便在这种情况下有一个useEffect。

现在,我通常会将_getUsers()函数放入该useEffect中,但唯一的问题是,当我的用户开始在搜索框中进行搜索时,我有另一个useEffect供我使用。

我不想用用户在框中输入的每个字母来重新查询我的用户列表,而是想使用一个在用户停止输入后触发的去保证器。

所以我自然会创建一个useEffect,它会观察值搜索,每次搜索更改时,我都会调用我的_debounceSearch函数。

现在我的问题是,我似乎无法摆脱React dependency警告,因为我的第一个useEffect依赖项中缺少_getUsers函数,我的_debounceSearch fn正在使用它,而在我的第二个useEffect中,我的第二个useEffect依赖项中缺少_debounceSearch。

我怎样才能以“正确”的方式重写它,这样我就不会因为缺少依赖而得到React警告?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2019-09-17 11:12:37

我将设置一个状态变量来保存去掉的搜索字符串,并将其用于获取用户。

假设您的组件将查询参数作为props获取,它将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Component({page, perPage, order, type, search}) {
    const [debouncedSearch, setDebouncedSearch] = useState(search);

    const debounceTimer = useRef(null);
    // debounce
    useEffect(() => {
        if(debounceTime.current) {
            clearTimeout(UserSearchTimer.current);
        }
        debounceTime.current = setTimeout(() => setDebouncedSearch(search), DEBOUNCE_DELAY);
    }, [search]);

    // fetch 
    useEffect(() => {
        async function _getUsers(query = {}) {
            if(type) query.type = type;
            if(debouncedSearch) query.search = debouncedSearch;

            if(order.orderBy && order.order) {
              query.orderBy = order.orderBy;
              query.order = order.order;
            }

            query.page = page+1;
            query.perPage = perPage;

            setLoading(true);
            try {
              await get(query);
            }
            catch(error) {
              console.log(error);
              props.onError(error);
            }
            setLoading(false);
        }
        _getUsers();
    }, [page, perPage, order, type, debouncedSearch]);
}

在初始渲染时,去抖动效果将设置一个去抖动计时器...但这是可以的。

在去抖动延迟之后,它会将deboucedSearch状态设置为相同的值。

由于deboucedSearch没有改变,ferch效果将不会运行,因此不会浪费fetch。

随后,当更改除搜索之外的任何查询参数时,fetch effect将立即运行。当搜索参数改变时,fetch效果将在去抖动后运行。

理想情况下,去抖动应该在搜索参数的<input />处完成。在抓取组件中进行去抖动的一个小问题是,搜索中的每个变化都会经历去抖动,即使它是通过在文本框中键入以外的方式发生的,例如,点击预先配置的搜索的链接。

票数 1
EN

Stack Overflow用户

发布于 2019-09-17 00:55:55

钩子依赖关系的规则非常简单明了:如果钩子函数使用或引用组件作用域中的任何变量,您应该考虑将其添加到依赖关系列表(https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies)中。

对于你的代码,有几件事你应该知道:

1.使用第一个_getUsers useEffect:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useEffect(() => {
    _getUsers()
  }, [page, perPage, order, type])

 // Correctly it should be:
 useEffect(() => {
    _getUsers()
  }, [_getUsers])

此外,您的_getUsers函数当前在组件每次重新呈现时都会重新创建,您可以考虑使用React.useCallback来对其进行记忆。

2.第二个useEffect

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
useEffect(() => {
    if(firstUpdate.current)
      firstUpdate.current = false;
    else 
      _debounceSearch()
  }, [search])

// Correctly it should be
useEffect(() => {
    if(firstUpdate.current)
      firstUpdate.current = false;
    else 
      _debounceSearch()
  }, [firstUpdate, _debounceSearch])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57965832

复制
相关文章
maven缺少依赖包,强制更新依赖命令
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
一个会写诗的程序员
2020/04/30
7.4K0
学习WPF——初识依赖项属性
入门 首先创建一个依赖项属性 然后绑定父容器的DataContext到这个依赖项的实例 接着绑定子元素的属性到依赖项属性(注意Button的Content属性) 程序最终的运行结果: 说明 首先是定义
liulun
2018/01/12
9400
学习WPF——初识依赖项属性
BattlEye通讯挂钩
为了与广大视频游戏黑客作斗争,反作弊系统需要从客户那里收集和处理大量信息。通常,这通常是通过将所有内容发送到服务器进行进一步分析来完成的,这使攻击者可以通过有趣的方式规避这些系统,其中之一是劫持了通信例程。
franket
2021/02/09
3.9K0
TestNG框架之依赖项(五)
每个CASE都不是独立的,这就像同步任务一样,总得有个顺序的过程,自动化测试尤其如此,为什么这样说了?每个测试用例都不是独立的,都会涉及到不同业务场景之间的关联。再举一个更加简单的案例,就是HTTP的交互,在API的自动化测试中,我们对一个系统的操作,首先是要进入到这个系统,那么我们就需要获取登录成功后的的token信息,我们才能够对系统做一系列的操作。当然这样的案例还是有很多的。让我们庆幸的是作为主流的测试框架TestNG它提供的这样的能力,这样我们就可以很完美的在业务中进行整合和应用。在TestNG的框架中,依赖还是在两个维度来展开,一个是测试用例之间的关系,另外一个是我们可以通过testng.xml配置文件来实现我们的诉求。 我们先来看依赖性的测试,行代码的角度来深度了解依赖性测试到底是什么,案例代码如下:
无涯WuYa
2021/04/20
7740
TestNG框架之依赖项(五)
Linux 下安装软件提示缺少依赖的正确解法
Linux下的高度自由,以及敲键盘的乐趣……所以现如今很多人开始觉醒,开始从Windows转向Linux阵营 曾经记得有这么一句话(出处不详):Windows赢得了桌面,Linux却赢得了整个世界
爱技术的小黄鸭
2023/06/15
3.3K0
Linux 下安装软件提示缺少依赖的正确解法
fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖
learn from https://fastapi.tiangolo.com/zh/tutorial/dependencies/
Michael阿明
2022/01/07
2.9K0
fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖
Vue CLI 的依赖项被投毒!
vue-cli 的依赖项 node-ipc 包正在以反战为名进行供应链投毒,该包在 npm 每周有上百万下载量。
@超人
2022/04/14
1.2K0
Vue CLI 的依赖项被投毒!
【Android Gradle 插件】Gradle 依赖管理 ⑩ ( dependencies 依赖配置项 configurations )
添加构建依赖项 参考文档 : https://developer.android.google.cn/studio/build/dependencies
韩曙亮
2023/03/30
1.3K0
【Android Gradle 插件】Gradle 依赖管理 ⑩ ( dependencies 依赖配置项 configurations )
4.5 MinHook 挂钩技术
MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。MinHook使用纯汇编语言实现,在安装和卸载钩子时只需要短暂地锁定目标线程,因此对目标线程的影响非常小。
微软技术分享
2023/10/11
3500
4.5 MinHook 挂钩技术
Manage Jenkins报错:"依赖错误: 部分插件由于缺少依赖无法加载...",解决办法
就是缺少依赖的插件,缺少啥已经列举出来了,我们把对应的插件安装上就好了。 步骤一: 直接点右上角的纠正。
小蓝枣
2020/09/23
2.8K0
maven 解包依赖项中的文件
使用goal:unpack-dependencies 在配置参数includeArtifactIds中指定要解包的模块制件ID
路过君
2022/07/20
2.4K0
绕过 EDR 挂钩
通过修补 NT API 存根并在运行时解析 SSN 和系统调用指令来绕过 EDR 挂钩
Khan安全团队
2023/02/23
6130
绕过 EDR 挂钩
FastAPI从入门到实战(16)——依赖项
九陌斋地址:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-16-yi-lai-xiang
MinChess
2022/12/27
6830
FastAPI从入门到实战(16)——依赖项
4.5 MinHook 挂钩技术
MinHook是一个轻量级的Hooking库,可以在运行时劫持函数调用。它支持钩子API函数和普通函数,并且可以运行在32位和64位Windows操作系统上。其特点包括易于使用、高性能和低内存占用。MinHook使用纯汇编语言实现,在安装和卸载钩子时只需要短暂地锁定目标线程,因此对目标线程的影响非常小。
微软技术分享
2023/09/18
5390
4.5 MinHook 挂钩技术
React Router核心依赖--history库
使用 React 开发稍微复杂一点的应用,React Router 几乎是路由管理的唯一选择。虽然 React Router 经历了 4 个大版本的更新,功能也越来越丰富,但无论怎么变,它的核心依赖 history 库却一直没变。下面我们来了解下这个在 github 上有 5k+ 星的库到底提供了什么功能。
Dickensl
2022/06/14
8970
Visual Studio2010中的外部依赖项
Visual Studio2010中的项目下拉列表下面有外部依赖项,里面显示的文件是你程序中显示包含的头文件所包含的的头文件。比如,main函数里面包含了windows.h头文件,而windows.h头文件又包含其他头文件,而这些头文件又可能还包含另外的头文件,所有这些都显示在外部依赖项里面。于是有的时候外部依赖性就变得很庞大。 若想减少外部依赖项,那就尽量避免包含不必要的头文件。 不过根据编译器的行为,可能编译时应该会过滤掉那些虽然包含进来,但完全没有用到的头文件。完全可以不必理会外部依赖项。
AIHGF
2019/02/18
2.7K0
4.2 Inline Hook 挂钩技术
InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截、修改、增强现有函数功能。它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义处理,从而控制或增强程序行为。Hook技术常被用于系统加速、功能增强、开发等领域。本章将重点讲解Hook是如何实现的,并手动封装实现自己的Hook挂钩模板。
微软技术分享
2023/10/11
3430
4.2 Inline Hook 挂钩技术
4.3 IAT Hook 挂钩技术
IAT(Import Address Table)Hook是一种针对Windows操作系统的API Hooking 技术,用于修改应用程序对动态链接库(DLL)中导入函数的调用。IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。
微软技术分享
2023/09/15
9840
4.3 IAT Hook 挂钩技术
4.4 EAT Hook 挂钩技术
EAT(Export Address Table)用于修改动态链接库(DLL)中导出函数的调用。与IAT Hook不同,EAT Hook是在DLL自身中进行钩子操作,而不是修改应用程序的导入表。它的原理是通过修改DLL的导出函数地址,将原本要导出的函数指向另一个自定义的函数。这样,在应用程序调用DLL的导出函数时,实际上会执行自定义的函数。
微软技术分享
2023/09/15
2960
4.4 EAT Hook 挂钩技术
点击加载更多

相似问题

React挂钩调度缺少依赖项:“”useEffect“”

31

React挂钩useEffect缺少依赖项:'fetchUser‘。useEffect问题?

122

React缺少依赖项

15

React缺少依赖项

12

React挂钩React.useEffect缺少依赖项:'loadData‘。包括它或删除依赖项数组

118
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文