CourseGroupCascader.vue
5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<!--
* @Author: hookehuyr hookehuyr@gmail.com
* @Date: 2025-11-07 11:00:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-18 23:11:35
* @FilePath: /mlaj/src/components/ui/CourseGroupCascader.vue
* @Description: 教师页面筛选组件(年级/班级/课程),内部管理v-model与options并对外emit change事件
-->
<template>
<!-- 课程 / 年级 / 班级 级联筛选 -->
<van-dropdown-menu active-color="#10b981" swipe-threshold="2">
<van-dropdown-item v-model="select_course_value" :options="course_option" @change="on_course_change" />
<van-dropdown-item v-model="select_major_group_value" :options="major_group_option"
@change="on_major_group_change" />
<van-dropdown-item v-model="select_minor_group_value" :options="minor_group_option"
@change="on_minor_group_change" />
</van-dropdown-menu>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { getTeacherGradeClassListAPI } from "@/api/teacher";
// 组件对外事件
const emit = defineEmits(['change'])
// 接收外部传入的默认值
const props = defineProps({
defaultCourseId: {
type: [Number, String],
default: null
},
defaultMajorGroupId: {
type: [Number, String],
default: null
},
defaultMinorGroupId: {
type: [Number, String],
default: null
}
})
// 本组件内部管理的选择值(课程 / 年级 / 班级)
const select_course_value = ref(null)
const select_major_group_value = ref(null)
const select_minor_group_value = ref(null)
// 本组件内部管理的选项数据(课程 / 年级 / 班级)
const course_option = ref([])
const major_group_option = ref([])
const minor_group_option = ref([])
// 获取筛选选项列表
const getFilterList = async (group_id = null, team_id = null) => {
const { code, data } = await getTeacherGradeClassListAPI({ group_id, team_id });
if (code) {
// 处理数据
course_option.value = data.group_list?.map(item => {
return {
text: item.title,
value: item.id,
}
});
course_option.value.unshift({
text: '全部课程',
value: null,
});
major_group_option.value = data.team_list?.map(item => {
return {
text: item.team_name,
value: item.id,
}
});
major_group_option.value.unshift({
text: '全部年级',
value: null,
});
minor_group_option.value = data.subteam_list?.map(item => {
return {
text: item.subteam_name,
value: item.id,
}
});
minor_group_option.value.unshift({
text: '全部班级',
value: null,
});
}
}
/**
* 课程变化处理
* @param {number|null} val 选中的课程ID
* @returns {void}
*/
const on_course_change = async (val) => {
select_course_value.value = val
// 切换课程时重置分组选择
select_major_group_value.value = null
select_minor_group_value.value = null
// 重建年级选项
getFilterList(val)
// 对外发出change事件,标识来源与值
emit('change', { type: 'course', value: val })
}
/**
* 年级变化处理
* @param {number|null} val 选中的年级ID
* @returns {void}
*/
const on_major_group_change = async (val) => {
select_major_group_value.value = val
// 切换年级时重置班级选择并重建班级选项
select_minor_group_value.value = null
getFilterList(select_course_value.value, val)
// 对外发出change事件,标识来源与值
emit('change', { type: 'major_group', value: val })
}
/**
* 班级变化处理
* @param {number|null} val 选中的班级ID
* @returns {void}
*/
const on_minor_group_change = (val) => {
select_minor_group_value.value = val
// 对外发出change事件,标识来源与值
emit('change', { type: 'minor_group', value: val })
}
/**
* 组件挂载时初始化筛选选项
* @returns {void}
*/
onMounted(async () => {
// 如果有传入默认值,初始化内部状态
if (props.defaultCourseId) {
select_course_value.value = Number(props.defaultCourseId)
}
if (props.defaultMajorGroupId) {
select_major_group_value.value = Number(props.defaultMajorGroupId)
}
if (props.defaultMinorGroupId) {
select_minor_group_value.value = Number(props.defaultMinorGroupId)
}
// 根据当前的选中状态获取列表
// 如果没有默认值,这就等同于 getFilterList()
// 如果有默认值,这将确保下拉选项列表与选中的值匹配(例如只显示选中课程下的年级)
await getFilterList(select_course_value.value, select_major_group_value.value)
})
</script>
<style lang="less">
// 保持与页面一致的下拉菜单样式(如需可局部覆盖)
.van-dropdown-menu {
background-color: white;
border-radius: 0.75rem;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
}
.van-dropdown-item {
.van-cell__title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
flex: 0 0 80%;
}
.van-cell__value {
flex: 0 0 20%;
}
}
</style>