有些时候,我们总是无可避免的需要自己去手撸一些东西,因为需求总是在不断的变化。例如,最开始的需求,我们只是在首页展示一个数据列表,此时,我们可能直接就自己手写了一个table,后来,突然增加了一个需求,例如:需要在一些指定的列上面增加排序功能。此时,由于我们的样式和界面都已经调整好了,如果再去重新使用第三方的一些vue组件,会觉得没必要浪费时间,于是,很可能,就需要自己动手去增加一个这样的功能。如下图所示:

  

  封装的组件“DataTable.vue”,代码如下:

<template>
<table class="table">
<thead>
<tr>
<th>{{title}}</th>
<th v-if="title!='建筑'"
@click="onClickHead('count',0)">项目总数(个)<i v-if="filed=='count'"
:class="getIcon(0)"></i></th>
<th @click="onClickHead('objArea',1)">总面积(㎡)<i v-if="filed=='objArea'"
:class="getIcon(1)"></i></th>
<th @click="onClickHead('objEnergy',2)">今日总用电(kWh)<i v-if="filed=='objEnergy'"
:class="getIcon(2)"></i></th>
<th @click="onClickHead('objAreaEnergy',3)">能耗密度(kWh/㎡)<i v-if="filed=='objAreaEnergy'"
:class="getIcon(3)"></i></th>
<th @click="onClickHead('personEnergy',4)">人均能耗(kWh/人)<i v-if="filed=='personEnergy'"
:class="getIcon(4)"></i></th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in filterData"
:key="index"
:class="{'default':title=='建筑'}"
@click="jumpToDistrict(item)">
<td>{{item.objName}}</td>
<td v-if="title!='建筑'">{{item.count}}</td>
<td>{{item.objArea}}</td>
<td>{{item.objEnergy}}</td>
<td>{{item.objAreaEnergy}}</td>
<td>{{item.personEnergy}}</td>
</tr>
</tbody>
</table>
</template> <script>
export default {
props: {
title: {
type: String,
default: '区域'
},
dataList: {
type: Array,
default: () => {
return []
}
}
},
data () {
return {
filed: 'count', //排序字段-当前
arrOrderAsc: [false, true, true, true, true], //默认第一项降序
curCellIndex: 0, //当前排序列索引
filterData: []
}
},
watch: {
dataList: {
handler: function (val) {
if (val && val.length > 0) {
this.getOrderData();
}
},
immediate:true,
deep: true, //深度监听设置为 true
}
},
methods: {
getOrderData () {
let list = this.dataList.map(m => {
return {
objName: m.objName,
count: m.regionsList ? m.regionsList.length : 0,
objArea: m.objArea,
objEnergy: m.objEnergy,
objAreaEnergy: m.objAreaEnergy,
personEnergy: m.personEnergy
}
});
this.filterData = this.arrOrderAsc[this.curCellIndex] ? list.sort(this.compareAsc(this.filed)) : list.sort(this.compareDesc(this.filed));
},
jumpToDistrict (item) {
console.log('item :>> ', item);
if (this.title == '建筑') return;
this.$emit('jumpToDistrict', { id: item.objId, name: item.objName, regionsList: m.regionsList });
},
//升序--这是比较函数
compareAsc (p) {
return function (m, n) {
var a = m[p];
var b = n[p];
return a - b;
}
},
//降序--这是比较函数
compareDesc (p) {
return function (m, n) {
var a = m[p];
var b = n[p];
return b - a;
}
},
//点击排序列
onClickHead (val, index) {
this.filed = val;
this.curCellIndex = index;
this.arrOrderAsc[index] = !this.arrOrderAsc[index];
this.getOrderData();
},
//获取升降序图标
getIcon (index) {
return this.arrOrderAsc[index] ? 'el-icon-caret-top' : 'el-icon-caret-bottom';
}
}
}
</script> <style lang="scss" scoped>
@import "@/assets/css/variables.scss";
table thead,
tbody tr,
tfoot tr {
display: table;
width: 100%;
table-layout: fixed;
text-align: center;
}
.table {
width: 100%;
border-collapse: collapse;
text-align: center;
color: white;
tr {
height: 28px;
line-height: 28px;
}
thead {
background: rgba(97, 160, 236, 0.12);
cursor: pointer;
}
tbody {
display: block;
height: 150px;
overflow-y: auto;
@include scrollbarHomeV;
background: linear-gradient(
180deg,
rgba(19, 34, 98, 0.6) 0%,
ragb(9, 22, 56, 0.6) 100%
);
tr {
cursor: pointer;
&:hover {
color: #26c8f6;
background: rgba(40, 54, 77, 0.5);
}
&.default {
cursor: default;
}
}
}
caption {
text-align: left;
padding-bottom: 4px;
}
}
</style>
公共样式代码variables.scss,此处主要是自定义滚动样式
$headHeight:80px;//导航条高度
$mainBgColor:#081338; //主体背景颜色
$scrollbarColorHome:#135786; //首页滚动条样式
$hoverColor: #7abef9; //链接hover颜色
/*-----------------------------首页定义滚动条样式------------------*/
@mixin scrollbarHomeV($w: 10px, $h: 12px) { /*webkit内核*/
&::-webkit-scrollbar {
width: $w;
/*滚动条宽度*/
height: $h;
/*滚动条高度*/
} &::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(19, 87, 134, 0.1);
border-radius: 6px;
} &::-webkit-scrollbar-thumb {
border-radius: 6px;
background: $scrollbarColorHome;
-webkit-box-shadow: inset 0 0 6px rgba(19, 87, 134, 0.5);
min-height: 40px; &:hover {
background: $scrollbarColorHome;
}
} &::-webkit-scrollbar-thumb:window-inactive {
background: $scrollbarColorHome;
}
}

