vue3+ts+elementui制作精美的课表

news/2025/2/28 14:16:37/

使用vue3+ts+elementui 如何制作出精美的课表呢,

最终效果图如下:

 

直接上代码:

这里直接把封装成一个课表的组件:

<script setup lang="ts">
import { ref, watch, onMounted } from "vue";
import IconText from "@/views/common/IconText.vue";
import {Timer,Location,HomeFilled,UserFilled
} from "@element-plus/icons-vue";
const props = defineProps({//下午节次数afternoonLength: {type: [Number],default: 4},// 总节次length: {type: [Number],default: 12},//课表数据events: {type: Array<any>,default: null}
});
const tableCellStyle = ({ row, column }) => {if (row[column.property].title !== undefined) {//return { color: "#FFFFFF", "text-align": "center" };if (row[column.property].type === 1) {return {"background-color": "#2B65EC","border-radius": "10px",color: "#fff"};} else if (row[column.property].type === 2) {return {"background-color": "#7F38EC","border-radius": "10px",color: "#fff"};}}
};
// let maxHeight = 400;
const timetable = ref([]);
const makeTimetable = () => {timetable.value = [];for (let i = 0; i < props.length; i++) {const one = {sjd: "",jc: i + 1,mon: {},tue: {},wed: {},thu: {},fri: {},sat: {},sun: {}};if (i < 4) {one.sjd = "上午";} else if (i > 3 && i < props.afternoonLength + 4) {one.sjd = "下午";} else {one.sjd = "晚上";}timetable.value.push(one);}
};
const weeks = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
const mergeData = () => {// 合并数据if (props.events.length > 0) {for (let i = 0; i < props.events.length; i++) {// 获取星期几const week = weeks[props.events[i].xq - 1];timetable.value[props.events[i].start - 1][week] = props.events[i];}}
};const objectSpanMethod = ({ row, rowIndex, columnIndex }) => {if (columnIndex === 0) {if (rowIndex < 4) {if (rowIndex === 0) {return {rowspan: 4,colspan: 1};} else {return {rowspan: 0,colspan: 0};}} else if (rowIndex > 3 && rowIndex < 4 + props.afternoonLength) {if (rowIndex === 4) {return {rowspan: props.afternoonLength,colspan: 1};} else {return {rowspan: 0,colspan: 0};}} else {if (rowIndex === 4 + props.afternoonLength) {return {rowspan: props.length - 4 - props.afternoonLength,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}}if (columnIndex === 2) {if (row.mon.title !== undefined) {return {rowspan: row.mon.end - row.mon.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 3) {if (row.tue.title !== undefined) {return {rowspan: row.tue.end - row.tue.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 4) {if (row.wed.title !== undefined) {return {rowspan: row.wed.end - row.wed.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 5) {if (row.thu.title !== undefined) {return {rowspan: row.thu.end - row.thu.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 6) {if (row.fri.title !== undefined) {return {rowspan: row.fri.end - row.fri.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 7) {if (row.sat.title !== undefined) {return {rowspan: row.sat.end - row.sat.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}if (columnIndex === 8) {if (row.sun.title !== undefined) {return {rowspan: row.sun.end - row.sun.start + 1,colspan: 1};} else {return {rowspan: 1,colspan: 1};}}
};
makeTimetable();
onMounted(() => {// maxHeight = document.documentElement.clientHeight;mergeData();
});
watch(props,(_newValue, _oldValue) => {mergeData();},{ immediate: true, deep: true }
);
</script><template><div><div class="panel"><el-table:data="timetable":border="true":span-method="objectSpanMethod":header-cell-style="{background: '#d9e5fd',color: 'black',fontWeight: 1000}"style="width: 100%":cell-style="tableCellStyle"><el-table-column prop="sjd" label="时间段" width="80" align="center" /><el-table-column prop="jc" label="节次" width="80" align="center" /><el-table-column prop="mon" label="星期一" align="left"><template v-slot="scope"><div v-if="scope.row.mon.title !== undefined"><h4>{{ scope.row.mon.title.toString().split(';').join('<br />') }}</h4><h5><IconText :icon="Timer" :text="scope.row.mon.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.mon.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.mon.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.mon.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="tue" label="星期二" align="left"><template v-slot="scope"><div v-if="scope.row.tue.title !== undefined"><h4>{{ scope.row.tue.title }}</h4><h5><IconText :icon="Timer" :text="scope.row.tue.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.tue.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.tue.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.tue.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="wed" label="星期三" align="left"><template v-slot="scope"><div v-if="scope.row.wed.title !== undefined"><h4>{{ scope.row.wed.title }}</h4><h5><IconText :icon="Timer" :text="scope.row.wed.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.wed.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.wed.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.wed.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="thu" label="星期四" align="left"><template v-slot="scope"><div v-if="scope.row.thu.title !== undefined"><h4><spanv-html="scope.row.thu.title.toString().split(';').join('<br />')"/></h4><h5><IconText :icon="Timer" :text="scope.row.thu.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.thu.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.thu.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.thu.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="fri" label="星期五" align="left"><template v-slot="scope"><div v-if="scope.row.fri.title !== undefined"><h4>{{ scope.row.fri.title }}</h4><h5><IconText :icon="Timer" :text="scope.row.fri.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.fri.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.fri.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.fri.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="sat" label="星期六" align="left"><template v-slot="scope"><div v-if="scope.row.sat.title !== undefined"><h4>{{ scope.row.sat.title }}</h4><h5><IconText :icon="Timer" :text="scope.row.sat.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.sat.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.sat.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.sat.num" /></h5></div><div v-else /></template></el-table-column><el-table-column prop="sun" label="星期日" align="left"><template v-slot="scope"><div v-if="scope.row.sun.title !== undefined"><h4>{{ scope.row.sun.title }}</h4><h5><IconText :icon="Timer" :text="scope.row.sun.skjc" /></h5><h5><IconText :icon="Location" :text="scope.row.sun.addr" /></h5><h5><IconText :icon="HomeFilled" :text="scope.row.sun.jxbzc" /></h5><h5><IconText :icon="UserFilled" :text="scope.row.sun.num" /></h5></div><div v-else /></template></el-table-column></el-table></div></div>
</template>
<style scoped lang="scss">
.cellStyle {background-color: rgb(24 144 255 / 80%);color: #fff;border-radius: 10px;
}
</style>

引用timetable组件:

 


http://www.ppmy.cn/news/705655.html

相关文章

3分钟看懂电动汽车“刹车”这件事!

特斯拉“刹车门”频频热搜&#xff0c; 我们抛开争执聊聊科普。 逆姐3分钟带你说说汽车“刹车”这件事&#xff0c; 燃油车和电动车到底啥区别&#xff1f;

智能电动车无线外设规范

1、电动自行车无线外设规范的意义 电动自行车是一个常见的交通工具&#xff0c;多年发展下来&#xff0c;形成了多个较为标准的零部件&#xff0c;通过组装这些零部件&#xff0c;即可拼装成&#xff0c;常见的电动车零部件包括&#xff1a; 机械类&#xff1a;车架&#xff0…

自动驾驶系列(十)编写电动车ROS节点(刹车)

一、硬件控制协议 对于不同的设备&#xff0c;底层的通讯方式都不一致&#xff0c;因此需要根据具体硬件具体分析。本系统 采用了1个CAN盒子控制转向&#xff0c;1路DA控制油门&#xff0c;另外一路DA控制刹车。 1&#xff0c;转向协议 CAN协议获取当前状态的帧ID是0x322,发送…

电动车主控芯片CS32F103系列

电动车是现下人们短程出行非常喜爱的一种交通工具&#xff0c;无论是在一线大城市还是十八线小城镇都能够看到它的身影。电动车的发展意味着新能源在我们生活中开始占据重要位置&#xff0c;充电式的交通工具于现在对地球环境保护而言更具优越性。所以电动车的发展是大势所趋&a…

避障红外小车C语言程序c51,自动避障红外电动小车C51程序

#include"reg51.h" #include #define uchar unsigned char #define uint unsigned int #define left_infrare 0 #define right_infrare 1 #define dj_state1 0X5F //前进 #define dj_state2 0X4F //右转 #define dj_state3 0X1F …

氢燃料电池车本质是一辆“增程式”电动车

氢燃料电池车本质是一辆“增程式”电动车&#xff1f; 氢燃料电池还是锂电池电动车好&#xff1f;这个争论似乎每隔一段时间又开始热起来。 很多人不了解氢燃料电池车&#xff0c;把氢燃料电池与电动车对立起来。其实在技术上&#xff0c;氢燃料电池车身就是电动车的一种。 你…

顺骐名车汽车服务器中心,骐风k7电动汽车怎么样?骐风k7电动汽车介绍

骐风是一个成立不久汽车品牌&#xff0c;在电动汽车等方面的生产有不少厉害的车型。该品牌下的车型在上市以后都是凭借中靓丽的外形和精湛的技术征服了不少的消费者。但是在国内的汽车市场上&#xff0c;车型的种类和品牌不计其数&#xff0c;作为一个新成立的品牌想要在短时间…

自动驾驶纯电动客车设计

随着科技的发展&#xff0c;自动驾驶汽车已经从概念逐渐变为现实。过去几年&#xff0c;百度、Pony.ai等公司相继快速步入了全球自动驾驶技术研发的前列&#xff0c;可以说自动驾驶技术再次引领了整个汽车技术的突破。 一、自动驾驶汽车级别分类 和人工智能一样&#xff0c;自动…