编译时遇到以下错误:
Module Error (from ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/loaders/templateLoader.js):
(Emitted value instead of an instance of Error)
Errors compiling template:
:class不支持 getStatusClass(task.taskStatus) 语法
在 uni-app 的模板中,:class 不支持直接调用方法,例如:
<!-- ❌ 错误写法 -->
<view class="task-status" :class="getStatusClass(task.taskStatus)">
这是 uni-app 的语法限制,与标准 Vue.js 不同。
将方法调用改为表达式拼接字符串的形式,使用三元运算符(条件表达式)来实现:
<!-- ✅ 正确写法 -->
<view class="task-status" :class="task.taskStatus === 'PENDING' ? 'status-pending' : task.taskStatus === 'DEPARTING' ? 'status-departing' : task.taskStatus === 'ARRIVED' ? 'status-arrived' : task.taskStatus === 'RETURNING' ? 'status-returning' : task.taskStatus === 'COMPLETED' ? 'status-completed' : task.taskStatus === 'CANCELLED' ? 'status-cancelled' : task.taskStatus === 'IN_PROGRESS' ? 'status-in-progress' : 'status-default'">
修改前:vue <view class="task-status" :class="getStatusClass(task.taskStatus)"> {{ getStatusText(task.status) }} </view>
修改后:vue <view class="task-status" :class="task.taskStatus === 'PENDING' ? 'status-pending' : task.taskStatus === 'DEPARTING' ? 'status-departing' : task.taskStatus === 'ARRIVED' ? 'status-arrived' : task.taskStatus === 'RETURNING' ? 'status-returning' : task.taskStatus === 'COMPLETED' ? 'status-completed' : task.taskStatus === 'CANCELLED' ? 'status-cancelled' : task.taskStatus === 'IN_PROGRESS' ? 'status-in-progress' : 'status-default'"> {{ getStatusText(task.status) }} </view>
修改前:vue <view class="task-status" :class="getStatusClass(task.taskStatus)"> {{ getStatusText(task.taskStatus) }} </view>
修改后:vue <view class="task-status" :class="task.taskStatus === 'PENDING' ? 'status-pending' : task.taskStatus === 'DEPARTING' ? 'status-departing' : task.taskStatus === 'ARRIVED' ? 'status-arrived' : task.taskStatus === 'RETURNING' ? 'status-returning' : task.taskStatus === 'COMPLETED' ? 'status-completed' : task.taskStatus === 'CANCELLED' ? 'status-cancelled' : task.taskStatus === 'IN_PROGRESS' ? 'status-in-progress' : 'status-default'"> {{ getStatusText(task.taskStatus) }} </view>
修改前:vue <view class="value status" :class="taskDetail.taskStatus.toLowerCase()"> {{ getStatusText(taskDetail.taskStatus) }} </view>
修改后:vue <view class="value status" :class="taskDetail.taskStatus === 'PENDING' ? 'pending' : taskDetail.taskStatus === 'DEPARTING' ? 'in_progress' : taskDetail.taskStatus === 'ARRIVED' ? 'in_progress' : taskDetail.taskStatus === 'RETURNING' ? 'in_progress' : taskDetail.taskStatus === 'IN_PROGRESS' ? 'in_progress' : taskDetail.taskStatus === 'COMPLETED' ? 'completed' : taskDetail.taskStatus === 'CANCELLED' ? 'cancelled' : ''"> {{ getStatusText(taskDetail.taskStatus) }} </view>
说明:
- detail.vue 中使用的是小写的状态类名(pending, in_progress, completed, cancelled)
- 将多个进行中的状态(DEPARTING, ARRIVED, RETURNING, IN_PROGRESS)都映射为 in_progress 类
原 getStatusClass 方法的映射逻辑:
getStatusClass(status) {
const statusClassMap = {
'PENDING': 'status-pending', // 待处理
'DEPARTING': 'status-departing', // 出发中
'ARRIVED': 'status-arrived', // 已到达
'RETURNING': 'status-returning', // 返程中
'COMPLETED': 'status-completed', // 已完成
'CANCELLED': 'status-cancelled', // 已取消
'IN_PROGRESS': 'status-in-progress' // 处理中
}
return statusClassMap[status] || 'status-default'
}
现在直接在模板中使用三元表达式实现相同的映射逻辑。
方法调用 ❌
vue :class="getStatusClass(task.taskStatus)"
复杂表达式 ❌
vue :style="{ color: getColor(item.type) }"
简单属性访问 ✅
vue :class="task.statusClass"
三元运算符 ✅
vue :class="task.status === 'PENDING' ? 'status-pending' : 'status-default'"
数组/对象字面量 ✅
vue :class="[task.baseClass, task.statusClass]" :class="{ 'active': task.isActive, 'disabled': task.isDisabled }"
计算属性 ✅
```vue
:class="taskStatusClass"
// 在 computed 中定义
computed: {
taskStatusClass() {
return this.getStatusClass(this.task.taskStatus)
}
}
```
优点:
- 无需修改 script 部分
- 逻辑直观,在模板中可见
缺点:
- 表达式较长,代码冗余
- 多个状态时可读性稍差
<template>
<view class="task-status" :class="statusClass">
</template>
<script>
export default {
computed: {
statusClass() {
return this.getStatusClass(this.task.taskStatus)
}
}
}
</script>
优点:
- 模板更简洁
- 逻辑封装在 script 中
缺点:
- 需要为列表中每个项目定义计算属性
- 在 v-for 中使用时复杂度较高
loadTasks() {
listTask(this.queryParams).then(response => {
this.taskList = response.rows.map(task => ({
...task,
statusClass: this.getStatusClass(task.taskStatus)
}))
})
}
优点:
- 模板最简洁
- 性能最好(预计算一次)
缺点:
- 需要在数据加载时处理
- 增加了数据对象的字段
<!-- 方案1:三元运算符 -->
<view v-for="task in taskList" :key="task.id">
<view :class="task.status === 'PENDING' ? 'status-pending' : 'status-default'">
</view>
</view>
<!-- 方案3:预处理数据 -->
<view v-for="task in taskList" :key="task.id">
<view :class="task.statusClass">
</view>
</view>
<!-- 方案2:计算属性 -->
<template>
<view :class="taskStatusClass">
</template>
<script>
export default {
computed: {
taskStatusClass() {
return this.getStatusClass(this.currentTask.taskStatus)
}
}
}
</script>
getStatusClass 方法:class 方法调用语法错误app/pages/index.vue (第57行)app/pages/task/index.vue (第115行)app/pages/task/detail.vue (第22行).toLowerCase() 等字符串方法