在Vue項目中遇到報錯,原因是模板中使用了<template>標簽內的v-for指令,而當前Vue版本不支持此用法。解決方案是移除<template>標簽,直接在<el-option>上使用v-for。同時優化計算屬性cardOptions,使其能夠兼容歷史數據,確保當前值對應的選項能正確顯示。此外還提供了格式化冰淇淋口味的函數,將"西瓜"等前綴轉換為"西瓜味"等更友好的顯示格式。通過修改,既解決了版本兼容問題,又改善了用戶體驗。報錯信息如下:
<template v-for="option in cardOptions" :key="option.value">
報錯:
./src/views/ice/taste/tasteDetail.vue?vue&type=template&id=5cb19544&scoped=true (./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"333-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/ice/taste/tasteDetail.vue?vue&type=template&id=5cb19544&scoped=true) Module Error (from ./node_modules/vue-loader/lib/loaders/templateLoader.js): (Emitted value instead of an instance of Error)
是因為Vue版本不支持template標簽內的v-for指令。可以修改代碼以適應較舊的Vue版本。
原:
<el-col :span="4"><!-- <el-form-item label="冰淇淋口味">{{ dataForm.age }}</el-form-item>--><el-form-item label="微信維系" prop="tasteType"><el-select v-model="dataForm.age" placeholder="選擇口味" clearable size="small" style="width: 80px;"><template v-for="option in cardOptions" :key="option.value"><el-option:label="option.label":value="option.value"v-if="option.value.startsWith(taste) || dataForm.age === option.value"></el-option></template></el-select></el-form-item></el-col>
// 所有口味選項allCardOptions: [{ label: "西瓜1", value: "西瓜1" },{ label: "西瓜2", value: "西瓜2" },{ label: "西瓜3", value: "西瓜3" },{ label: "西瓜4", value: "西瓜4" },{ label: "西瓜5", value: "西瓜5" },{ label: "香蕉1", value: "香蕉1" },{ label: "香蕉2", value: "香蕉2" },{ label: "香蕉3", value: "香蕉3" },{ label: "香蕉4", value: "香蕉4" },{ label: "香蕉5", value: "香蕉5" },{ label: "草莓1", value: "草莓1" },{ label: "草莓2", value: "草莓2" },{ label: "草莓3", value: "草莓3" },{ label: "草莓4", value: "草莓4" },{ label: "草莓5", value: "草莓5" },{ label: "蜜桃1", value: "蜜桃1" },{ label: "蜜桃2", value: "蜜桃2" },{ label: "蜜桃3", value: "蜜桃3" },{ label: "蜜桃4", value: "蜜桃4" },{ label: "蜜桃5", value: "蜜桃5" }],};},// 根據當前商戶過濾出的卡選項cardOptions() {if (!this.currentCardPrefix) {return this.allCardOptions;}return this.allCardOptions.filter(option =>option.value.startsWith(this.currentCardPrefix));}},
下面是優化后的代碼:移除template標簽內的v-for指令,改用直接在el-option上使用
修改了計算屬性filteredCardOptions,使其不僅過濾出當前用戶應該看到的選項,還會檢查當前值是否在這些選項中,如果不在則會將當前值對應的選項添加進去,以確保歷史數據的兼容性顯示
通過這種方式,我們既實現了根據用戶顯示不同選項,也保證了現有值的正確顯示
<el-table-column label="冰淇淋口味" align="center" prop="taste" width="70"><template slot-scope="scope"><span>{{ formatTaste(scope.row.taste) }}</span></template></el-table-column>
formatTaste(value) {// 如果值為null或undefined,返回空字符串// if (value === null || value === undefined || value === "") {// return '';// }// 如果值為空,返回空字符串if (!value||value === "無") return '';if (value.startsWith('草莓')) {return value.replace('草莓', '草莓味');} else if (value.startsWith('西瓜')) {return value.replace('西瓜', '西瓜味');}else if (value.startsWith('香蕉')) {return value.replace('香蕉', '香蕉味');}else if (value.startsWith('蜜桃')) {return value.replace('蜜桃', '蜜桃味');}else {return value;}},