码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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>
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 需要选项式API 的源码请查看 选项式API实现-Vue项目需求–实现搜索框输入防抖处理

    🐸源码解读

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

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

    📕效果演示

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

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

    拓展说明

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

    参考:

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

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

    🦖欢迎查阅Sam9029 的其他文章

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

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

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

    **🐱‍🐉🐱‍🐉恭喜你,都看到这了,求赞,求收藏,求评论不过分吧**
    
    • 1
  • 相关阅读:
    FCKeditor编辑器漏洞
    HoG(梯度直方图)原理及python实现
    Linux 网络操作命令FTP
    qcow2等格式镜像磁盘冷访问
    目标检测、工业缺陷、图像分割----深度学习数据集归纳
    常见的自动微分工具箱
    Mac,Windows11,Windows10局域网互传共享文件
    React + Antd 自定义Select选择框 全选、清空功能
    【Axure高保真原型】输入宽高控制图片尺寸
    3 万亿美元,苹果问鼎全球市值最高公司宝座
  • 原文地址:https://blog.csdn.net/m0_61486963/article/details/126824887
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号