封装element-ui动态表格组件(不带图片)

115 阅读1分钟

实现效果:

image.png

封装组件:

<template>
  <div>
    <el-table
      ref="multipleTable"
      v-loading="loading"
      :data="data"
      :size="size || 'medium'"
      :fit="fit || false"
      :border="border || false"
      :highlight-current-row="highlight || false"
      :header-cell-style="{height: '40px',padding: '0','font-size': '12px',color: '#8590a6'}"
      :row-style="{'font-size': '12px',color: '#212121'}"
      @sort-change="handleSort"
      @current-change="handleSingleChange"
      @selection-change="handleSelection"
    >
      <!-- 表格选择框 -->
      <el-table-column
        v-if="tableSelect"
        type="selection"
      />
      <el-table-column
        v-for="(item, key) in column"
        :key="key"
        :prop="item.prop"
        :label="item.label"
        :width="item.width"
        :align="item.align || 'center'"
        :sortable="item.sortable"
        :show-overflow-tooltip="true"
      >
        <template slot-scope="scope">
          <ex-slot
            v-if="item.render"
            :render="item.render"
            :row="scope.row"
            :index="scope.$index"
            :column="item"
          />
          <span v-else-if="item.text">{{item.text(data[scope.$index][item.prop],scope.row) || '--'}}</span>
          <span v-else>{{ scope.row[item.prop] || '--' }}</span>
        </template>
      </el-table-column>
      <!-- 操作栏插槽 -->
      <slot></slot>
    </el-table>
    <!-- 分页 -->
    <el-pagination
      v-show="isPagination && newPage.total > 0"
      :page-size.sync="newPage.limit"
      :current-page.sync="newPage.currentPage"
      :total="newPage.total"
      :background="newPage.background"
      :page-sizes="newPage.sizes"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      style="text-align: center;margin:20px 0;"
      :layout="newPage.isShowPager == true || newPage.isShowPager == undefined ? 'prev, pager, next' : 'total, sizes, prev, pager, next, jumper'"
    />
  </div>
</template>

<script>
// 自定义内容的组件
var exSlot = {
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
    column: {
      type: Object,
      default: null,
    },
  },
  render: (h, data) => {
    const params = {
      row: data.props.row,
      index: data.props.index,
    }
    if (data.props.column) {
      params.column = data.props.column
    }
    return data.props.render(h, params)
  },
}
export default {
  components: { exSlot },
  props: {
    data: Array, // 表格数据
    column: Array, // 表头数据
    loading: Boolean, // 加载效果
    isPagination: Boolean, // 是否展示分页
    isSingle: Boolean, //是否开启单选
    tableSelect: Boolean, // 是否展示表格选择框
    size: String, //table尺寸
    fit: Boolean, //列的宽度是否自撑开
    border: Boolean, //是否带有纵向边框
    highlight: Boolean, //实现高亮
    // 分页数据
    page: {
      type: Object,
      default: function () {
        return {}
      },
    },
  },
  computed: {
    newPage() {
      let resultPage = this.page ? { ...this.defaultPage, ...this.page } : this.defaultPage
      return resultPage
    },
  },
  data() {
    return {
      // page默认值
      defaultPage: {
        total: 0,
        limit: 10,
        sizes: [5, 10, 20, 30, 50],
        background: true,
        currentPage: 1,
        isShowPager: true,
      },
    }
  },
  methods: {
    // 点击表格复选框函数
    handleSelection(selection) {
      this.$emit('handleSelection', selection)
    },
    // 点击排序的函数
    handleSort(column) {
      this.$emit('handleSort', column)
    },
    // 点击单选过后的函数
    handleSingleChange(currentRow) {
      // 开启单选功能
      if (this.isSingle) {
        this.$emit('handleSingleChange', currentRow)
      } else {
        return false
      }
    },
    //点击分页切换的函数
    handleCurrentChange(val) {
      //传给父组件当前的页码对象
      this.$emit('pagination', { current: val, size: this.page.limit })
    },
    //更改一页展示多少条数据的函数
    handleSizeChange(val) {
      //传给父组件当前设置的每页展示多少条数据
      this.$emit('pagination', { current: this.page.currentPage, size: val })
    },
  },
}
</script>

引用组件:

