react 使用lodash做防抖与节流

监听边输入边搜索:@input
敲回车搜索 @keyup.enter.native=""
点击按钮搜索 @click

搜索性能优化:主要利用防抖和节流

防抖和节流:主要目的是为了降低高频事件触发,减少dom操作或请求次数,提升性能

通常高频事件:onscroll,onresize,keyup/keydown,mousemove

防抖:在固定时间内,如果有事件触发,则会再延长固定时间,直到固定时间内没有触发事件再做处理 例如:电梯和屏保、上传过文件前端做假存储提示上传成功
反复触发执行最后一次

节流:指定一个固定时间,无论是事件触发与,只要到了固定时间,都会触发

第三方函数工具库:lodash
安装: npm i lodash
引入:import _ from ‘lodash’

我这里实在react中使用的,配合hooks,使用react第5天,之前一直用vue5年,新项目选型react,因为是外企项目,再有业务逻辑相对复杂,用vue3.0,不如用react了,Hooks更简单。

业务批量上传文件,前端先做存储并显示在页面上文件名,做上传成功与失败或错误的提示;

因为需要遍历数组所以会触发多个提示,这里只需要提示一次,方案采用防抖

数据结构如下:

  const dataList: any = [
    {
      title: '读取数据',
      buttonText: '批量上传',
      id: 0,
      list: [
        {
          id: 0,
          title: '000 Version表(至少包含之后24个月数据)',
          surface: '',
        },
        {
          id: 2,
          title: '实际销量表(本财年初至下个财年)',
          surface: '',
        },
        {
          id: 3,
          title: '入库记录表(本财年初至今的数据)',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 4,
          title: 'Rolling Forecast(本财年和下个财年)',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 5,
          title: '当前财年Allocation表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 6,
          title: '下个财年Allocation表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 7,
          title: '当前财年财务Demand数据表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 8,
          title: '下个财年财务Demand数据表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 9,
          title: '上个财年底库存结余数据表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
        {
          id: 10,
          title: '上月底库存结余数据表',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
      ],
    },
    {
      title: '待写入文件',
      buttonText: '开始计算',
      id: 1,
      list: [
        {
          id: 0,
          title: 'BO Projection',
          surface: '', // 0 可以上传 1表示成功无需再上传
        },
      ],
    },
    {
      title: '输入结果',
      buttonText: '一键下载',
      id: 2,
      list: [
        {
          id: 0,
          title: '"正常情况下"输入结果',
          situationList: [
            {
              id: 0,
              title: '中间过程表',
              surface: '正常情况下的中间过程表.xlsx',
            },
            {
              id: 1,
              title: 'BO Projection',
              surface: '正常情况下的BO Projection.xlsx',
            },
          ],
        },
        {
          id: 1,
          title: '"非正常情况下"输入结果',
          situationList: [
            {
              id: 0,
              title: '中间过程表',
              surface: '非正常情况下的中间过程表.xlsx',
            },
            {
              id: 1,
              title: 'BO Projection',
              surface: '非正常情况下的BO Projection.xlsx',
            },
          ],
        },
      ],
    },
  ];
  const [dataFormList, setDataFormList] = useState(dataList);

只要逻辑代码。

  const [didInit, setDidInit] = useState<boolean>(false);
  // 批量 upload的CustomerUpload方法;dataFormList在upload的beforeUpload方法中赋值的这做展示
  const onBatchCustomerUpload = () => {
    if (!listFileData || !dataFormList) return false;
    if (didInit) return false; //执行一次
    setDidInit(true);
    // 回显页面
    dataFormList.map((item) => {
      if (!item.list) return false;
      item.list.map((i) => {
        listFileData.map((j) => {
          if (
            (i.title.toLowerCase().includes(j.split('-')[0].toLowerCase()) ||
              i.title.toLowerCase().includes(j.split('.')[0].toLowerCase())) &&
            item.id == 0
          ) {
            i.surface = j;
            getSuggestion('批量上传成功', true);
          } else if (
            i.title.toLowerCase().includes(j.split('-')[0].toLowerCase()) ||
            i.title.toLowerCase().includes(j.split('.')[0].toLowerCase())
          ) {
            getSuggestion('部分上传成功,请上传相对应表', false);
          }
        });
      });
    });
    setDataFormList(dataFormList); // 重新赋值dataFormList
    setTimeout(() => {
      setDidInit(false);
      listFileData = [];
    }, 300);
  };

防抖  useCallback作用防止debounce失效

useCallback的作用也显而易见,咱们用通俗的话来说就是缓存了这个函数,避免被重复创建

在遇到类似场景,React中使用防抖并且失效的时候,可以用useCallback来包装

// 防抖  反复触发执行最后一次 //使用useCallback防止debounce失效
  const debounce = _.debounce;
  const getSuggestion = useCallback(
    debounce((val: string, type: boolean) => {
      type ? message.success(val) : message.warning(val);
    }, 300),
    [],
  );

 节流

  const throttle = _.throttle;
  const getSuggestion = 
    throttle((val: string, type: boolean) => {
      type ? message.success(val) : message.warning(val);
    }, 300);

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React应用开发中,可以通过使用React Hook机制来更方便地实现功能。函数(Debounce)可以用于在用户输入时延迟执行某个操作,以避免频繁触发操作。通过设置一个定时器,在指定的时间内没有再次触发操作时,才执行相应的逻辑。函数可以用于限制某个操作的执行频率,无论用户多快地触发操作,操作的逻辑都会按照设置的间隔时间执行。在React使用函数可以通过设置定时器,在指定的时间间隔内只执行一次操作。 对于非受控组件,上述方式比较适用。如果需要在受控组件中实现功能,可以采用React Hooks机制。通过useState Hook来定义一个state变量来存储输入框的值,然后通过useEffect Hook来监听该state变量的变化。当输入框的值发生变化时,可以通过设置一个定时器来延迟执行异步请求操作。在这种情况下,可以将功能结合起来使用,以达到更好的用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一文搞懂如何在 React使用 (Debounce)和 (Throttle)](https://blog.csdn.net/weixin_53312997/article/details/129248753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jim-zf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值