watchEffect实现表单自动保存的核心是响应式捕获变化并立即触发保存,自动追踪form属性、支持防抖、跳过初始化执行、结合校验条件触发。
使用 watchEffect 实现表单自动保存,核心在于“响应式地捕获变化并立即触发保存逻辑”,无需手动指定依赖,代码更轻量、意图更清晰。
watchEffect 会自动收集其执行过程中访问的响应式数据作为依赖。只要在回调里读取了表单对象的属性(比如 form.name、form.email),Vue 就会在这些值变更时重新运行该副作用。
例如:
const form = reactive({ name: '', email: '' });<br>watchEffect(() => {<br> // 这里读取了 form.name 和 form.email<br> saveToServer({ name: form.name, email: form.email });<br>});
只要任一字段更新,保存就会触发——不用写一堆 watch 配置项,也不用维护依赖数组。
立即学习“前端免费学习笔记(深入)”;
自动保存容易因连续输入导致过多请求,建议在 watchEffect 内部结合 setTimeout 做轻量防抖:
示例:
let timer;<br>watchEffect(() => {<br> clearTimeout(timer);<br> timer = setTimeout(() => {<br> saveToServer(form);<br> }, 800);<br>});<br>onBeforeUnmount(() => clearTimeout(timer));
watchEffect 默认会在定义时立即执行一次,可能造成页面加载就发保存请求。若只想响应用户操作,可借助 onInvalidate 或加标记位跳过首次运行:
isInitial,首次设为 true,执行后置为 false
onInvalidate 的清理机制模拟“等待下一次”逻辑(适合更精细控制)推荐方式(简洁明确):
let isInitial = true;<br>watchEffect(() => {<br> if (isInitial) {<br> isInitial = false;<br> return;<br> }<br> debouncedSave(form);<br>});
自动保存不等于盲目提交。可在 watchEffect 中加入校验逻辑,只在表单有效时调用保存:
isValid.value)也写进 watchEffect 回调中读取例如:
const isValid = computed(() => form.email && form.name.length > 2);<br>watchEffect(() => {<br> if (isValid.value) {<br> debouncedSave(form);<br> }<br>});