之前用了一下vue-bootstrap,感觉里面的表格组件特别好用,但是如果仅仅为了使用表格就引入bootstrap,似乎有点不划算。所以自己就试着实现了一下bootstrap里面表格的部分功能,目前只是实现了表格内容的排版和列排序功能。后面再慢慢实现更多的功能吧,比如详情框等等。

  另外说一点点个人对bootstrap的使用感受吧,它的便捷是有目共睹的,能快速搭建好项目UI,排版也很优雅好看,但是不太适用于已定好UI设计稿的项目,因为它的布局是很灵活的,在排版上,尺寸大致能遵循设计稿,但是不能较真,如果非要和设计稿保持一致,排版尺寸还原精确到1个像素的话,bootstrap的便捷性就要大打折扣了,因为会有大量的样式需要覆盖。

效果如下:

父组件需传递的数据格式如下:

      

代码如下:

<template>
<div class="d-table">
<ul class="listheader">
<li v-for="(it, key) in fields" :key="key">
<span
:class="{'up': sortField === key && sortrole > 0,'down': sortField === key && sortrole < 0}"
v-if="it.sort"
class='sort'
@click.capture="switchSort(key)"
><slot :name="key + '_H'" :data="{field: it, colum: key}">{{ $t(it.label) | cap }}</slot></span>
<span v-else><slot :name="key + '_H'" :data="{field: it, colum: key}">{{ $t(it.label) | cap }}</slot></span>
</li>
</ul>
<div class="listbody">
<div v-for="(it, i) in list" @click="rowClick(i, it)" :key="i">
<ul>
<li v-for="n in keys.length" :key="n">
<slot :name="keys[n-1]" :data="unitedata(i, it, n)">{{ it[keys[n-1]] }}</slot>
</li>
</ul>
</div>
</div>
</div>
</template> <script> export default {
props: {
items: {
type: Array,
default: () => ([])
},
fields: {
type: Object,
default: () => ({})
},
sortBy: {
type: String,
default: ''
}
},
data () {
return {
sortrole: 1,
sortField: this.sortBy,
detailshowIndex: -1
}
},
computed: {
keys () {
return Object.keys(this.fields)
},
list () {
const arr = this.items
if (this.sortField) {
const str = String(this.items[0][this.sortField]).charAt(0)
if (isNaN(str) && str !== '-' && str !== '+') {
arr.sort((x, y) => { // 当x[this.sortField]为对象时,未做判断处理
return this.sortrole * x[this.sortField].localeCompare(y[this.sortField])
})
} else {
arr.sort((x, y) => {
return this.sortrole * (x[this.sortField] - y[this.sortField])
})
}
}
const len = arr.length
for (let i = 0; i < len; i++) {
arr[i].detailShowing = false
}
return arr
}
},
mounted () {
},
methods: {
rowClick (i, it) {
this.$emit('rowClick', i, it)
},
unitedata (index, item, n) { // params: 当前行数,当前行的数据包(Object), 当前行的列数
let obj = { index, item }
obj.field = this.fields[this.keys[n - 1]]
obj.value = item[this.keys[n - 1]]
return obj
},
switchSort (key) {
let ele = event.target
while (ele.parentNode.tagName !== 'LI') {
ele = ele.parentNode
}
if (ele.classList.value.indexOf('up') > -1) {
this.sortrole = -1
} else {
this.sortrole = 1
}
this.sortField = key
}
}
}
</script> <style scoped lang="scss">
.d-table {
background-color: #fff;
padding: 10px 0;
.listheader {
border-bottom: 1px solid #b7b7b7;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
padding: 0 10px;
&>li {
font-weight: bold;
width: 16.5%;
overflow: hidden;
padding: 10px 0;
span.sort {
cursor: pointer;
position: relative;
&:before, &:after {
position: absolute;
right: -16px;
content: '';
display: inline-block;
border-right: 6px solid transparent;
border-left: 6px solid transparent;
}
&:before {
border-top: 6px solid #ababab;
top: 12px;
}
&:after {
border-bottom: 6px solid #ababab;
top: 5px;
}
&.down {
&:before {
border-top: 6px solid #21a185;
}
}
&.up {
&:after {
border-bottom: 6px solid #21a185;
}
}
}
}
}
.listbody {
&>div {
&:hover {
background-color: #f0f0f0;
}
&:first-child {
margin-top: 0;
}
ul {
padding: 0 10px;
display: flex;
justify-content: space-between;
li {
width: 16.5%;
overflow: hidden;
padding: 10px 0;
}
}
}
}
}
</style> 可能存在谬误,欢迎指正,不胜感激!

