当前位置:首页 > VUE

vue实现延时触发watch

2026-02-21 22:57:39VUE

Vue 实现延时触发 watch 的方法

在 Vue 中,可以通过 watch 监听数据变化,但有时需要延时触发回调以避免频繁执行。以下是几种实现方式:

使用 lodash 的 debounce 方法

安装 lodash:

vue实现延时触发watch

npm install lodash

在组件中使用:

vue实现延时触发watch

import { debounce } from 'lodash';

export default {
  data() {
    return {
      searchQuery: ''
    };
  },
  watch: {
    searchQuery: debounce(function(newVal) {
      this.fetchData(newVal);
    }, 500) // 500 毫秒延时
  },
  methods: {
    fetchData(query) {
      // 执行数据获取逻辑
    }
  }
};

使用 setTimeout 手动实现延时

export default {
  data() {
    return {
      searchQuery: '',
      timeout: null
    };
  },
  watch: {
    searchQuery(newVal) {
      clearTimeout(this.timeout);
      this.timeout = setTimeout(() => {
        this.fetchData(newVal);
      }, 500);
    }
  },
  methods: {
    fetchData(query) {
      // 执行数据获取逻辑
    }
  }
};

使用 Vue 的 immediate 和 handler 选项

如果需要立即监听并在延时后执行,可以结合 immediatehandler

export default {
  data() {
    return {
      searchQuery: '',
      timeout: null
    };
  },
  watch: {
    searchQuery: {
      immediate: true,
      handler(newVal) {
        clearTimeout(this.timeout);
        this.timeout = setTimeout(() => {
          this.fetchData(newVal);
        }, 500);
      }
    }
  },
  methods: {
    fetchData(query) {
      // 执行数据获取逻辑
    }
  }
};

使用自定义指令实现延时

如果需要更灵活的延时触发,可以创建一个自定义指令:

Vue.directive('debounce', {
  inserted(el, binding) {
    let timeout;
    el.addEventListener('input', () => {
      clearTimeout(timeout);
      timeout = setTimeout(() => {
        binding.value();
      }, 500);
    });
  }
});

// 使用方式
<input v-model="searchQuery" v-debounce="fetchData" />

注意事项

  • 使用 debouncesetTimeout 时,务必在组件销毁前清除定时器,避免内存泄漏。
  • beforeDestroy 生命周期中清除定时器:
beforeDestroy() {
  clearTimeout(this.timeout);
}

以上方法可以根据具体需求选择,灵活实现延时触发 watch 的功能。

标签: vuewatch
分享给朋友:

相关文章

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue实现多选

vue实现多选

Vue 实现多选功能 在 Vue 中实现多选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定到一个数组,可以实现多选功能。适用于复选框组(…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的position…