当前位置: 首页 > news >正文

【Vue】Vue项目需求--实现搜索框输入防抖处理

🦖欢迎观阅本本篇文章,我是Sam9029

文章目录

  • ⭐前言
    • 场景需求
    • 具体思路
  • 🐉源码 (Vue-组合式API)
    • 🐸源码解读
  • 📕效果演示
  • 拓展说明
  • 🦖欢迎查阅Sam9029 的其他文章


⭐前言

在Vue开发中,遇到了搜索框输入防抖处理,算是防抖的使用场景之一吧,抽象其逻辑记录下来以备后用

场景需求

作为开发人员,一定要先搞清楚场景需求是什么

  • 场景需求:
    • 搜索输入时 ,判断用户在输入完成后 实现即时的自动搜索
    • 并且要防止过度自动搜索消耗性能

想想如何才能在vue中实现

(一开始想着往标签上绑定函数事件,在事件本体里面实现防抖,并不能实现,真正解决思路如下)

具体思路

如下:

思路: 使用 watch + v-model

  • v-model 实现数据输入的同步更新(数据想想绑定)
  • watch 监听输入变化,使用防抖函数实现后续操作

🐉源码 (Vue-组合式API)


<template>
    <div class="searchCont">
      
    <!--    搜索input    -->
    <input type="text" placeholder="Search" v-model="keyword" />
    <!-- 展示v-model数据双向绑定      -->
    <div>
      <label for="">v-model测试:</label>{{keyword}}
    </div>
    </div>
</template>

<script setup>
import { getCurrentInstance, watch, ref } from "vue";
  
// 搜索数据的 防抖 处理
// v-model 加上 watch 监听
let keyword = ref()

// // 给搜索事件 绑定 防抖
// 因为 ⭐❗⭐❗防抖函数定义 返回的是一个回调函数, 我们可以用一个变量来接收
const searchInput = debounce(searchEvent,1000)

// 使用watch 监听变化
watch(keyword,()=>{
  searchInput()
  //注意,你可能会觉得 这样写可以,但是不可以,不可以,不可以
  // (debounce(searchEvent,1000))()
  // 因为这样做,你是在重复创建新的 防抖函数,所以会(一次改变就执行一次)不断执行
  //而放在变量里面就不是这样,每次调用变量执行相同地址的函数,及同一个防抖函数,
})

//搜索事件
function searchEvent(){
  console.log('执行搜索')
}
  

// //     防抖函数
function debounce(foo,delay){
  let timer;
  return function(){
      if(timer) clearTimeout(timer);
      timer = setTimeout(()=>{
          // 暂时理解不了(this,arguments)指向改变的问题
          foo.call(this,arguments)
          // 不输入延迟 则默认 1000 ms
      },delay || 1000)
  }
}

</script>


  • 需要选项式API 的源码请查看 选项式API实现-Vue项目需求–实现搜索框输入防抖处理

🐸源码解读

  • 仔细阅读源码后,你会发现有这几个对象
  • keyword 执行数据双向绑定,同步获取搜索框的值
  • watch监听的keyword事件
  • searchEvent 搜索事件(即需要被绑定防抖的搜索执行事件)
  • searchInput 接收 防抖的回调函数 变量 (使得之后每次调用都是同一个本执行防抖绑定的搜索事件)
  • debounce 防抖函数
  • 需要注意的地方–使用变量来接收 防抖函数 返回的回调函数
    • 入此处不理解–请看【JS-工具类】防抖与节流—在定义时返回的是回调函数–sam9029
    • 以及 防抖函数源码
    • /⭐❗⭐❗防抖函数定义 返回的是一个回调函数, 我们可以用一个变量来接收
// // 给搜索事件 绑定 防抖
const searchInput = debounce(searchEvent,1000)
  • 另一个需要注意的地方-使用watch监听的时候 调用 绑定了防抖的搜索事件

    • 注意,以下 这样写❗不可以,❗不可以,不可以,不可以
// 使用watch 监听变化
const searchInput = debounce(searchEvent,1000)
watch(keyword,()=>{
  //正确写法,调用 接收 绑定防抖的事件的 变量
  //searchInput() 
  //错误写法
  (debounce(searchEvent,1000))()
})
  • (debounce(searchEvent,1000))()
  • 因为这样做,你是在重复创建新的 防抖函数,所以会(一次改变就执行一次)不断执行
  • 而放在变量里面就不是这样,每次调用变量执行相同地址的函数,及同一个防抖函数,

📕效果演示

  • 额,gif图搞不起,先上CodePen.io 在线演示效果 (demo)

选项式API实现-Vue项目需求–实现搜索框输入防抖处理
组合式API实现-Vue项目需求–实现搜索框输入防抖处理-组合式API

拓展说明

  • 关于防抖函数的更多内容 详情请看 我写的这一篇文章【JS-工具类】防抖与节流—在定义时返回的是回调函数–sam9029
    • 文章中还指出了 防抖函数 使用时 需要特别注意的地方(回调函数的调用方式)

参考:

js防抖的一些疑问解答:为什么addEventListener调用防抖可以,onClick不行
【JS-工具类】防抖与节流—在定义时返回的是回调函数–sam9029

**🐱‍🐉🐱‍🐉文章若有错误,敬请指正🙏**

🦖欢迎查阅Sam9029 的其他文章

🐸【Vue3-响应式工具API】ref 和 reactive 使用_Sam9029的博客-CSDN博客

🐸(Aixos的引入与基本使用_Sam9029的博客-CSDN博客

🐸【JS-工具类】懒加载的实现 – 两种方式 — 一种5行JS实现懒加载_Sam9029的博客-CSDN博客

**🐱‍🐉🐱‍🐉恭喜你,都看到这了,求赞,求收藏,求评论不过分吧**

相关文章:

  • 03Python数据类型
  • CSS常见选择器
  • React-函数组件的特性与闭包
  • MySQL的EXPLAIN执行计划深入分析
  • 【MySQL基础篇】MySQL数据库安装教程
  • 记某同事的两次误操作导致Linux瘫痪
  • 初识OpenGL (-)纹理过滤(Texture Filtering)
  • ATF官方文档翻译(二):Authentication Framework Chain of Trust(身份验证框架和信任链)(3)
  • wsl安装gpu版mindspore(二)
  • 输出总结是成长的开始
  • [RK3568 Android11] Binder通信整体框架
  • 【uiautomation】获取微信好友名单,可指定标签 全部
  • VAPS XT开发入门教程07:表元素(TableElements)介绍
  • 一文带你了解电感的5大损耗
  • C语言for循环必备练习题
  • 自己简单写的 事件订阅机制
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2017前端实习生面试总结
  • Angular 4.x 动态创建组件
  • ES6系列(二)变量的解构赋值
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • javascript从右向左截取指定位数字符的3种方法
  • javascript面向对象之创建对象
  • Java基本数据类型之Number
  • js中forEach回调同异步问题
  • Laravel 菜鸟晋级之路
  • leetcode46 Permutation 排列组合
  • oldjun 检测网站的经验
  • Python连接Oracle
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何在GitHub上创建个人博客
  • 入手阿里云新服务器的部署NODE
  • 再次简单明了总结flex布局,一看就懂...
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 浅谈sql中的in与not in,exists与not exists的区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (笔试题)分解质因式
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (五)关系数据库标准语言SQL
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ***监测系统的构建(chkrootkit )
  • ***利用Ms05002溢出找“肉鸡
  • .bashrc在哪里,alias妙用
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net IOC框架入门之一 Unity
  • .NET开发者必备的11款免费工具
  • .so文件(linux系统)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法