useDebounce

对于input的值 我们设置一个state 来保存,但是不代表input的值一更改就执行相应的函数,比如fetchData,我们肯定是希望用户值输入完成之后,在执行fetch,不然用户100ms一变,不能100ms执行依次fetch。

scss 复制代码
//这里是input的onChange
 const [searchValue, setSearchValue] = useState("");
 // 只有300ms后用户不在操作了 才会去更新debounse的值
 const debouncedSearchValue = useDebounce(searchValue, 300);
 //这里你可以当成 使用axios  fetchData
 const { data: collections, loading: collectionsAreLoading } =
    useCollectionSearch(debouncedSearchValue);

不过不同的是 他这里是使用的Apollo client来获取数据的,所以debouncedSearchValue不变,Apollo client不会去发送一个新的请求的。 如果使用的查询方式没有这种控制的话,这种方式可能并不合适 或者 你需要自己使用useEffect来使用debouncedSearchValue做依赖 去执行fetchData apollo 默认是 cache-first 参数不变 不会向服务器重新查询的 直接拿缓存的数据 useDebounse

scss 复制代码
export default function useDebounce<T>(value: T, delay: number): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value)

  useEffect(() => {
    // Update debounced value after delay
    const handler = setTimeout(() => {
      setDebouncedValue(value)
    }, delay)

    // Cancel the timeout if value changes (also on delay change or unmount)
    // This is how we prevent debounced value from updating if value is changed ...
    // .. within the delay period. Timeout gets cleared and restarted.
    return () => {
      clearTimeout(handler)
    }
  }, [value, delay])

  return debouncedValue
}

apollo 的查询 在uniswap 文件自己看可以了 但是我看他的graphql 中有个thegraphql 这里的相关的types和hook是generated的, 不知道是用什么弄的 之后会查一下

这里拿chatgpt 生成了两个例子 一个是 axios 一个是react query这个与apollo一样可以设置查询依赖

用 Axios 重写

若要使用 Axios 替换 Apollo Client,你需要手动管理请求的发起,并利用 React 的 useEffect 钩子来侦听 debouncedSearchValue 的变化:

scss 复制代码
javascriptCopy code
import axios from 'axios';
import { useState, useEffect } from 'react';

function useCollectionSearchWithAxios(query: string) {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    if (query) {
      setLoading(true);
      axios.get(`/api/search_collections`, { params: { query } })
        .then(response => {
          setData(response.data); // 假设 API 直接返回所需格式
        })
        .catch(error => {
          console.error("Failed to fetch data:", error);
          setData([]);
        })
        .finally(() => {
          setLoading(false);
        });
    }
  }, [query]); // 侦听 query 变化

  return { data, loading };
}

使用 React Query 重写

React Query 提供了类似于 Apollo Client 的功能,但用于任何异步数据源,包括 REST API。与 Apollo 类似,React Query 也管理缓存和数据更新:

javascript 复制代码
javascriptCopy code
import { useQuery } from 'react-query';
import axios from 'axios';

function fetchCollections(query) {
  return axios.get(`/api/search_collections`, { params: { query } })
    .then(res => res.data);
}

function useCollectionSearchWithReactQuery(query) {
  const { data, isLoading, isError } = useQuery(['collections', query], () => fetchCollections(query), {
    enabled: !!query // 只有当 query 非空时才执行查询
  });

  return {
    data: data || [],
    loading: isLoading,
    error: isError
  };
}

在这里,useQuery 的第一个参数是查询的键(在这种情况下是一个数组,包括固定的 'collections' 和变量 query),这有助于 React Query 识别和管理缓存。enabled 选项用于控制是否执行查询,我们将其设为只有当 query 非空时为真,类似于前面例子中的 skip 逻辑。

总结

每种方法都有其适用场景:

  • Apollo Client 最适合 GraphQL 数据获取。
  • Axios 配合 useEffect 是一个通用的解决方案,适用于任何 REST API 调用。
  • React Query 提供了类似 Apollo 的数据同步和缓存机制,适用于更广泛的数据获取需求,包括 REST API。
相关推荐
叫我:松哥2 分钟前
基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask
前端·python·随机森林·机器学习·数据分析·flask·bootstrap
让开,我要吃人了4 分钟前
HarmonyOS鸿蒙开发实战(5.0)网格元素拖动交换案例实践
前端·华为·程序员·移动开发·harmonyos·鸿蒙·鸿蒙开发
谢尔登13 分钟前
Webpack 和 Vite 的区别
前端·webpack·node.js
谢尔登13 分钟前
【Webpack】Tree Shaking
前端·webpack·node.js
过期的H2O229 分钟前
【H2O2|全栈】关于CSS(4)CSS基础(四)
前端·css
纳尼亚awsl43 分钟前
无限滚动组件封装(vue+vant)
前端·javascript·vue.js
八了个戒1 小时前
【TypeScript入坑】TypeScript 的复杂类型「Interface 接口、class类、Enum枚举、Generics泛型、类型断言」
开发语言·前端·javascript·面试·typescript
西瓜本瓜@1 小时前
React + React Image支持图像的各种转换,如圆形、模糊等效果吗?
前端·react.js·前端框架
黄毛火烧雪下1 小时前
React 的 useEffect 钩子,执行一些异步操作来加载基本信息
前端·chrome·react.js
蓝莓味柯基1 小时前
React——点击事件函数调用问题
前端·javascript·react.js