【React hooks】useDebounce的封装

这篇具有很好参考价值的文章主要介绍了【React hooks】useDebounce的封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

// 闭包保留了timeout的状态
const debounce = (fn, delay) => {
  let timeout
  return (...param) => {
    if (timeout) {
      clearTimeout(timeout)
    }
    // 返回的函数里用到了外部的变量,保存了该变量的状态
    timeout = setTimeout(() => {
      fn(...param)
    }, delay)
  }
}

自定义钩子 useDebounce

  • 返回一个debounceValue,这个值会在delay后改变,这样用到它的地方的依赖,也会有这样的效果
  • param变了,debouncedParam 不会立即改变,这样就达到了防抖的效果
  • useEffect里的函数每次执行之前,都会清除掉上一次的effect,即执行上一次effect里return的函数
// 返回一个debounceValue,这个值会在delay后改变,这样用到它的地方的依赖,也会有这样的效果
export const useDebounce = (value, delay) => {
  const [debounceValue, setDebounceValue] = useState(value)

  useEffect(() => {
    const timeout = setTimeout(() => setDebounceValue(value), delay)
    return () => {
      clearTimeout(timeout)
    }
  }, [value, delay])

  return debounceValue
}

// 组件里使用:
// param变了,debouncedParam 不会立即改变,这样就达到了防抖的效果
 const [param, setParam] = useState({
    name: '',
    personId: ''
  })
  const debouncedParam = useDebounce(param,1000)
  useEffect(() => {
    fetch(`${apiUrl}/projects?${qs.stringify(cleanObject(debouncedParam))}`).then(async (res) => {
      if (res.ok) {
        setList(await res.json())
      }
    })
  }, [debouncedParam])

具体实践

注:使用ahooks来完成,props传入Onchange是回调函数文章来源地址https://www.toymoban.com/news/detail-603503.html

import { Select, Spin, Empty, Alert } from "antd";
import { useDebounce } from "ahooks";
import React, { useState, useEffect,  } from "react";
const notFound = (fetch) => {
  switch (fetch) {
    case -1:
      return null;
    case 0:
      return <Spin size="small" />;
    case 1:
      return <Empty />;
    default:
      return <Alert type="error" message={fetch} banner />;
  }
};
function DebounceSelect({
                          fetchOptions,
                          debounceTimeout = 800,
                          onChange,
                          ...props
                        }) {
  const [fetching, setFetching] = useState(-1); //-1未请求 0 请求中 1 请求结束
  const [options, setOptions] = useState([]);
  const [prevSearchValue, setPrevSearchValue] = useState();
  const [searchValue, setSearchValue] = useState();
  const debouncesearchValue = useDebounce(searchValue, { wait: 1000 });

  useEffect(() => {
    if (debouncesearchValue) {
      if (debouncesearchValue.length < 5) {
        setFetching("请输入不少于5个字的关键词");
        setOptions([]);
        return;
      }
      if (prevSearchValue !== debouncesearchValue) {
        getOptions(debouncesearchValue);
      }
    }
  }, [debouncesearchValue]);

  const getOptions = (value) => {
    setPrevSearchValue(value);
    setOptions([]);
    setFetching(0);
    fetchOptions(value).then((newOptions) => {
      setFetching(1);
      setOptions(newOptions);
    });
  };

  const triggerChange = (v) => {
    const obj = options.find((o) => o.value === v);
    onChange(obj);
    setSearchValue(v);
  };
  const onSearch = (v) => {
    setSearchValue(v);
  };

  const onFocus = () => {
    if (!props.value) {
      setFetching("请输入不少于5个字的关键词");
      setOptions([]);
    } else {
      setFetching(-1);
    }

    setSearchValue(props.value);
  };

  return (
      <Select
          searchValue={searchValue}
          filterOption={false}
          onSearch={onSearch}
          notFoundContent={notFound(fetching)}
          {...props}
          onChange={triggerChange}
          options={options}
          onFocus={onFocus}
      />
  );
}
export default DebounceSelect;

