Lodash Debounce 和 Apollo Client 使用LazyQuery 去抖动一次

Posted

技术标签:

【中文标题】Lodash Debounce 和 Apollo Client 使用LazyQuery 去抖动一次【英文标题】:Lodash Debounce and Apollo Client useLazyQuery debounces once 【发布时间】:2021-11-27 14:49:57 【问题描述】:

当尝试使用 _.debounce(fn, wait); 调用 apollo 客户端 useLazyQuery(...) 时,它会第一次对查询进行去抖动,然后调用查询函数,但之后它会在每次更改时继续调用查询,而不会进行任何去抖动。

但是,如果我使用 console.log(...) 而不是 useLazyQuery(...) 调用,它将完美运行。

第一次工作,然后立即调用该函数而没有任何反跳:

const [value, setValue] = useState('');

const [search,  loading, data ] = useLazyQuery(SEARCH_QUERY,  variables:  searchString: value  );

const debouncer = React.useCallback(_.debounce(search, 1500), []);

...
<call to debouncer() with onChange event>

每次都能完美运行:

const [value, setValue] = useState('');

const [search,  loading, data ] = useLazyQuery(SEARCH_QUERY,  variables:  searchString: value  );

const debouncer = React.useCallback(_.debounce(val => (console.log(val)), 1500), []);

...
<call to debouncer() with onChange event>

【问题讨论】:

【参考方案1】:

对于这个问题,你甚至不需要状态;简化版:

import  useCallback  from 'react';
import  useLazyQuery  from '@apollo/client';
import _ from 'lodash';

function App() 
    const [search,  loading, data ] = useLazyQuery(SEARCH_QUERY);

    const debouncer = useCallback(_.debounce(search, 1000), []);

    return (
        <input
            type='text'
            onChange=e => debouncer( variables:  code: e.target.value  )
        />
    );


【讨论】:

以上是关于Lodash Debounce 和 Apollo Client 使用LazyQuery 去抖动一次的主要内容,如果未能解决你的问题,请参考以下文章

lodash源码学习debounce,throttle

lodash入门,使用 。throttle和debounce

Lodash _.debounce 具有用于独特参数变体的单独队列

React 类组件及函数组件结合Lodash debounce需要注意的问题和一种解决方法

使用 lodash.debounce 延迟测试组件失败

lodash 的 防抖(debounce)和节流(throttle)