Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 的 getter
类似于 Vue 组件中的计算属性,用于从 store 中派生出一些状态。
Getter:在 Vuex 中,getter 是 store 的计算属性。它们允许你从 store 的状态中派生出一些值,并且这些值会根据依赖的状态变化而自动更新。
在某些情况下,你可能需要根据数据库中的数据动态创建 Vuex getter。这通常涉及到在应用初始化时从数据库获取数据,并根据这些数据来定义 getter。
假设我们有一个电商应用,需要根据用户的偏好设置动态计算折扣。
// 假设我们从数据库获取用户偏好设置
const userPreferences = {
discountRate: 0.1 // 用户享受 10% 的折扣
};
// Vuex store 定义
const store = new Vuex.Store({
state: {
products: [
{ id: 1, name: 'Product A', price: 100 },
{ id: 2, name: 'Product B', price: 200 }
]
},
getters: {
// 动态创建的 getter
discountedPrice: (state) => (productId) => {
const product = state.products.find(p => p.id === productId);
if (product) {
return product.price * (1 - userPreferences.discountRate);
}
return null;
}
}
});
// 在组件中使用
computed: {
productPrice() {
return this.$store.getters.discountedPrice(this.productId);
}
}
问题:如果数据库中的数据更新了,如何确保 Vuex 的 getter 也相应地更新?
解决方法:
// 假设我们有一个函数来更新用户偏好设置
function updateUserPreferences(newPreferences) {
userPreferences = newPreferences;
// 更新 Vuex 中的状态,触发 getter 的重新计算
store.commit('updateUserPreferences', newPreferences);
}
// Vuex mutation 定义
const store = new Vuex.Store({
state: {
userPreferences: userPreferences,
products: [...]
},
mutations: {
updateUserPreferences(state, newPreferences) {
state.userPreferences = newPreferences;
}
},
getters: {
discountedPrice: (state) => (productId) => {
// 使用 state.userPreferences 而不是全局变量
const product = state.products.find(p => p.id === productId);
if (product) {
return product.price * (1 - state.userPreferences.discountRate);
}
return null;
}
}
});
通过这种方式,你可以确保 Vuex 的 getter 总是反映最新的数据库数据。
领取专属 10元无门槛券
手把手带您无忧上云