<template>
  <dynamic-table
    :loading="loading"
    :data="dataDynamic"
    :column="column"
    :size="size"
    :page="page"
    :fit="true"
    :border="true"
    :highlight="true"
    :tableSelect="true"
    :isPagination="true"
    :isSingle="false"
    @handleSort="changeSort"
    @pagination="opportunityPage"
    @handleSelection="handleSelection"
    @handleSingleChange="handleSingleChange"
  >
    <el-table-column
      label="操作"
      width="150"
      fixed="right"
      align="center"
    >
      <template slot-scope="scope">
        <el-button
          type="text"
          size="small"
          style="font-size:14px;"
          @click="view(scope.row)"
        >查看</el-button>
        <el-dropdown @command="handleCommand">
          <span class="el-dropdown-link">
            更多<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item :command="{ key: 'edit', data: scope.row }">编辑</el-dropdown-item>
            <el-dropdown-item :command="{ key: 'delete', data: scope.row }">删除</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </template>
    </el-table-column>
  </dynamic-table>
</template>
<script>
import DynamicTable from '@/components/dxmh/DynamicTable.vue'
export default {
  components: {
    DynamicTable,
  },
  data() {
    return {
      dataDynamic: [],
      stripe: true,
      border: true,
      fit: true,
      size: 'small',
      highlight: true,
      isPagination: true,
      loading:false,
      page: {
        currentPage: 1,
        limit: 10,
        sizes: [5, 10, 20, 30, 50],
        total: 0,
        background: true,
        isShowPager: false,
      },
      tableSelect: false,
      column: [
        {
          prop: 'novel',
          label: '小说名',
          align: 'center',
          width: '180px',
          text: (text, row) => {
            return '《' + row.novel + '》' || '--'
          },
        },
        { prop: 'name', label: '主角名称', align: 'center', width: '180px' },
        {
          prop: 'totalWords',
          label: '网文字数',
          align: 'center',
          width: '180px',
          sortable:true,
          render: (h, param) => {
            let greenText = 'greenText',
              green = '#D9001B',
              elem
            elem = (
              <span class={greenText} style={{ color: green }}>
                {param.row.totalWords}万
              </span>
            )
            return elem
          },
        },
        { prop: 'dec', label: '简介', align: 'center' },
      ],
    }
  },
  mounted() {
    this.dataDynamic = [
      {
        novel: '斗破苍穹',
        name: '萧炎',
        totalWords: '532',
        dec: '讲述了天才少年萧炎在创造了家族空前绝后的修炼纪录后突然成了废人,种种打击接踵而至。就在他即将绝望的时候,一缕灵魂从他手上的戒指里浮现,一扇全新的大门在面前开启,经过艰苦修炼最终成就辉煌的故事。',
      },
      {
        novel: '完美世界',
        name: '石昊',
        totalWords: '658',
        dec: '本书男主角,为天生至尊,却被族兄石毅及其母夺取至尊骨,导致重病垂死,后被父母寄养在石族祖地。少年出大荒,登临九天,横扫帝关,创造人体秘境修炼体系,平定黑暗动乱之源,一剑独断万古为后世留下相对和平的环境后登天而去。',
      },
      {
        novel: '吞噬星空',
        name: '罗峰',
        totalWords: '477',
        dec: '小说主要讲述了地球经历一场大灾难后引发了各物种的变异,优胜劣汰,主角罗峰得到陨墨星主人传承,成为地球三强者之一,与星空吞噬巨兽一战后失去肉身,夺舍成为星空吞噬兽,在体内世界育出人类分身,之后迈出地球,走向宇宙。',
      },
    ]
    this.page.total = this.dataDynamic.length
  },
  methods: {
    opportunityPage(){},
    handleSelection(selection) {
      console.log('选中选择框触发', selection)
    },
    changeSort(column) {
      console.log('排序', column)
    },
    handleSingleChange(currentRow) {
      console.log('单选触发', currentRow)
    },
    handleCommand(data) {
      switch (data.key) {
        case 'edit':
          this.changeData(data.data)
          break
        case 'delete':
          this.deleteData(data.data)
          break
        default:
          break
      }
    },
    changeData(data) {
      console.log('编辑', data)
    },
    deleteData(data) {
      console.log('删除', data)
    },
    view(data) {
      console.log('查看', data)
    },
  },
}
</script>

封装组件参数表:

image.png

image.png

image.png

image.png

image.png