乐闻世界logo
搜索文章和话题

如何禁用vuex getter缓存?

2 个月前提问
2 个月前修改
浏览次数24

1个答案

1

当使用 Vuex 作为状态管理库时,默认情况下,getter 的结果是被缓存的。这是因为 Vuex 中的 getters 本质上是 Vue 的计算属性,并且只有当它依赖的状态发生变化时才会重新计算。然而,在某些特定的场景下,我们可能不希望使用这种缓存机制,需要禁用掉。虽然 Vuex 本身不直接提供禁用缓存的功能,但我们可以通过一些方法间接达到这个目的。

方法一:使用方法而非getter

最直接的方法是将需要实时计算的 getter 转换为一个方法。这样每次调用方法都会进行计算,而不使用缓存。

示例:

假设原本在 Vuex 中有一个 getter 用来计算购物车总价:

javascript
getters: { totalPrice(state) { return state.cartItems.reduce((total, item) => total + item.price * item.quantity, 0); } }

我们可以将其改写为一个 action 或 method:

javascript
methods: { calculateTotalPrice() { return this.$store.state.cartItems.reduce((total, item) => total + item.price * item.quantity, 0); } }

这样,每次调用 calculateTotalPrice 方法时,都会进行一次完整的计算,而不会使用任何缓存。

方法二:添加一个变化的依赖

另一种方法是在 getter 中加入一个额外的依赖,这个依赖项是频繁变化的。这样,由于依赖的变化,getter 就会不断地被重新计算。

示例:

javascript
getters: { totalPrice(state) { return (dummy) => { return state.cartItems.reduce((total, item) => total + item.price * item.quantity, 0); } } }

在组件中使用时:

javascript
computed: { totalPrice() { return this.$store.getters.totalPrice(new Date()) // 通过传递不断变化的值(如当前时间) } }

这样,每次计算 totalPrice 时都会传入一个新的时间值,迫使 Vuex 重新计算 getter。

方法三:使用事件触发更新

如果禁用缓存的需求是基于特定事件,可以在事件处理中直接调用方法或更新某个状态来间接触发 getter 的重新计算。

示例:

javascript
methods: { updateCart() { // 某些购物车更新逻辑 this.$store.commit('updateCartTimestamp'); // 触发状态更新 } }

在 getter 中:

javascript
getters: { totalPrice(state) { return state.cartItems.reduce((total, item) => total + item.price * item.quantity, 0) + state.lastUpdated; } }

lastUpdated 是一个每次购物车更新时变化的时间戳,这会迫使 totalPrice 的重新计算。

这些方法虽然可以实现禁用缓存的目的,但是应根据具体需求谨慎选择,因为频繁的计算可能会影响应用性能。

2024年7月29日 20:12 回复

你的答案