vue js table colspan rowspan

需求,要写一个菜单权限表。需要做到单元格合并,本来用的antd-vue的表格,然后构造customRender,总感觉有点本末倒置,其实自己实现,更快,而且想改哪里,改哪里。下面是写这个功能前的测试demo。
效果图
请添加图片描述
代码

<template><div class="class-table"><div class="table-wrapper"><div class="tabel-container"><table><thead><tr><th v-for="(week, index) in weeks" :key="index">{{ '周' + digital2Chinese(index + 1, 'week') }}</th></tr></thead><tbody><tr v-for="(item, index) in classTableData" :key="index"><td v-for="(week, index) in weeks" :key="index" :colspan="item[week].colspan" :rowspan="item[week].rowspan" v-show="item[week].colspan !== 0 && item[week].rowspan !== 0">{{ item[week].name || '-' }}<div style="margin-top: 5px">{{ item[week].colspan }}{{ item[week].rowspan }}</div></td></tr></tbody></table></div></div></div>
</template><script>
export default {data() {return {weeks: ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'],classTableData: [{classesTime: '08:00-09:00',monday: { name: 'CSS', rowspan: 1, colspan: 2 },tuesday: { name: 'JS', rowspan: 1, colspan: 0 },wednesday: { name: 'VUE', rowspan: 1, colspan: 3 },thursday: { name: 'JQUERY', rowspan: 1, colspan: 0 },friday: { name: 'REACT', rowspan: 1, colspan: 0 },saturday: { name: 'JQUERY', rowspan: 1, colspan: 1 },sunday: { name: 'REACT', rowspan: 2, colspan: 1 },},{classesTime: '09:00-10:00',monday: { name: 'DATA', rowspan: 1, colspan: 1 },tuesday: { name: 'CSS', rowspan: 1, colspan: 1 },wednesday: { name: 'REACT', rowspan: 1, colspan: 1 },thursday: { name: 'JS', rowspan: 1, colspan: 1 },friday: { name: 'REACT', rowspan: 1, colspan: 1 },saturday: { name: 'DATA', rowspan: 1, colspan: 1 },sunday: { name: 'REACT', rowspan: 0, colspan: 1 },},{classesTime: '10:00-11:00',monday: { name: 'DATA', rowspan: 1, colspan: 1 },tuesday: { name: 'CSS', rowspan: 1, colspan: 1 },wednesday: { name: 'DATA', rowspan: 1, colspan: 1 },thursday: { name: 'JQUERY', rowspan: 1, colspan: 1 },friday: { name: 'DATA', rowspan: 1, colspan: 1 },saturday: { name: 'JS', rowspan: 1, colspan: 1 },sunday: { name: 'VUE', rowspan: 1, colspan: 1 },},{classesTime: '11:00-12:00',monday: { name: '', rowspan: 1, colspan: 1 },tuesday: { name: 'VUE', rowspan: 1, colspan: 1 },wednesday: { name: 'CSS', rowspan: 1, colspan: 1 },thursday: { name: 'VUE', rowspan: 1, colspan: 1 },friday: { name: 'JQUERY', rowspan: 1, colspan: 1 },saturday: { name: 'JQUERY', rowspan: 1, colspan: 1 },sunday: { name: 'DATA', rowspan: 1, colspan: 1 },},{classesTime: '13:00-14:00',monday: { name: 'DATA', rowspan: 1, colspan: 1 },tuesday: { name: 'JQUERY', rowspan: 1, colspan: 1 },wednesday: { name: 'JQUERY', rowspan: 1, colspan: 1 },thursday: { name: 'JQUERY', rowspan: 1, colspan: 1 },friday: { name: '', rowspan: 1, colspan: 1 },saturday: { name: 'JS', rowspan: 1, colspan: 1 },sunday: { name: 'REACT', rowspan: 1, colspan: 1 },},{classesTime: '14:00-15:00',monday: { name: 'REACT', rowspan: 1, colspan: 1 },tuesday: { name: 'JS', rowspan: 1, colspan: 1 },wednesday: { name: 'CSS', rowspan: 1, colspan: 1 },thursday: { name: 'REACT', rowspan: 1, colspan: 1 },friday: { name: '语文', rowspan: 1, colspan: 1 },saturday: { name: 'CSS', rowspan: 1, colspan: 1 },sunday: { name: 'JS', rowspan: 1, colspan: 1 },},{classesTime: '15:00-16:00',monday: { name: 'JQUERY', rowspan: 1, colspan: 1 },tuesday: { name: 'JQUERY', rowspan: 1, colspan: 1 },wednesday: { name: '语文', rowspan: 1, colspan: 1 },thursday: { name: 'JQUERY', rowspan: 1, colspan: 1 },friday: { name: 'DATA', rowspan: 1, colspan: 1 },saturday: { name: 'JS', rowspan: 1, colspan: 1 },sunday: { name: '', rowspan: 1, colspan: 1 },},],tableShow: false,}},created() {// /* mock随机数据*///  Mock.mock({//     'data|7': [//         {//             'classesTime|+1': ['08:00-09:00', '09:00-10:00', '10:00-11:00', '11:00-12:00', '13:00-14:00', '14:00-15:00', '15:00-16:00', '16:00-17:00'],//             'monday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'tuesday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'wednesday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'thursday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'friday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'saturday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文'],//             'sunday|1': ['DATA', 'CSS', 'REACT', 'VUE', 'JQUERY', 'JS', '', '语文']//         }//     ]// });},methods: {/*** 数字转中文* @param {Number} num 需要转换的数字* @param {String} identifier 标识符* @returns {String} 转换后的中文*/digital2Chinese(num, identifier) {const character = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']return identifier === 'week' && (num === 0 || num === 7) ? '日' : character[num]},},
}
</script><style lang="less" scoped>
.class-table {.table-wrapper {width: 100%;height: 100%;overflow: auto;}.tabel-container {margin: 7px;table {table-layout: fixed;width: 100%;thead {background-color: #67a1ff;th {color: #fff;line-height: 17px;font-weight: normal;}}tbody {background-color: #eaf2ff;td {color: #677998;line-height: 12px;}}th,td {width: 60px;padding: 12px 2px;font-size: 12px;text-align: center;border: 1px solid grey;}tr td:first-child {color: #333;.period {font-size: 8px;}}}}
}
</style>

备注:表格数据参考这位博主:vue实现table课程表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2687):重读vue电商网站8之设置弹框提示组件

首先&#xff0c;在 element.js 中导入弹框提示组件&#xff0c;但是它的配置与其它组件不一样&#xff0c;它需要进行全局挂载。 全局导入后&#xff0c;我们就可以在我们的登录组件 login.vue 中通过 this来访问弹框提示组件了。 测试一下&#xff0c;输入 admin 和 123456&a…

table 权限 展示页面

上篇文件介绍了基本的colspan和rowspan&#xff0c;这篇贴上一个学习代码&#xff0c;供以后修改。 效果如下&#xff1a;&#xff08;这个demo v-if 和 v-for 混用了&#xff0c;这个不好&#xff09; <template><div class"rbac-table"><div clas…

vue 公用组件开发 确认框confirm

文件目录&#xff1a; github地址&#xff1a;https://github.com/xingkongwuyu/vue-spa-experience/tree/master/src/components 最终的效果&#xff1a; 组件的源码解析&#xff1a; confirm &#xff1a; confirm的框架 ./index.js import confirmBox from ./src/index; ex…

前端学习(2688):重读vue电商网站9之el-menu 默认会有一个 border-right

这样会导致我们的菜单栏右边会有一个若隐若现的线条凸起 解决办法如下&#xff0c;直接将 el-menu 的border-right 设置为 none 即可。

Android studio 导入module方法

添加module方法步骤&#xff1a; &#xff08;1&#xff09;File----->New------>Import Module找到下载的citypicker文件&#xff0c;点击OK&#xff0c;点击Finish &#xff08;2&#xff09;app的build.gradle下的dependencies下添加 compile project(:citypicker)如…

vue构建项目

想把项目公司一些基础公用组件进行封装&#xff0c;所以需要对单组件进行开发优化。使用到Vue Cli 官方文档&#xff1a;https://cli.vuejs.org/zh/guide/build-targets.html 1、一个新环境&#xff0c;需要安装Vue Cli npm install -g vue/cli npm install -g vue/cli-serv…

前端学习(2689):重读vue电商网站10之表格展开页

只需要将 el-table-column 中 type 属性设为 expand 即能将表格进行展开。 实现效果如下&#xff1a;

AppTheme 属性详解

<style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!--Appbar背景色&#xff0c;应用的主要色调&#xff0c;actionBar默认使用该颜色--><item name"android:colorPrimary">color/material_animations_prima…

前端学习(2690):重读vue电商网站11之使用树形控件 el-tree

对于分配权限一栏&#xff0c;我们需要如下效果&#xff1a; 相关配置属性&#xff1a; 其中 data 为我们的数据源&#xff0c;props 为我们在 tree组件显示的文本内容。通过设置 node-key可以让每个树节点作为唯一标识的属性&#xff0c;整棵树是唯一的&#xff1b;通过设置 …

Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长

1、复制音频文件到raw文件夹下 2、实例化音频文件 private final MediaPlayer.OnCompletionListener beepListener new MediaPlayer.OnCompletionListener() { // 声音public void onCompletion(MediaPlayer mediaPlayer) {mediaPlayer.seekTo(0);} }; private static final …

前端学习(2691):重读vue电商网站12之获取选中节点的keys:

首先&#xff0c;给我们对话框的确定按钮绑定一个事件。 主要使用 tree 组件提供的两个方法 getCheckedKeys 和 getHalfCheckedKeys来分别返回目前被选中的节点的 key 所组成的数组和目前半选中的节点的 key 所组成的数组

cmd 【已解决】windows连接手机,运行adb devices提示“unauthorized”

报错截图如下&#xff1a; 问题原因&#xff1a;电脑连接手机。手机未授权 解决方式&#xff1a; 设置----开发者选项-----打开USB调试&#xff0c;出现如下弹框&#xff0c;点击“确定”即可解决问题。 转载于:https://www.cnblogs.com/syw20170419/p/8280291.html

Android 可开关式顶部下拉view

效果&#xff1a; 实现方法 1、layout文件结构 最外部使用相对布局 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.c…

前端学习(2692):重读vue电商网站13之使用动态编辑标签

实现效果如下&#xff1a; 通过 v-if 的 boolean值来动态变化是否显示文本框还是 button 按钮。通过 v-model 双向绑定来实现文本框内容的监听。 由于每一行需要设置文本框的显示与隐藏&#xff0c;而且数据是共享的。我们需要通过 scope来获取每一行的值来进行绑定&#xff0…

宝塔面板解决跨域

1、找到宝塔面板配置nginx文件的地方 2、增加如下代码 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods POST,PUT,GET,DELETE; add_header Access-Control-Allow-Headers version, access-token, user-token, Accept, apiAuth, User-Agent…

Android 底部上拉抽屉view

module链接&#xff1a;https://download.csdn.net/download/meixi_android/10839835 接入module方法&#xff1a;https://blog.csdn.net/meixi_android/article/details/84655666 1、activity实现步骤 layout文件布局——DrawerLayoutContent_ID是抽屉内容id&#xff0c;dra…

前端学习(2693):重读vue电商网站14之步骤条的使用与美化

以下就是步骤条使用的核心代码&#xff0c;其中 active 绑定的是每一个 step 的下标&#xff0c;默认从 0 开始。其次&#xff0c;我们可以设置 aligin-center 属性来让我们的步骤条进行居中。el-step就是每一个步骤进度。 Javascript <!-- 步骤条区域 --> <el-steps…

BOM--window对象

BOM 的核心对象是window&#xff0c;它表示浏览器的一个实例。在浏览器中&#xff0c;window 对象有双重角色&#xff0c;它既是通过JavaScript 访问浏览器窗口的一个接口&#xff0c;又是ECMAScript 规定的Global 对象。这意味着在网页中定义的任何一个对象、变量和函数&#…

前端学习(2694):重读vue电商网站15之阻止页签tabs切换

主要函数如下&#xff1a; 在我们的 tabs 标签页添加一个 before-leave 函数 然后在 methods 中定义&#xff0c;根据第一个标签页的逻辑来阻止标签页的切换。

Android 侧滑多层view显示

侧滑module链接&#xff1a;https://download.csdn.net/download/meixi_android/10840271 引用方法 只需layout布局文件引用即可——第一个LinearLayout是底层view&#xff0c;第二个LinearLayout是上层view&#xff0c;侧滑即可显示底层view <com.daimajia.swipe.SwipeL…