VUE前端实现防抖节省 Lodash

打印 上一主题 下一主题

主题 808|帖子 808|积分 2424

方法一:采用Lodash工具库

Lodash 是一个同等性、模块化、高性能的 JavaScript 实用工具库。
(1)采用终端导入Lodash库

  1. $ npm i -g npm
  2. $ npm i --save lodash
复制代码
(2)应用

示例:搜刮框输入防抖

在这个示例中,我们盼望用户在输入框中停止输入 500 毫秒后才执行搜刮操作,克制频繁请求.
  1. <input type="text" id="search" placeholder="Search...">
  2. <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
  3. <script>
  4.   // 假设这是一个执行搜索操作的函数
  5.   function performSearch(query) {
  6.     console.log('Searching for:', query);
  7.     // 这里可以发送 ajax 请求进行搜索
  8.   }
  9.   // 使用 lodash 的 debounce 函数
  10.   const debouncedSearch = _.debounce(function(event) {
  11.     performSearch(event.target.value);
  12.   }, 500);  // 500ms 的防抖时间
  13.   // 监听输入框的输入事件
  14.   document.getElementById('search').addEventListener('input', debouncedSearch);
  15. </script>
复制代码
示例:滚动事故节省

在这个示例中,我们盼望当用户滚动页面时,每隔 1 秒才记录一次滚动事故,克制频繁触发回调函数。
  1. <div style="height: 2000px;">Scroll down to see the effect</div>
  2. <!-- 导入 throttle 函数-->
  3. <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
  4. <script>
  5.     // 这是一个处理滚动事件的函数
  6.     function handleScroll() {
  7.         console.log('Scroll event detected at:', new Date().toLocaleTimeString());
  8.     }
  9.     // 使用 lodash 的 throttle 函数,每隔 1 秒最多触发一次
  10.     const throttledScroll = _.throttle(handleScroll, 1000);
  11.     // 监听滚动事件
  12.     window.addEventListener('scroll', throttledScroll);
  13. </script>
复制代码


  • 解释




    • 当用户滚动页面时,throttledScroll 函数会在 1 秒内最多触发一次,克制滚动时回调函数被频繁调用。
    • 这优化了页面滚动的性能,特别是在回调函数较为复杂时。

示例:结合 leading 和 trailing 选项

假设我们盼望在用户第一次触发事故时立刻执行函数,并在停止触发 1 秒后再次执行。
  1. <input type="text" id="input-field" placeholder="Type something...">
  2. <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
  3. <script>
  4.     // 假设这是一个处理输入的函数
  5.     function handleInput(value) {
  6.         console.log('Input value processed:', value);
  7.     }
  8.     // 使用 debounce 函数,并配置 leading 和 trailing 选项
  9.     const debouncedInput = _.debounce(function(event) {
  10.         handleInput(event.target.value);
  11.     }, 1000, { leading: true, trailing: true });
  12.     // 监听输入框的输入事件
  13.     document.getElementById('input-field').addEventListener('input', debouncedInput);
  14. </script>
复制代码
方法二:自定义防抖、节省函数

(1)在utils文件夹下创建lodash.ts文件,里面定义防抖节省函数

  1. // 防抖函数
  2. export function debounce(fn: Function, delay: number) {
  3.   let timer: ReturnType<typeof setTimeout> | null = null;
  4.   return function (this: any, ...args: any[]) {
  5.     // 清除上一个定时器
  6.     if (timer) {
  7.       clearTimeout(timer);
  8.     }
  9.     // 设置新的定时器
  10.     timer = setTimeout(() => {
  11.       fn.apply(this, args); // 使用apply确保this和参数正确传递
  12.     }, delay);
  13.   };
  14. }
  15.   
  16. // 节流函数
  17. export function throttle(fn: Function, delay: number) {
  18.   let lastTime = 0;
  19.   return function (this: any, ...args: any[]) {
  20.     const now = Date.now();
  21.     // 如果距离上次执行时间已超过指定时间间隔,则执行函数
  22.     if (now - lastTime >= delay) {
  23.       lastTime = now;  // 更新上次执行时间
  24.       fn.apply(this, args);
  25.     }
  26.   };
  27. }
