基于element-ui组件二次封装篇(4)-table组件2(其他功能)

452 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

写在前面的话

上篇文章讲解了关于element-ui的table组件的二次封装,但只完成了基本功能。本文讲完成其他的功能。

本项目基于vue3.0+ts,基于element-ui

功能开发

多选功能

image.png

在父组件配置项数据中定义一个selection选项标志是否展示多选。

子组件对其进行判断后展示一列多选框列表,后再增加一个selection-change事件,当选中触发,则提交给业务组件。开发如下:

子组件:

image.png

image.png

父组件:

image.png

自定义列模板

image.png

表格中不仅需要涉及到普通数据展示,也可能存在需要自定义列模板的情况。我们可以通过slot插槽的方式实现

首先在业务组件的配置项数据结构增加一个type字段表示自定列模板的情况,可定义为“slot”,再增加一个slot_name的字段,定义插槽名。

image.png

业务组件模板代码如下:

image.png 子组件对应代码如下:

image.png

展开行

image.png

关于展开行的开发同自定义列表的功能开发是一致的,也是利用插槽即可实现。在业务组件的配置项数据定义type为expand,在自定义一个slot_name,然后在子组件中判断expand后展示展开行即可。

业务组件:

image.png

image.png 子组件:

image.png

是否展示序号,是否展示边框,斑马纹等

这些配置起来就更简单了,只需要在父组件传入时定义好,然后子组件接收,并做好判断展示即可。

父组件开发

image.png

子组件:

image.png

image.png

其他的如是否排序,是否需要加状态均同理。

table组件代码

<template>
  <el-table 
      :data="data" style="width: 100%" 
      :stripe="stripe" 
      :border="border"
      @selection-change="handleSelectionChange"
      >
     <el-table-column v-if="selection" type="selection" width="55" />
    <el-table-column v-if="index" type="index"/>
    <template v-for="(item) in form" :key="item.props">
    <el-table-column  v-if="item.type=='slot'"
      :prop="item.props" 
      :label="item.label" 
      :width="item.width?item.width:''"
      :sortable="item.sortable" >
      <template #default="scope">
          <slot :name="item.slot_name" :data="scope.row"></slot>
      </template>
      </el-table-column>
      <el-table-column  v-else-if="item.type=='expand'"
      type="expand"
      :prop="item.props" 
      :label="item.label" 
      :width="item.width?item.width:''"
      :sortable="item.sortable" >
      <template #default="props">
          <slot :name="item.slot_name" :data="props.row"></slot>
      </template>
      </el-table-column>
    <el-table-column  v-else 
      :prop="item.props" 
      :label="item.label" 
      :width="item.width?item.width:''"/>
    </template>
  </el-table>
</template>
​
<script  setup>
import {defineProps,defineEmits} from "vue";
 const props=defineProps({
  form: Array, // 表格数据结构:props:prop字段,label:label字段,type类型区分('slot':自定义插槽,'expand':展开行),slot_name:当type有值时的插槽名,sortable:是否排序
  data:Array, //数据源
  stripe:Boolean, //是否需要斑马纹,默认否
  border:Boolean,//是否需要边框,默认否
  selection:Boolean,//是否需要多选,默认否
  index:Boolean//是否需要排序,默认否
});
const emit = defineEmits(['multipleSelection'])
//多选触发
const handleSelectionChange = (val) => {
     emit('multipleSelection',val);
}
console.log(props.form)
</script>

总结

自此,一个基于element-ui的table组件的二次封装基本完成,在开发中需要涉及的功能大概也就这些,其他的思想也是大同小异。