vue中手写table的升降序的更多相关文章

  1. OA系统中手写签批功能的实现

    一.需求背景 OA系统审批中,有对word或者pdf文件源文档在指定的位置可以插入相应的文字,其实就是一个审批的功能,到了指定的人那边,他可以进行签批.这个功能一般来说,是针对于领导方面,对于一个事情 ...

  2. 基于vue框架手写一个notify插件,实现通知功能

    简单编写一个vue插件,当点击时触发notify插件,dom中出现相应内容并且在相应时间之后清除,我们可以在根组件中设定通知内容和延迟消失时间. 1. 基础知识 我们首先初始化一个vue项目,删除不需 ...

  3. vue中,写在methods里的B方法去调A方法的数据,访问不到?

    今天在写项目的时候,发现了一个京城性忽略的问题,在vue的methods的方法里面定义了两个方法,如下: getTaskList() { api.growthDetails.taskList({ ap ...

  4. vue中获取滚动table的可视页面宽度,调整表头与列对齐(每列宽度不都相同)

    mounted() { // 在mounted中监听表格scroll事件 this.$refs.scrollTable.addEventListener( 'scroll',(event) => ...

  5. vue中指令写了一个demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. html 中手写阴影弹窗框封装

    // 弹出提示框 function popup(pWidth,content) { $("#msg").remove(); var html ='<div id=" ...

  7. vue js 手写 正则判断 手机号码 和 密码

    const phoneOrEmails = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/             if(this.ruleForms.phoneOrEmail  ==  ...

  8. Atiit 如何手写词法解析器

    Atiit 如何手写词法解析器 1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成.那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂1 1.2 ...

  9. vue中修改swiper样式

    问题 vue单文件组件中无法修改swiper样式. 解决 1,单文件组件中:新增一个style 不加scoped 让它最终成为全局样式.只在其中操作swiper的样式. <style lang= ...

  10. 实战技巧,Vue原来还可以这样写

    hookEvent,原来可以这样监听组件生命周期 1. 内部监听生命周期函数 <template> <div class="echarts"></di ...

随机推荐

  1. JavaScript字符串String方法介绍及使用示例

    实例方法 charAt() charCodeAt() 返回索引位置的字符 'hello'.charAt(0) //h 等价 'hello'.[0] //返回索引位置的字符的Unicode码点 'hel ...

  2. 生成带重复的笛卡尔乘积过程 Cartesian Product with Repetition

    目录 What is Cartesian Product with Repetition Code Demo What is Cartesian Product with Repetition 比如说 ...

  3. SAP Adobe Form 教程三 日期,时间,floating field

    前文: SAP Adobe Form 教程一 简单示例 SAP Adobe Form 教程二 表 原文标题:SAP Adobe Interactive Form Tutorial. Part III. ...

  4. JUC并发编程学习笔记(一)认知进程和线程

    进程和线程 进程 一个程序,如QQ.exe,是程序的集合 一个进程往往可以包含多个线程,至少包含一个 java默认有两个线程,GC垃圾回收线程和Main线程 线程:一个进程中的各个功能 java无法真 ...

  5. juc之ConcurrentHashMap在我工作中的实践

    Map是我工作中应用比较多的数据结构之一,主要用来存储一些kv的映射信息,如果是单线程环境下我会优先使用HashMap,但是如果在多线程环境下继续使用HashMap我不确定会不会被我老大打死,为了生命 ...

  6. WEB服务与NGINX(12)-NGINX的变量

    目录 1. nginx的变量 1.1 内置变量 1.2 自定义变量 1. nginx的变量 nginx的变量可以在配置文件中引用,作为功能判断或日志等场景使用,变量可以分为内置变量和自定义变量. 内置 ...

  7. 让AnaTraf成为您网络流量分析的最佳利器

    在快速发展的数字时代,企业对网络性能的监测与分析需求愈加旺盛.作为网络性能监测与诊断(NPMD)领域的佼佼者,AnaTraf网络流量分析仪凭借其出色的性能和易用性,正成为网络管理人员的首选工具. An ...

  8. 倒计时7天!AIRIOT新品发布会,6月6日北京见。

    随着物联网.大数据.AI技术的成熟和演进,智能物联网技术正在加速.深入渗透至各行业应用. AIRIOT物联网平台作为赋能数字经济发展和产业转型的数字基座,由航天科技控股集团股份有限公司(股票代码:00 ...

  9. anaconda3部署以及使用详解

    Anaconda3-2019.10-Linux-x86_64.sh 某次执行Python程序,其中两个错误信息如下: ImportError: libcblas.so.3: cannot open s ...

  10. Python:global、local与nonlocal变量

    1 local和global变量 先来看一个最简单的Python程序例子: import numpy as np n = 2 def func(a): b = 1 return a + b print ...