vue.js - Vue 3:为什么我的可组合不是响应式的?
问题描述
我想在另一个中使用 1 个可组合的。我的第一个可组合基本上是 Vuex 的超轻量级版本:
import {
reactive,
readonly,
} from 'vue';
const state = reactive({
settings: {
loading: true,
},
cart: {
loading: true,
items: [],
},
});
export default {
state: readonly(state),
};
当我尝试在另一个可组合中使用它时,cart
它不是反应性的。
在我的其他组合中,我有:
import store from '@/store';
watch(store.state.cart, () => {
console.log('test');
});
它似乎对任何事情都没有反应。当我尝试调用.value
它时,它是未定义的,就好像它不是代理一样。
我也尝试过使用inject('store')
,这似乎做同样的事情。
我想看看购物车的任何部分何时发生变化。
解决方案
答案很长而且很复杂,但基本上可以归结为:
部分原因是 javascript 问题,因为我更新的方式是
cart
用 API 调用替换对象的整个键,因此内部购物车键使用不同的引用进行更新。您可以在此处可视化问题我必须使用
toRef
与 略有不同的ref
它,因为它专门用于从反应对象中提取反应键。我认为这仅适用于解构,但也适用于简单地说const cart = store.state.cart
,因为当我更新购物车时,此cart
变量将指向旧引用。toRef
通过编写解决此问题:const cart = toRef(store.state, 'cart')
推荐阅读
- c# - 如何从自动生成的 Swagger 文档端点中删除不必要的字段?
- scala - 有没有办法配置 IntelliJ+Scala 代码样式以将 if/then 语句与 else 语句对齐?
- typescript - 确保泛型类型在 Typescript 中仅具有原始属性
- java - FileInputStream 在 skip() 调用后留下奇怪的垃圾文本
- angularjs - 可取消选择的无线电未正确跟踪先前的值
- ionic-framework - 服务/保护中的 Ionic 4 滚动位置
- c++ - MFC 按钮单击响应 Escape 键
- java - Spring Boot - 需要 api 密钥和 x509,但不适用于所有端点
- postgresql - 使用 Knex.js 更新 PostgreSQL 中的多个列
- node.js - Mongodb 加入然后查找