带你撸ElementUI + dg-table 简单的dg-table组件使用(重构版)

dg-table是一个基于ElementUI封装的表格组件
demo也已经上传在Github上了

效果图

dg-table-demo.gif

可以从 github上面拉下来
通过npm命令就能预览效果

npm install
npm run serve

在事件获取的数据可以在浏览器的控制台中查看。

在demo中你可能会发现筛选条件改变后数据没有更新,这并不是bug而是我没有处理这些数据。

用法分析

main.js

import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui'
import DGTable from 'dg-table'

import 'element-ui/lib/theme-chalk/index.css'
import 'dg-table/lib/css/index.css'

Vue.use(ElementUI)
Vue.use(DGTable)

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

因为这个表格组件是基于ElementUI开发的,所以要确保ElementUI的相关组件和样式被引进来。
然后引入dg-table组件和相关的样式。
这样你就能在全局使用dg-table组件了。

App.vue

    <dg-table
      :configs="configs"
      tableId='account'
      @filter-change="filterChange"

      :data="tableData"
      height="600"
      @row-click='rowClick'
      @selection-change="handleSelectionChange"
      stripe
      show-summary
      highlight-current-row
      :default-sort="ds"
    ></dg-table>

在代码中:configs tableId dg-table特有的属性(点击这里查看说明)

@filter-change是跟el-table公用的,在筛选的时候要做判断是来自 el-table的筛选还是来自dg-table可以通过返回的参数res.type判断 有则来自dg-table

而其余的配置跟el-table一模一样,没错你可以像使用el-table一样使用dg-table,具体的配置可以查看ElementUI table的文档

configs在demo中的代码分析

      configs: [
        {
          columnConfig: {
            type: 'index'
          }
        },
        {
          columnConfig: {
            type:"expand"
          },
          component: Expand
        },
        {
          columnConfig: {
            type: 'selection'
          }
        },
        {
          columnConfig: {
            prop: "name",
            label: "姓名",
            sortable: true
          }
        },
        {
          columnConfig: {
            prop: "gender",
            label: "性别",
            filters: [
              {text: '男', value: '1'},
              {text: '女', value: '2'}
            ],
            filterMethod: (value, row, column) => {
              const property = column['property'];
              return row[property] === value;
            }
          },
          component: Gender,
        },
        {
          columnConfig: {
            prop: "birthPlace",
            label: "出生地"
          },
          component: Address,
          filterConfig: {
            type: 'cascader',
            component: MyCascader
          }
        },
        {
          columnConfig: {
            prop: "birthDay",
            label: "出生日期"
          },
          filterConfig: {
            type: 'date',
            component: MyDatePicker
          }
        },
        {
          columnConfig: {
            prop: "phone",
            label: "手机号"
          },
          filterConfig: {
            type: 'custom',
            component: MyInput
          }
        },
        {
          columnConfig: {
            prop: "age",
            label: "年龄"
          }
        },
        {
          columnConfig: {
            prop: "createAt",
            label: "创建时间"
          },
          filterConfig: {
            type: 'date'
          }
        },
        {
          columnConfig: {
            label: '操作',
            fixed: 'right'
          },
          component: Buttons
        }
      ]

这是一个数组,数组中有几个数据就代表你表格有几个列,而每个数据就代表了你这个列的配置。

  • columnConfig:
    对应的是<el-table-column></el-table-column>组件的配置,具体查看ElementUI table中的Table-column Attributes,就demo中的典型配置我在这边把columnConfig转成<el-table-column></el-table-column>
columnConfig: {
    type: 'index'
}
// 等同与下面的代码
<el-table-column type="index">
columnConfig: {
    prop: "name",
    label: "姓名",
    sortable: true
}
// 等同与下面的代码
<el-table-column
    prop="name"
    label="姓名"
    sortable>
columnConfig: {
    prop: "gender",
    label: "性别",
    filters: [
      {text: '男', value: '1'},
      {text: '女', value: '2'}
   ],
    filterMethod: (value, row, column) => {
       const property = column['property'];
       return row[property] === value;
   }
}
// 等同与下面的代码
<el-table-column
  prop="gender"
  label="性别"
  :filters="[{text: '男', value: '1'}, {text: '女', value: '2'}]"
  :filter-method="filterHandler">

其他的属性以此类推,同样适用

  • component:
    用于自定义列,在自定义组件中可以通过props拿到,rowcolumn
    对demo 中的Gender.vue分析
<template>
  <div>
    <span
      v-if="row.gender === '1'"
      class="male">
      {{gender[row['gender']]}}
    </span>
    <span
      v-if="row.gender === '2'"
      class="female">
      {{gender[row['gender']]}}
    </span>
  </div>
</template>
export default {
  props:['row', 'column'],
  data() {
    return {
      gender: Object.freeze({
        1: '男',
        2: '女'
      })
    }
  }
}

