Vue计算属性通过响应式封装规格选择与价格映射,用selectedColor和selectedSize拼接key查priceMap获取价格;动态computed生成可用尺寸列表,处理联动与禁用;Vue3中用ref+computed更清晰,注意priceMap加载时机和key稳定性。
Vue 计算属性本身不直接“实现”多规格组合价格逻辑,而是作为响应式封装,把规格选择状态和价格规则自然地关联起来。关键在于:用 data 或 ref 管理当前选中的规格(如颜色、尺寸),再在 computed 中根据这些值查表或计算出对应价格。
价格不是靠公式算出来的,而是预先定义好的组合映射关系。建议用对象或数组存储所有合法组合及其价格:
// 示例:规格组合价格表(可从后端接口获取)const priceMap = {'红色-大号': 199,'红色-小号': 189,'蓝色-大号': 209,'蓝色-小号': 199,// ……其他组合}前端维护一个规格选中状态(如 selectedColor 和 selectedSize),计算属性就拼 key 去查:
computed: {currentPrice() {const key = `${this.selectedColor}-${this.selectedSize}`return this.priceMap[key] ?? this.basePrice // fallback 到基础价或提示不可选}}用户选了颜色后,某些尺寸可能不可用(比如红色没小号)。这时不能只靠 priceMap,还需动态生成可用选项:
用 ref 存状态,computed 封装逻辑,结构更直观:
const selectedColor = ref('')const selectedSize = ref('')const currentPrice = computed(() => {if (!selectedColor.value || !selectedSize.value) return 0const key = `${selectedColor.value}-${selectedSize.value}`return priceMap[key] ?? basePrice})const availableSizes = computed(() => {return allSizes.filter(size => Object.keys(priceMap).some(k => k.startsWith(`${selectedColor.value}-${size}`)))})priceMap 如果是静态配置,直接定义在 setup 外即可;如果是异步加载的(比如从接口拿),要用 ref 包裹,并在 computed 中加空值判断: