Vue3利用watchEffect监听实现防抖

简介: Vue3利用watchEffect监听实现防抖

首先在讲防抖之前先了解一下 watchEffect, 官方对watchEffect的解释是立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。


什么意思呢,意思在页面加载之后就立即执行一遍在watchEffect中的数据,如果写在watchEffect中的响应式数据发生改变则会在次触发watchEffect就像下面这样,刚进入页面就调用了一次


d01c66c6495941c29fd7e8cc622d4212.png

既然了解了watchEffect的执行条件,那么如何使用watchEffect实现防抖呢


那么就需要使用watchEffect的参数 onInvalidate


onInvalidate就是用来注册清理失效时的回调


我们首先在外部写一个函数 antiShake

const antiShake =(val:string,time:number) =>{
    return setTimeout(() => {
        console.log(`用户输入:${val}`)
    }, time);
}


然后我们在watchEffect中

watchEffect((onInvalidate)=>{
  const timer =antiShake(keyword.value,500)
  onInvalidate(()=>clearTimeout(timer))
  console.log('watchEffect',keyword.value)
})


运行

83a06ec34cef4c62a94b6f56411482f7.png


这样就实现了防抖的效果,


好啦,关于watchEffect就简单介绍到这里了 更多的功能可以查看官方文档


响应式计算和侦听 | Vue.js


完整代码

<script lang="ts" setup>
import {ref, watchEffect} from 'vue'
const antiShake =(val:string,time:number) =>{
    return setTimeout(() => {
        console.log(`用户输入:${val}`)
    }, time);
}
const keyword = ref<string>('')
watchEffect((onInvalidate)=>{
  const timer =antiShake(keyword.value,500)
  onInvalidate(()=>clearTimeout(timer))
  console.log('watchEffect',keyword.value)
})
</script>
<template>
<input v-model="keyword" />
</template>






相关文章
|
1天前
|
JavaScript API 开发者
Vue3自定义hooks
Vue3自定义hooks
6 0
|
1天前
|
JavaScript 编译器
Vue3之事件
Vue3之事件
4 0
|
1天前
|
JavaScript
Vue3之Props组件数据传递
Vue3之Props组件数据传递
6 0
|
2天前
|
JavaScript API
vue3组件注册
vue3组件注册
5 0
|
2天前
|
JavaScript API UED
Vue3中的Suspense组件有什么用?
Vue3中的Suspense组件有什么用?
17 6
|
2天前
|
JavaScript
VUE里的find与filter使用与区别
VUE里的find与filter使用与区别
24 0
|
2天前
|
JavaScript
vue页面加载时同时请求两个接口
vue页面加载时同时请求两个接口
|
2天前
|
JavaScript
vue里样式不起作用的方法,可以通过deep穿透的方式
vue里样式不起作用的方法,可以通过deep穿透的方式
14 0
|
2天前
|
移动开发 JavaScript 应用服务中间件
vue打包部署问题
Vue项目`vue.config.js`中,`publicPath`设定为&quot;/h5/party/pc/&quot;,在线环境基于打包后的`dist`目录,而非Linux的`/root`。Nginx代理配置位于`/usr/local/nginx/nginx-1.13.7/conf`,包含两个相关配置图。
vue打包部署问题
|
2天前
|
JavaScript 前端开发
iconfont 图标在vue里的使用
iconfont 图标在vue里的使用
18 0