Vue 中 ref 变量更新失效的正确写法

在 vue 3 composition api 中,使用 `ref()` 创建的响应式变量必须通过 `.value` 属性赋值,直接重新赋值 `variant = ref(...)` 会丢失响应性并覆盖原 ref 实例。

你在 axios.get() 的回调中执行了:

variant = Vue.ref(results.data.variants[0]);

这行代码创建了一个全新的 ref 实例,并将其赋值给局部变量 variant,但此时 setup() 函数早已将初始的 ref('ealjapd') 实例返回给了模板(如 {{ variant }} 或 :value="variant")。新创建的 ref 并未被 Vue 响应式系统追踪,也未暴露给组件上下文,因此视图不会更新,且原始 variant 引用已失效。

✅ 正确做法是:复用已声明的 ref 实例,仅更新其 .value

? 关键要点:

  • ref() 返回的是一个响应式对象,其内部值存储在 .value 属性中;
  • 在同步代码中可直接读取 variant.value,在模板中 Vue 会自动解包(如 {{ variant }} 等价于 {{ variant.value }});
  • 切勿用 = 重新赋值 ref 变量(如 variant = ref(...)),否则破坏响应式连接;
  • 建议在异步操作中添加 .catch() 处理请求失败,避免 variant.value 保持旧值或变为 undefined;
  • 若 variants[0] 可能不存在,建议增加空值检查:results.data.variants?.[0]。

这样修改后,variant 将真正响应数据变化,模板中绑定的内容也会实时更新。