
在 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:
<script>
if (document.querySelector('#add-to-cart-form')) {
const app = Vue.createApp({
delimiters: ['${', '}'],
setup() {
const variant = Vue.ref('ealjapd'); // ✅ 声明一次
axios.get('/products/{{product.handle}}.js')
.then((results) => {
variant.value = results.data.variants[0]; // ✅ 正确:修改 .value
console.log('Updated variant:', variant.value);
})
.catch(err => console.error('Failed to fetch variants:', err));
const addToCart = (event) => {
event.preventDefault();
const data = { quantity: 1, id: variant.value?.id }; // 示例:安全访问
axios.post('/cart/add.js', data)
.then(response => console.log('Added to cart:', response))
.catch(error => console.error('Add to cart failed:', error));
};
return {
variant, // ✅ 返回同一个 ref 实例
};
},
}).mount('#add-to-cart-form');
}
</script>? 关键要点:
立即学习“前端免费学习笔记(深入)”;
- ref() 返回的是一个响应式对象,其内部值存储在 .value 属性中;
- 在同步代码中可直接读取 variant.value,在模板中 Vue 会自动解包(如 {{ variant }} 等价于 {{ variant.value }});
- 切勿用 = 重新赋值 ref 变量(如 variant = ref(...)),否则破坏响应式连接;
- 建议在异步操作中添加 .catch() 处理请求失败,避免 variant.value 保持旧值或变为 undefined;
- 若 variants[0] 可能不存在,建议增加空值检查:results.data.variants?.[0]。
这样修改后,variant 将真正响应数据变化,模板中绑定的内容也会实时更新。










