首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
【Vue_05】前端工程化
一、ES6的模块化 1. ES6模块化规范 每个 js 文件都是一个独立的模块 导入模块成员使用 import 关键字 暴露模块成员使用 export 关键字 2. 基本语法 发使用 ex
用户8250147
2021/02/04
5450
【Vue_05】前端工程化
Webpack基本使用
Webpack介绍:主要用于web项目中打包资源进行自动构建,Webpack将所有资源视为JS的模块来进行构建,所以对于CSS,Image等非JS类型的文件,Webpack会使用相应的加载(loader)器来加载成其可识别的JS模块资源,通过配置一些信息,就能将资源进行打包构建,更好地实现前端的工程化 Webpack安装 本地安装: npm install -D webpack -D 实际上是简写 --dev-save 如果你使用Webpack 4+ 版本, 你还需要安装CLI. npm inst
一个淡定的打工菜鸟
2018/12/27
7100
Flow 静态类型检查开发环境搭建
Flow 是 Facebook 出品的,针对 JavaScript 的静态类型检查工具。它可以帮助捕获 JavaScript 开发中的常见错误,而不需要额外地修改原有的代码,比如静态类型转换,空值引用等问题。同时,Flow 为 JavaScript 添加了静态类型的语法标识,这样开发者便可以明确代码中的类型,让其自动地被 Flow 所维护。本文将详细介绍使用 Webpack、ESlint、Babel 与 Flow 集成的开发环境的构建过程。
用户6167509
2020/04/21
1.2K0
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/09/28
4280
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/08/18
6470
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
Webpack基本使用
Webpack介绍:主要用于web项目中打包资源进行自动构建,Webpack将所有资源视为JS的模块来进行构建,所以对于CSS,Image等非JS类型的文件,Webpack会使用相应的加载(loader)器来加载成其可识别的JS模块资源,通过配置一些信息,就能将资源进行打包构建,更好地实现前端的工程化 Webpack安装 本地安装: npm install -D webpack -D 实际上是简写 --dev-save 如果你使用Webpack 4+ 版本, 你还需要安装CLI. npm ins
一个淡定的打工菜鸟
2018/09/06
4480
Webpack基本使用
webpack5快发布了,你还没用过4吗?
webpack5 预计会在 2020 年年初发布,之前从 alpha 版本就有关注,本次重点更新在长期缓存,tree shakking 和 es6 打包这块。具体变更可以参考https://github.com/webpack/changelog-v5/blob/master/README.md。
前端森林
2020/04/23
1.6K0
webpack5快发布了,你还没用过4吗?
Webpack 资源管理
静默虚空
2018/01/05
1.7K0
从零开始配置webpack(基于webpack 4 和 babel 7版本)
webpack启动后会从 Entry 里配置的 Module 开始递归解析 Entry 依赖的所有Module.每找到一个Module,就会根据配置的Loader去找出对应的转换规则,对Module进行转换后,再解析出当前的Module依赖的Module.这些模块会以Entry为单位进行分组,一个Entry和其所有依赖的Module被分到一个组也就是一个Chunk。最好Webpack会把所有Chunk转换成文件输出。在整个流程中Webpack会在恰当的时机执行Plugin里定义的逻辑。
胡哥有话说
2019/09/12
6320
深入浅出webpack的最佳实践!
导语 | 本文推选自腾讯云开发者社区-【技思广益 · 腾讯技术人原创集】专栏。该专栏是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。本文作者是腾讯云前端开发Jou。 自从加入腾讯,作者便一直在使用webpack,因此,本文主要整理一下webpack相关的知识点,由浅入深,后续会一直更新分享,以便对此方面感兴趣的开发者们提供一些经验和帮助。欢迎点击文末「阅读原文」访问腾讯云开发者社区,查看作者作品~ 核心概念 (一)Module
腾讯云开发者
2022/08/31
6720
深入浅出webpack的最佳实践!
Webpack最佳实践
Webpack 可以看做是模块打包机,把解析的所有模块变成一个对象,然后通过入口模块去加载我们的东西,然后依次实现递归的依赖关系,通过入口来运行所有的文件。由于 webpack 只认识js,所以需要通过一系列的 loader 和 plugin 转换成合适的格式供浏览器运行。
gogo2027
2022/10/17
3.3K0
【Vue】各种loader的基本配置与使用
接下来我们需要移除无序列表中的行头前缀。 在src文件夹中创建css文件夹,再从css文件夹中创建index.css文件,并写好样式代码。
坚毅的小解同志的前端社区
2022/12/09
8160
【Vue】各种loader的基本配置与使用
webpack配置React开发环境(上)
Webpack 是一个前端资源加载/打包工具,我们部门的一条主要技术栈就是Webpack+React+ES6+node,虽然之前自己做个人项目也接触好多次Webpack,但是自己并没有研读总结过Web
牧云云
2018/05/02
1.6K0
[javascript]使用babel转换es6语法
babel是将 ES2015+ 语法的 JavaScript 代码编译为能在当前浏览器上工作的代码
唯一Chat
2021/01/06
9900
webpack 学习笔记系列03-babel
babel 是 JavaScript 的编译器,可以将最新 ES 语法的代码轻松转换成任意版本的 JavaScript 代码,其实现原理是先使用 Babylon 解释器将 JavaScript 语法解析成 AST,然后通过遍历处理这颗树实现代码转换。在 babel 中可以通过配置 browserslist 来针对不同的浏览器组合,生成不同的适配代码。
CS逍遥剑仙
2021/01/01
1.7K0
针对 webpack + es6 + react 安装使用及其遇到的问题!
使用node npm进行安装,首先,我先附上webpack.config.js的代码,再进一步使用:
White feathe
2021/12/08
3260
针对 webpack + es6 + react 安装使用及其遇到的问题!
webpack + react + ts + semiDesign +electron
yarn add -D webpack webpack-cli 或者npm install -D webpack webpack-cli
用户4793865
2023/01/12
2.2K0
webpack + react + ts + semiDesign +electron
前端成神之路-vue前端工程化
小结:推荐使用ES6模块化,因为AMD,CMD局限使用与浏览器端,而CommonJS在服务器端使用。 ES6模块化是浏览器端和服务器端通用的规范.
海仔
2021/03/20
8540
【Webpack】Webpack4.x 常用操作 | 案例 | 相关构建工具
当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要(依赖)的每个模块(modules),然后将所有这些模块打包成一个或多个 assets。
前端修罗场
2023/10/07
2930
【Webpack】Webpack4.x 常用操作 | 案例 | 相关构建工具
Vue 07.webpack
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
LittlePanger
2020/04/14
7910

相似问题

Grails域:如何访问父域数据?

211

Grails,如何在域类中访问当前?lang

21

grails - afterDelete()访问域属性

11

grails动态访问域对象

20

如何在GRAILS中访问src/java中的域类?

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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