之前用了一下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. shell 命令 grep -v

    grep -v shell命令中,grep命令,是对文本行的搜索命令.grep -v就是反向文本行搜索. 当控制台输出很多时,有很多是我们不想看到的,就可以用到grep -v命令 举个栗子:ls -l ...

  2. Android-Version Compatibility Issues (Gradle 2.14.1 requires Android Gradle plugin 2.1.3 (or newer)) but project is using

      当AndroidStudio加载工程Project的时候,出现以上错误❌,千万不要点击,否则就是更多其他的错误:   解决方案: 1.认真翻译错误: 2.分析问题发生的原因,然后看到了 ..... ...

  3. 用NginX+keepalived实现高可用的负载均衡

    Table of Contents 1 规划和准备 2 安装 3 配置 3.1 配置NginX 3.2 配置keepalived 3.3 让keepalived监控NginX的状态 4 还可以做什么 ...

  4. ABP 框架 数据库底层迁移 Mysql 集群

    技术交流,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 背景 笔者 目前架构的IOT 项目是使用abp 框架作为后台, ...

  5. DOM LEVEL 1 中的那些事儿[总结篇-上]

    DOM是前端编程中一个非常重要的部分,我们在动态修改页面的样式.内容.添加页面动画以及为页面元素绑定事件时,本质都是在操作DOM.DOM并不是JS语言的一个部分,我们通过JAVA.PHP等语言抓取网页 ...

  6. postgresql 简单入门

    安装 https://www.postgresql.org/download/linux/redhat/yum install https://download.postgresql.org/pub/ ...

  7. JavaScript Boolean( new Boolean(false) ) 其实是true

    Boolean类型是JavaScript原始数据类型(primitive type)之一:常用来表示 真或假,是或否:这个类型只有两个值:保留字true和false 一般用于控制语句:如下 if(Bo ...

  8. 【2019北京集训2】duck 线段树优化建图+tarjan

    题目大意:给你$n$个点,第$i$个点有点权$v_i$.你需要将这$n$个点排成一排,第$i$个点的点权能被累加当且仅当这个点前面存在编号在$[l_i,r_i]$中的点,问你这些点应该如何排列,点权和 ...

  9. [原创]内网渗透JSP webSehll连接工具

    工具: JspShellExec编译: VS2012  C# (.NET Framework v2.0)组织: K8搞基大队[K8team]作者: K8拉登哥哥博客: http://qqhack8.b ...

  10. [Umbraco] 创建第一个页面

    如何创建一个页面,很简单. 进入settings,首先右键点击“Document Types”, 在出现的菜单点击"Create",在弹出的窗口中 Master Document ...