通过拿到row判断当前列的gender值来转成
编写自定义列时只要把重点放在怎么表现列上面即可。

  • filterConfig
    这是dg-table区别与el-table的地方了,自定义筛选器的配置。
    默认提供两种类型的筛选器:
    date日期
    cascader级联
    默认的选择器样式之类的是写死的,如果要单独配置这两种选择器等下会介绍如何配置。也是属于自定义筛选器的一种,但是又有点区别。
    除了提供的默认的筛选器外还有一种custom自定义筛选器。

先来分析 默认的 date筛选器的使用

filterConfig: {
   type: 'date'
}

看起来是不是很简单呢


默认日期选择器

默认的cascader 级联筛选器

filterConfig: {
   type: 'cascader',
    props: {
      data: cities(), // 这是我内部自己定义的获取省份的函数
      myprops: {
        value: 'code',
        label: 'name',
        children: 'children'
      }
    }
}

这里面data对应的是 el-cascaderoptions属性,myprops对应的是props属性

默认级联筛选器

接下来介绍自定义这两种筛选器

自定义日期选择器:

filterConfig: {
   type: 'date',
   component: MyDatePicker
}

虽然这也是自定义筛选器,但是比较特殊,type必须为date
component就是我们自定义的筛选器

<template>
  <div>
    <dg-date-picker
      :config="config"
      type="daterange"
      align="left"
      format="yyyy 年 MM 月 dd 日"
      value-format="yyyy-MM-dd"
    >
    </dg-date-picker>
  </div>
</template>
export default {
  props:['config']
}

这里可以看到自定义日期选择器的时候 不是用el-date-picker而是用我这边包装过的日期选择器,在用法上除了要传一个props接收到的config之外其他和el-date-picker一模一样。要注意的是 其中change事件已经在dg-date-picker中实现了,用户监听change事件没什么太大意义,但是也可以监听,会合并成一个函数处理。
怎么引入dg-date-picker组件呢,在demo中main.js中定义了全局使用

// .....
import {
  DgDatePicker } from 'dg-table/lib/packages'
// .....
Vue.component(DgDatePicker.name, DgDatePicker)

这样你就能在各个地方使用了,如果要局部引入也是可以。

自定义级联选择器:

filterConfig: {
   type: 'cascader',
   component: MyCascader
}

type必须为cascader

<template>
  <div>
    <dg-cascader
    :options='options'
    :config='config'
    :props='myprops'
    ></dg-cascader>
  </div>
</template>
import {
  cities
} from '../assets/js/simulationapi.js'
export default {
  props: ['config'],
  data() {
    return {
      options: cities(),
      myprops: {
        value: 'code',
        label: 'name',
        children: 'children',
        expandTrigger: 'hover'
      }
    }
  }
}

跟日期选择器一样也是结果封装的,用法说明跟dg-date-cascader一样,除了要传一个config外其余跟el-cascader一样。
引入dg-cascader

// .....
import {
  DgCascader } from 'dg-table/lib/packages'
// .....
Vue.component(DgCascader.name, DgCascader)



还有typecustom的筛选器

filterConfig: {
   type: 'custom',
   component: MyInput
}

MyInput.vue

<template>
  <div style="padding: 10px;width:200px">
    <el-input placeholder="请输入内容" v-model="val" class="input-with-select">
      <el-button
        slot="append"
        icon="el-icon-search"
        @click="confirm">
      </el-button>
    </el-input>
  </div>
</template>
export default {
  props: ['config'],
  data() {
    return {
      val: ''
    }
  },
  methods: {
    confirm () {
      this.$emit('__CUSTOM_FILTER_DATA__', {
        value: this.val
      })
    }
  }
}

代码中在确认要筛选的处理函数上要通过

this.$emit('__CUSTOM_FILTER_DATA__', {
    value: this.val
})

来通知表格组件 你筛选来 某个条件,其中value就是在表格组件的filter-change事件中的回调函数接收参数res中的value,如果需要的话可以定义label如果没定义就拿不到值。

demo中代码的分析就到这里来。使用起来还是比较简单。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • awesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库集合 GItHub地址h...
    柴东啊阅读 10,256评论 0 5
  • 基于Vue的组件库 https://github.com/ElemeFE/element" element 饿了么...
    不和谐发光体阅读 1,133评论 0 8
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,142评论 0 1
  • 黑暗给大地披上一层神秘的沙,今夜的夜空。星星寥寥无几,圆圆的月亮挂在天空,使得夜晚更加美好而快乐。 小时踩着轻...
    快乐的一颗树阅读 180评论 0 0
  • 玩牌和人生有很多相似之处,玩牌玩出了点啥?如何从牌里看人生,得良知,有动力,思进取。 一、牌如人生 小事即大事,最...
    认识你自己吧阅读 1,902评论 1 1