vue课表实现
实现思路
基于Vue的课表系统通常需要展示一周课程安排,支持动态数据绑定和交互操作。核心功能包括课程格子渲染、时间轴、拖拽调整等。
基础布局结构
使用双层嵌套循环实现行列布局,外层循环星期,内层循环节次。通过CSS Grid或Flex布局控制样式。
<template>
<div class="timetable">
<div class="header">
<div v-for="day in weekdays" :key="day">{{ day }}</div>
</div>
<div class="body">
<div v-for="(time, index) in timeslots" :key="index" class="row">
<div v-for="day in 5" :key="day" class="cell"
@click="handleCellClick(day, index)">
{{ getCourse(day, index) }}
</div>
</div>
</div>
</div>
</template>
数据模型设计
课程数据建议采用对象数组存储,每个课程对象包含星期、节次、名称等属性。
data() {
return {
weekdays: ['周一', '周二', '周三', '周四', '周五'],
timeslots: ['8:00', '10:00', '14:00', '16:00'],
courses: [
{ day: 1, slot: 0, name: '高等数学', color: '#FFEE93' },
{ day: 3, slot: 2, name: '大学英语', color: '#ADF7B6' }
]
}
}
课程渲染方法
通过计算属性或方法匹配当前单元格对应的课程信息。
methods: {
getCourse(day, slot) {
const course = this.courses.find(c =>
c.day === day && c.slot === slot
);
return course ? course.name : '';
}
}
样式优化
使用CSS变量管理课程颜色,通过动态绑定实现可视化区分。

.timetable {
display: grid;
grid-template-columns: repeat(6, 1fr);
}
.cell {
border: 1px solid #eee;
height: 80px;
position: relative;
}
.course-item {
background-color: v-bind('course.color');
border-radius: 4px;
padding: 4px;
}
高级功能实现
- 拖拽调整:使用HTML5 Drag API或第三方库如vuedraggable
- 课程弹窗:点击单元格时显示课程详情模态框
- 持久化存储:结合localStorage或后端API保存课表数据
- 响应式适配:通过媒体查询调整移动端显示样式
第三方组件推荐
- FullCalendar:专业级日历组件,支持课程视图
- Vuetify Timetable:Material Design风格的课表组件
- Timetable.js:专注于时间表展示的轻量库
注意事项
- 跨天课程需要特殊处理合并单元格
- 节次时间显示建议做成可配置项
- 空单元格建议添加快速添加课程功能
- 学期切换功能需考虑数据重新加载机制