复制代码
(2)应用

防抖



  • 方式一:
  1. <template>
  2.   <div>
  3.     <input v-model="searchText" placeholder="输入搜索内容" />
  4.     <button @click="handleSubmit">提交</button>
  5.   </div>
  6. </template>
  7. <script lang="ts" setup>
  8. import { ref } from 'vue';
  9. import { debounce } from '@/utils/debounce';  // 引入自己写的防抖函数
  10. // 1. 声明响应式数据
  11. const searchText = ref<string>('');
  12. // 2. 防抖函数,延迟1000毫秒执行提交操作
  13. const submitForm = (val: string) => {
  14.   console.log('提交的搜索值:', val);
  15.   // 在这里执行提交操作
  16. };
  17. // 3. 使用防抖函数包装提交操作
  18. const handleSubmit = debounce(() => {
  19.   submitForm(searchText.value);  // 使用当前输入的值执行提交操作
  20. }, 1000); // 防抖延迟设置为1000毫秒
  21. </script>
复制代码


  • 方式二:
  1. <template>
  2.   <div>
  3.     <input v-model="searchText" placeholder="输入搜索内容" />
  4.     <button @click="submitForm(searchText)">提交</button>
  5.   </div>
  6. </template>
  7. <script lang="ts" setup>
  8. import { ref } from 'vue';
  9. import { debounce } from '@/utils/debounce';  // 引入自己写的防抖函数
  10. // 1. 声明响应式数据
  11. const searchText = ref<string>('');
  12. // 2. 定义提交表单操作
  13. const submitForm = debounce((val: string) => {
  14.   console.log('提交的搜索值:', val);
  15.   // 在这里执行提交操作
  16. }, 1000);  // 防抖延迟设置为1000毫秒
  17. </script>
复制代码
节省

  1. <template>
  2.   <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
  3.     <!-- 模拟内容,超出容器高度以启用滚动 -->
  4.     <div style="height: 1000px;">滚动内容</div>
  5.   </div>
  6. </template>
  7. <script lang="ts" setup>
  8. import { throttle } from './debounce';  // 引入节流函数
  9. // 1. 定义滚动事件处理函数(节流)
  10. const handleScroll = throttle(() => {
  11.   console.log('滚动事件触发');
  12.   // 在这里处理滚动事件,例如加载更多内容
  13. }, 200);  // 每200毫秒只执行一次
  14. </script>
复制代码
  1. <template>
  2.   <div @scroll="handleScroll" style="height: 300px; overflow-y: scroll;">
  3.     <!-- 模拟内容,超出容器高度以启用滚动 -->
  4.     <div style="height: 1000px;">滚动内容</div>
  5.   </div>
  6. </template>
  7. <script lang="ts" setup>
  8. import { throttle } from './debounce';  // 引入节流函数
  9. // 1. 定义滚动事件处理函数(节流)
  10. const handleScroll = throttle(() => {
  11.   console.log('滚动事件触发');
  12.   // 在这里处理滚动事件,例如加载更多内容
  13. }, 200);  // 每200毫秒只执行一次
  14. </script>
复制代码

应用场景

防抖 (debounce):

手抖了。。。多点了好频频,一定时间内只执行一次。(年龄大了手抖)


  • 功能:只有在用户停止触发事故一段时间后,才会执行回调函数。
  • 应用场景:输入框搜刮、窗口大小调整(resize)、表单提交等。
节省 (throttle):

好比点了两次下拉革新列表页面,他不会马上直接执行两次,是在你定义的一定时间间隔前提前,先执行第一次在执行第二次


  • 功能:在指定的时间间隔内,只执行一次函数。如果触发频繁,函数执行会被限制在每个时间间隔内最多执行一次。
  • 应用场景:滚动事故、鼠标移动事故、resize 事故等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表