到了这里,关于【React hooks】useDebounce的封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端知识】React 基础巩固(四十二)——React Hooks的介绍

    Hook 是 React 16.8 的新增特性,它可以让我们在不编写class的情况下使用state以及其他的React特性(比如生命周期)。 class组件 VS 函数式组件: class的优势: class组件可以定义自己的state,用来保存组件自己内部的状态;而函数式组件不可以,因为函数每次调用都会产生新的临时

    2024年02月14日
    浏览(64)
  • 【前端知识】React 基础巩固(四十三)——Effect Hook

    Effect Hook 用来完成一些类似class中生命周期的功能。 在使用类组件时,不管是渲染、网路请求还是操作DOM,其逻辑和代码是杂糅在一起的。例如我们希望把计数器结果显示在标签上,在类组件中,我们通过生命周期进行实现,如下所示: 在函数组件中,我们可以利用useEffec

    2024年02月14日
    浏览(71)
  • 前端react入门day04-useEffect与Hook函数

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 useEffect 的使用 useEffect 的概念理解 useEffect 依赖项参数说明 useEffect — 清除副作用 自定义Hook实现 React Hooks使用规则 useEffect是一个React Hook函数,用于在React组件中 创建不

    2024年01月22日
    浏览(56)
  • 前端开发笔记 | React Hooks子组件和父组件交互

    前端开发框架目前比较常用的就是react、vue等,其中使用React Hooks 带来了不少的好处,今天来聊聊React Hooks开发方式下,子组件和父组件的交互。 子组件定义 父组件调用子组件 父组件定义 子组件中刷新父组件按钮文案 实际效果:点击子组件中“改变父组件按钮”,父组件中

    2024年02月11日
    浏览(83)
  • 【前端知识】React 基础巩固(四十六)——自定义Hook的应用

    自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上而言,它并不算React的特性。 实现组件创建/销毁时打印日志 实现Context共享 封装 TokenContext 和 UserContext 两个Context在自定义Hook useUserToken 中,通过使用 userUserToken 同时获取两个Context的内容: 实现获取滚动位置 封装滚

    2024年02月14日
    浏览(47)
  • 【前端知识】React 基础巩固(四十四)——其他Hooks(useContext、useReducer、useCallback)

    在类组件开发时,我们通过 类名.contextType = MyContext 的方式,在类中获取context,多个Context或者在函数式组件中通过 MyContext.Consumer 方式共享context: 可以看到,当我们需要使用多个Context时,存在大量繁琐的嵌套代码;而Context Hook能够让我们通过Hook直接获取某个Context的值,如

    2024年02月14日
    浏览(47)
  • ahooks.js:一款强大的React Hooks库及其API使用教程(一)

    ahooks是一款由阿里巴巴开发团队设计的React Hooks库,提供了一系列实用的React Hooks,以便开发者更好地使用React的功能。ahooks的设计原则是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同时保留最大的使用自由度。 使用npm或yarn安装ahooks: 1. useRequest useR

    2024年02月12日
    浏览(33)
  • ahooks.js:一款强大的React Hooks库及其API使用教程(四)

    ahooks是一款由阿里巴巴开发团队设计的React Hooks库,提供了一系列实用的React Hooks,以便开发者更好地使用React的功能。ahooks的设计原则是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同时保留最大的使用自由度。 使用npm或yarn安装ahooks: API介绍合集:

    2024年02月11日
    浏览(36)
  • ahooks.js:一款强大的React Hooks库及其API使用教程(二)

    ahooks是一款由阿里巴巴开发团队设计的React Hooks库,提供了一系列实用的React Hooks,以便开发者更好地使用React的功能。ahooks的设计原则是“最小API,最大自由”,旨在提供最小的、最易于理解和使用的API,同时保留最大的使用自由度。 使用npm或yarn安装ahooks: 前面的API:aho

    2024年02月12日
    浏览(31)
  • 前端基本功 用 React Hooks + Antd 实现一个 Todo-List

    To-do list(待办事项列表)是用来记录和管理要完成的任务、活动或项目的列表。它是一种简单而常见的工具,用于帮助人们组织和安排日常生活中的任务。每当您有一项任务需要完成或者要记住某些事情时,您可以将它添加到待办事项列表中。 学习前端的一些新知识时,经

    2024年02月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包