Vue3封装el-table组件

<div class="table-content">
    <el-table
        :data="tableData" :border="border"
        @row-click="handleRowClick"
        fix style="width: 100%"
    >
      <!-- 多选 -->
      <el-table-column v-if="selectionIsNeed" type="selection" width="55"></el-table-column>
      <template v-for="item in columns">
        <!-- 判断文本类 -->
        <el-table-column
            v-if="item.type === 'text'"
            :prop="item.prop"
            :label="item.label"
            :header-align="item.headerAlign"
            :align="item.align"
            :min-width="item.minWidth">
          <template #default="scope">
            <span v-if="scope.row[item.prop]">{{ scope.row[item.prop] }}</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <!-- 判断自定义文本类 -->
        <el-table-column
            v-if="item.type === 'customText'"
            :label="item.label"
            :header-align="item.headerAlign"
            :align="item.align"
            :min-width="item.minWidth">
          <template #default="scope">
            <slot name="customText" :scope='scope'></slot>
          </template>
        </el-table-column>
        <!-- 判断tag状态类 -->
        <el-table-column
            v-if="item.type === 'tag'"
            :prop="item.prop"
            :label="item.label"
            :header-align="item.headerAlign"
            :align="item.align"
            :min-width="item.minWidth">
          <template #default="scope">
            <slot name="tag" :scope='scope'></slot>
          </template>
        </el-table-column>
        <!-- 判断button按钮类 -->
        <el-table-column
            v-if="item.type === 'button'"
            :prop="item.prop"
            :label="item.label"
            :header-align="item.headerAlign"
            :align="item.align"
            :min-width="item.minWidth">
          <template #default="scope">
            <slot name="button" :scope='scope'></slot>
          </template>
        </el-table-column>
      </template>

      <!-- 操作 -->
      <el-table-column
          v-if="isOptionNeed"
          :width="optionWidth"
          fixed="right"
          label="操作"
          header-align="center"
          align="center">
        <template #default="scope">
          <slot name="default" :scope='scope'></slot>
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页 -->
    <div class="pagination-container">
      <el-pagination
          v-if="isPaginationNeed"
          :current-page="currentPage"
          :page-size="pageSize"
          :total="total"
          @current-change="handleCurrentChange"
          layout="total, prev, pager, next">
      </el-pagination>
    </div>
</div>
<script setup>
import {defineComponent} from 'vue';

defineComponent({
  name: 'Table'
})

const emits = defineEmits(['rowClick'])
const props = defineProps({
  border: {
    type: Boolean,
    default: false
  },
  columns: {
    type: Array
  },
  tableData: {
    type: Array,
    default: () => []
  },
  selectionIsNeed: {
    type: Boolean,
    default: false
  },
  // 操作栏是否需要
  isOptionNeed: {
    type: Boolean,
    default: true
  },
  // 分页是否需要
  isPaginationNeed: {
    type: Boolean,
    default: true
  },
  // 操作栏宽度
  optionWidth: {
    type: String,
    default: '180px'
  },
  currentPage: {
    type: Number,
    default: 1
  },
  pageSize: {
    type: Number,
    default: 10
  },
  total: {
    type: Number,
    default: 0
  }
})

const handleRowClick = (row) => {
  emits('rowClick', row)
}

const handleCurrentChange = (val) => {
  emits('currentChange', val)
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__潇湘夜雨__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值