Jamey's Jamey's
首页
导航站
  • 学习专栏

    • 《HTML》笔记
    • 《CSS》笔记
    • 《JavaScript》笔记
    • 《Vue》笔记
    • 《Git》笔记
    • 《规范》笔记
    • 《软技能》笔记
    • 《面试》笔记
    • 《持续集成&交付&部署》笔记
  • 踩坑专栏

    • 《Element-UI 实践系列》笔记
    • 《移动端 实践系列》笔记
    • 《综合》笔记
  • 配置专栏

    • 《环境系列》笔记
  • 极空间

    • Docker
  • 影视

    • movie
  • 编辑器笔记

    • 开发编辑器
  • 浏览器笔记

    • Chrome
  • Mac笔记

    • Mac
  • 跨界学习

    • 运营
  • 破解合集

    • 破解
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 书单
    • 关于

Jamey

首页
导航站
  • 学习专栏

    • 《HTML》笔记
    • 《CSS》笔记
    • 《JavaScript》笔记
    • 《Vue》笔记
    • 《Git》笔记
    • 《规范》笔记
    • 《软技能》笔记
    • 《面试》笔记
    • 《持续集成&交付&部署》笔记
  • 踩坑专栏

    • 《Element-UI 实践系列》笔记
    • 《移动端 实践系列》笔记
    • 《综合》笔记
  • 配置专栏

    • 《环境系列》笔记
  • 极空间

    • Docker
  • 影视

    • movie
  • 编辑器笔记

    • 开发编辑器
  • 浏览器笔记

    • Chrome
  • Mac笔记

    • Mac
  • 跨界学习

    • 运营
  • 破解合集

    • 破解
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 书单
    • 关于
  • 二次封装

  • 实践踩坑

    • Icon图标

    • Table表格

      • 动态显示列组件
        • 一. 前言
        • 二. 起步
        • 三. 实现动态显示列
      • 多列组合排序
    • Checkbox多选框

    • Message消息提示

    • Dialog对话框

    • Input输入框

    • Tree树形控件

  • 《Element-UI 实践系列》笔记
  • 实践踩坑
  • Table表格
Jamey
2021-10-15
目录

动态显示列组件

# 动态显示列组件

# 一. 前言

由于公司要做的项目想要在页面上动态控制列表中某些列的显示与隐藏,但是 element 本身的 el-table 框架是没有这个功能的,只能自己把列表封装成一个组件,方便以后使用。

# 二. 起步

Element官方的列表是这样的:

element_20

显然,这个列表是无法满足我们的需求的

先创一个建名为 FileTable 的组件,然后我们定义需要父组件传的值