vue实用组件——表格的更多相关文章

  1. vue实用组件——圆环百分比进度条

    因为所在公司临近年底突然宣布Game Over,导致我等小码农又要踏上一个艰辛的求职道路了.才眨眼功夫,年就过完了,快乐的时光总是很匆忙呀. 开年的第一个面试,面试官问我会不会自己写一个圆环进图圈,这 ...

  2. vue实用组件——页面公共头部

    可伸缩自适应的页面头部,屏幕适应范围更广泛 效果如下: 代码如下: <template> <div class="site-header"> <div ...

  3. vue iview组件表格 render函数的使用

    如果要在标签中加入属性,例如img 中src属性 a标签中href属性 此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'c ...

  4. 应用五:Vue之ElementUI 表格Table与分页Pagination组件化

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 在平时的web项目开发过程中,列表分页查询展示应用的很频繁,为了便于阅读并减少代码的冗余,所 ...

  5. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  6. Vue.js的表格分页组件

    转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...

  7. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基 ...

  8. Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例

    Vue UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和WeUI的组件库 ...

  9. vue统计组件库和ui框架

    UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和WeUI的组件库 iview ★6634 - 基于 Vuejs 的开源 UI ...

随机推荐

  1. 创建Pods私有库

    Pods私有库创建步骤 创建私有 Spec Repo 创建Pod项目工程文件 创建podspec文件 本地测试podsspec文件 向Spec Repo提交podspec Pod库使用 更新维护pos ...

  2. AlexNet详解2

    此处以caffe官方提供的AlexNet为例. 目录: 1.背景 2.框架介绍 3.步骤详细说明 5.参考文献 背景: AlexNet是在2012年被发表的一个金典之作,并在当年取得了ImageNet ...

  3. Linux Buffer/Cache 的区别

      以前经常使用free -h命令来查看当前操作系统的内存使用情况,同时也注意过返回信息中有一列是buff/cache,来公司之前,面试官还问过我这两个的区别,当时没有回答出来,现在特意回顾记录下: ...

  4. 过滤器中获取form表单或url请求数据

    var httpFormData = filterContext.HttpContext.Request.Form; var logContent = string.Empty; //获取url的 l ...

  5. 【转】Windows Server 2016 安装 IIS 服务时提示指定备用源路径

    原文地址:http://www.codingwhy.com/view/973.html 在Windows Serever 2016中安装IIS的时候,遇到以下提示 是否需要指定备用源路径?一个或多个安 ...

  6. 【转】TOP10美国虚拟主机/网站空间推荐

    原文:http://www.laozuo.org 不同的站长用户需要不同的主机产品,并不是所有的站长, 所有的网站都想放置在VPS服务器中的.虚拟主机也有虚拟主机的方便和优势,下面为老左精选的10个比 ...

  7. js 将一个数组插入到另一个数组的方法

    JavaScript将一个数组插入到另一个数组的方法.分享给大家供大家参考.具体分析如下: 1.通过Array.prototype.push.apply方法将一个数组插入到另外一个数组,下面的代码将数 ...

  8. [翻译]Bitmap的异步加载和缓存

    内容概述 [翻译]开发文档:android Bitmap的高效使用 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently", ...

  9. Linux常用命令 - ls

    目录 Linux常用命令-ls 简介 ls -F ls -a ls -R ls -l 后记 Linux常用命令-ls 简介 ls主要用于显示文件和目录列表.作为最常见的Linux命令,大家应该都不会陌 ...

  10. 编译lua-5.3.5时出错解决方法

    问题描述: 执行 make linux test 过程出现错误,错误信息如下: “ lua.c:82:31: fatal error: readline/readline.h: No such fil ...