VueUse的useStorage存储的数据变化了,但页面没更新怎么办?
在用VueUse的useStorage存表单数据时遇到个怪问题。我用v-model绑定了输入框,通过useStorage存到localStorage,但修改输入内容后页面显示没变,除非手动刷新。试过重新安装vueuse和检查依赖版本,还是不行。
代码大概是这样的:
<template>
<input v-model="formData.name" />
</template>
<script setup>
import { useStorage } from '@vueuse/core'
const formData = useStorage('user-data', { name: '' })
预期是输入时实时更新并存储,但输入框内容改了之后,页面上的其他显示区域(比如{{ formData.name }})不跟着变,必须刷新页面才能看到新值。这是哪里出问题了?
useStorage返回的是一个响应式引用(ref),但你在模板里用的时候可能没正确解包。Vue 的响应式系统需要你显式地处理 ref 的值。具体来说,
formData是一个 ref 对象,而你直接在模板里用了formData.name,这会导致 Vue 无法正确追踪name的变化。所以页面上的其他显示区域不会自动更新。解决方法很简单,你可以通过
.value来访问和修改 ref 的值,或者用reactive包一下让它更符合你的使用场景。我建议改一下代码:这样改完之后,
state就是一个普通的响应式对象了,你在模板里可以直接用state.name,输入框的值变化时,页面上的其他地方也会跟着实时更新。还有一点需要注意,如果你确实想继续用 ref 的方式,也可以直接在模板里写成
formData.value.name,不过这种方式会显得有点啰嗦,我个人更推荐用reactive包一下。最后吐槽一句,VueUse 的这些工具虽然好用,但有时候坑也不少,尤其是响应式这块,稍不注意就容易踩雷。希望这个改动能帮你解决问题。