<script>
  export default {
    props: {
      tableData: { // 父组件传递过来的表格数据
        type: Array,
        default: () => {
          return []
        }
      },
      tableLabel: { // 父组件传递过来的表头数据
        type: Array,
        default: () => {
          return []
        }
      }
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

引入 Element 官方的 el-table 组件:

  1. 绑定父组件传入的表格数据
  2. 循环父组件传入的表头数据 来生成 el-table-column 列
  3. v-if 绑定 show 属性控制该列是否显示
<!-- data绑定父组件传入的表格数据 -->
<el-table
  ref="filterTable"
  :data="tableData"
  :max-height="tableHeight"
  size="small"
  row-class-name="row"
  cell-class-name="column"
  :highlight-current-row="true"
  fit
  :header-cell-style="headerStyle"
  :cell-style="{'text-align':'center'}"
  @cell-click="clickRow"
  @row-dblclick="rowdblclick"
  @selection-change="SelectChange"
  >
  <el-table-column 
    :show-overflow-tooltip="true" 
    sortable 
    type="selection"
    width="45" />
  <el-table-column
    :show-overflow-tooltip="true" 
    sortable 
    type="index" 
    :index="indexMethod" 
    :cell-style="{'text-align':'center'}" 
    style="text-align:center" 
    label="ID" 
    width="85"
    ></el-table-column>

    <!-- 循环父组件传入的表头数据 -->
    <template v-for="(item, index) in tableLabel">
      <!-- v-if控制该列是否显示 -->
      <el-table-column
        v-if="item.show"
        :key="index"
        :show-overflow-tooltip="true"
        sortable
        :prop="item.prop"
        :width="item.width"
        :label="item.label"/>
  </template>
</el-table>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

然后通过 this.$emit 绑定父组件自定义事件,子组件来触发(根据个人需求定义)

<script>
  export default {
    methods: {
      // 单击选中某一行选框
      clickRow(row) {
        this.$refs.filterTable.toggleRowSelection(row)
        this.$emit('clickRow', row)
      },
      
      // 双击选中某一行
      rowdblclick(row) {
        this.$emit('rowdblclick', row)
      },
      
      // 选中一行或者多行数据
      SelectChange(val) {
        this.$emit('SelectChange', val)
      },
      
      // 翻页序号连续
      indexMethod(index) {
        return (index + 1)
      }
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

父组件传值表头数据的格式:

tableLabel: [
  { label: 'MerchantPaymentDesc', width: '', prop: 'merchantPaymentDesc', show: true },
  { label: 'storeDesc', width: '', prop: 'storeDesc', show: true },
  { label: 'TransTime', width: '', prop: 'transTime', show: true },
  { label: 'PayBarcode', width: '', prop: 'payBarcode', show: true },
  { label: 'PlatformDesc', width: '', prop: 'platformDesc', show: true },
  { label: 'TransType', width: '', prop: 'transType', show: true },
  { label: 'ResultDesc', width: '', prop: 'resultDesc', show: true },
  { label: 'TotalAmount', width: '', prop: 'totalAmount', show: true },
  { label: 'RealPayAmount', width: '', prop: 'realPayAmount', show: true },
  { label: 'CreatedOn', width: '', prop: 'createdOn', show: true }
]
1
2
3
4
5
6
7
8
9
10
11
12

到此为止,el-table 的基本功能已经封装完毕了,但需求是动态来控制这些列的显示与隐藏。

# 三. 实现动态显示列

上面已经在 el-table-column 上绑定了 show 属性通过 v-if 来控制列的显示与隐藏,接下来只需要能够控制这些 v-if 绑定的 show 属性就可以了。

我使用的的是 el-checkbox 来绑定和控制这些值

引入一个 el-dialog 弹出框 里面放上我们的 el-checkbox v-for循环 父组件传入的表头值 v-model 绑定 show 属性

<el-dialog ref="dialog__wrapper" v-dialogDrag :title="$t('message.TableColumn')" :visible.sync="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
  <el-row :gutter="20">
    <el-col
      v-for="(item, index) in tableLabel"
      :key="index"
      :span="6"
      style="height:35px"
      >
      <el-checkbox v-model="item.show">{{ item.label }}</el-checkbox>
    </el-col>
  </el-row>
  <div slot="footer" class="dialog-footer">
    <el-button type="danger" size="mini" @click="dialogFormVisible = false">{{ $t('button.cancel') }}</el-button>
  </div>
</el-dialog>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

在列表上嵌入一个按钮来触发弹出该 dialog

<el-table
  ref="filterTable"
  :data="tableData"
  :max-height="tableHeight"
  size="small"
  row-class-name="row"
  cell-class-name="column"
  :highlight-current-row="true"
  fit
  :header-cell-style="headerStyle"
  :cell-style="{'text-align':'center'}"
  @cell-click="clickRow"
  @row-dblclick="rowdblclick"
  @selection-change="SelectChange"
  >
  <el-table-column :show-overflow-tooltip="true" sortable type="selection" width="45" />
  <el-table-column :show-overflow-tooltip="true" sortable type="index" :index="indexMethod" :cell-style="{'text-align':'center'}" style="text-align:center" label="ID" width="85">
    <!-- 这个地方是新添加的按钮 -->
    <template slot="header">
      <el-button size="mini" type="" class="el-icon-s-operation" click @click="dialogFormVisible=true" />
    </template>
  </el-table-column>
  <template v-for="(item, index) in tableLabel">
    <el-table-column
      v-if="item.show"
      :key="index"
      :show-overflow-tooltip="true"
      sortable
      :prop="item.prop"
      :width="item.width"
      :label="item.label" />
  </template>
</el-table>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

OK,大功告成,接下来我们在父组件引入该组件

import FileTable from '@/components/FileTable/FileTable.vue';

export default {
  components: { FileTable }
}
1
2
3
4
5

页面上使用,绑定上我们需要的值,一行搞定~

 <FileTable id="out-table" :table-data="tableData" :table-label="tableLabel" @rowdblclick="rowdblclick" @SelectChange="SelectChange" />
1

接下来我们看看效果:

列表:(箭头指的就是我们嵌入的 button,点击弹出我们的 dialog)

element_21

然后点开,就可以通过勾选里面的复选框来控制列的显示与隐藏啦!

element_22

#Element
上次更新: 2022/07/08, 17:40:08
如何使用(第三方)图标
多列组合排序

← 如何使用(第三方)图标 多列组合排序→

Theme by Vdoing | Copyright © 2017-2023 Jamey | blog 闽ICP备19022664号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式