【VUE】在watch中调用防抖函数

使用场景

表单中的某元素在用户输入时需要监听输入内容,由于用户在输入过程中无需时刻调用,这里采用防抖动函数。代码:

1.封装防抖函数

/**
* 防抖
* @param {Function} fn
* @param {Number} delay
*/

export const debounceFn = (fn, delay) => {
  let timer = null
  delay = delay || 500
  return (...args) => {
    const vm = this
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(vm, args)
    }, delay)
  }
}

2.watch中调用防抖函数

<template>
	<div>
        <el-form label-position="left" label-width="60px">
            <el-form-item label="考生a:" prop="sum">
               <el-input v-model="form1.sum" placeholder="请打分"></el-input>
            </el-form-item>
        </el-form>
  </div>
</template>
<script>
import { debounceFn  } from '@/utils/index';
export default {
	data() {
		form1: {
			sum: ''
		},
		isSubmit: false
	},
	watch: {
	    form1: {
	      handler (val, old) {
	        this.check(this, val)
	      },
	      deep: true
	    }
  	},
	methods: {
		// 将防抖函数写入方法中可以在Watch中随时调用
		// debounceFn传入函数内部this的指向不是当前vue实例,我这里采用的是调用的时候讲this传入
		check: debounceFn  ((vm, val) => {
	      if (val.sum) {
	        vm.isSubmit = true
	      }
	    }, 500)
	}
}
</script>

总结

防抖动函数实际是一个闭包,return出来的function内部有一个setTimeout,初次调用debounce会得到防抖动函数,这里主要说下与vue框架中watch一起使用,debounce不能写在watch函数内部,仔细观察debounce可以发现防抖的关键是定时器的使用和清除,上诉例子中timeout记录当前作用域中是否存在定时器。

<think>好的,用户想了解Vue.jswatch的实际应用场景和示例代码。首先,我需要回忆一下Vue.jswatch机制。watch用于观察和响应数据的变化,当需要在数据变化时执行异步或开销较大的操作时特别有用。 首先,我应该考虑常见的应用场景。比如表单验证,当用户输入时,实时校验数据是否合法。另一个场景是搜索建议,当用户输入关键词时,延迟发送API请求。还有路由参数变化时重新加载数据,或者监控对象或数组的深层变化。 接下来,每个场景都需要对应的示例代码。例如,表单验证可以监听输入框的值,当变化时进行校验,并设置错误信息。这时候需要使用watch来监听对应的data属性。要注意防抖处理,避免频繁触发函数,比如使用setTimeout。 然后,搜索建议的场景可能需要监听搜索关键词的变化,并在用户停止输入一段时间后自动搜索。这时候可以用watch配合防抖函数,比如lodash的debounce,或者在handler中使用setTimeout来延迟执行搜索操作。 对于路由参数变化的情况,比如从/user/1跳转到/user/2,组件可能不会重新创建,这时需要在watch中监控$route.params的变化,并重新获取数据。 深层监听对象属性时,需要设置deep: true,确保嵌套属性变化也能被捕获。例如,监控表单对象的深层变化,进行自动保存或验证。 还要考虑不同的配置选项,比如immediate: true,可以让watch在初始时就执行一次回调函数,适用于需要初始化数据的场景。 另外,需要确保示例代码的正确性,比如使用Vue的语法,正确设置watch的handler,以及选项参数。同时,代码格式要正确,使用反引号包裹,并标明语言类型。 最后,用户可能想知道watch和computed的区别,这时候可以简要说明:computed用于依赖缓存,适合基于其他数据计算新值;watch适合在数据变化时执行异步操作或复杂逻辑。 可能还需要检查是否有相关的引用资料可以支持回答,比如参考站内引用中的插件使用或路由配置,但当前问题主要关注watch,可能引用较少。不过现有的引用中有关于v-model和router的示例,可以适当关联。 总结下来,回答的结构应该是先介绍watch的作用,再分场景给出示例代码和解析,最后总结应用场景和注意事项。确保每个示例都有实际的代码片段,并解释其应用场景和关键点。</think>### Vue.jswatch的实际应用场景与示例解析 #### 1. 表单输入实时验证 当用户输入时,通过`watch`监听输入值变化并执行验证逻辑: ```javascript new Vue({ data() { return { username: '', errorMsg: '' } }, watch: { username(newVal) { if (newVal.length < 6) { this.errorMsg = '用户名需至少6个字符'; } else { this.errorMsg = ''; } } } }) ``` **关键点**:通过`watch`实现输入验证的即时反馈,适用于注册/登录场景[^3]。 --- #### 2. 搜索建议防抖处理 监听搜索关键词变化,延迟500ms触发搜索: ```javascript import _ from 'lodash'; new Vue({ data: { searchText: '' }, watch: { searchText: _.debounce(function(newVal) { this.fetchSuggestions(newVal); }, 500) }, methods: { fetchSuggestions(query) { // 调用API获取搜索建议 } } }) ``` **关键点**:使用`debounce`避免高频API请求,提升性能[^1]。 --- #### 3. 路由参数变化监听 当路由参数变化时重新加载数据: ```javascript export default { watch: { '$route.params.id'(newId) { this.loadUserDetail(newId); } }, methods: { loadUserDetail(id) { // 根据新ID获取数据 } } } ``` **关键点**:适用于动态路由场景(如用户详情页跳转)[^2]。 --- #### 4. 复杂对象深度监听 监控表单对象所有字段变化: ```javascript new Vue({ data: { formData: { name: '', address: { city: '', street: '' } } }, watch: { formData: { handler(newVal) { this.autoSaveForm(); }, deep: true // 深度监听 } } }) ``` **关键点**:`deep: true`可监听嵌套对象变化,适用于复杂表单自动保存。 --- #### 5. 组件初始化数据加载 ```javascript export default { props: ['userId'], watch: { userId: { immediate: true, // 立即执行 handler(newVal) { this.loadData(newVal); } } } } ``` **关键点**:`immediate: true`使回调在观察开始时立即执行,适用于组件挂载时加载数据。 --- ### 应用场景总结 | 场景 | 技术方案 | 典型应用 | |---------------------|----------------------------|-------------------------| | 用户输入响应 | 基本watch监听 | 表单验证、实时搜索 | | 异步操作控制 | watch + 防抖/节流 | 搜索建议、API调用 | | 动态路由处理 | 监听$route对象 | 详情页参数变化更新 | | 复杂数据监控 | deep监听 + 对象监控 | 表单自动保存、状态同步 | | 初始化操作 | immediate参数 | 组件挂载数据加载 | --- ### 注意事项 1. **与computed的区别**:计算属性适用于数据联动计算,watch更适合副作用操作 2. **内存管理**:深度监听复杂对象时注意内存消耗 3. **异步处理**:watch回调中可进行Promise操作,但需处理错误边界
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值