Vue3中如何判断watch监听器函数是否为立即执行?
Vue3中判断watch的触发来源(immediate还是值变化)
首先明确:Vue3的watch回调函数没有第三个参数能直接获取触发选项(比如options.immediate),你设想的(new_val, old_val, options)写法并不存在,无法直接通过这种方式判断触发原因。
不过可以通过以下两种间接方法实现需求:
方法一:利用首次执行时old_val的特性
当immediate: true时,watch首次执行的old_val为undefined(如果监听的是ref类型且初始值不是undefined);后续因值变化触发时,old_val会是上一次的有效值。
示例代码:
watch(loading, (new_val, old_val) => { const isImmediate = old_val === undefined; if (isImmediate) { console.log('这是immediate触发的首次执行'); } else { console.log('这是值变化触发的执行'); } }, { immediate: true });
注意:如果监听的变量本身可能被设为undefined,这种方法会失效,建议用下面的方法。
方法二:手动维护触发标记
声明一个外部变量标记是否为首次(immediate)触发,在回调中判断后更新标记,这种方法更通用。
示例代码:
let isImmediateTrigger = true; watch(loading, (new_val, old_val) => { if (isImmediateTrigger) { console.log('由immediate配置触发'); // 执行完首次逻辑后,标记改为false isImmediateTrigger = false; } else { console.log('由变量值变化触发'); } }, { immediate: true });
内容的提问来源于stack exchange,提问作者omega
相关产品推荐
相关产品推荐

