vue+element ui table组件封装,使用render渲染

后台管理经常会用到表格,一开始封装了一个常用的功能性表格,点击这里

后来由于需求增加,在表格中还会用到switch,select,input等多种组件,每次都要在html中增加<el-table-column></el-table-column>, 维护起来相当麻烦,就想到了使用render渲染。

组件内部封装代码:

<template>
  <el-table :data="tableData" size="medium" fit
            :header-cell-style="{height: ‘40px‘,padding: ‘0‘,background: ‘#f7f9fa‘,‘font-size‘: ‘12px‘,color: ‘#8590a6‘}"
            :row-style="{‘font-size‘: ‘12px‘,color: ‘#212121‘}"
            ref="multipleTable" border stripe
            @sort-change="handleSort"
            @filter-change="filterHandler"
            @row-click="handleRowClick">
    <el-table-column v-for="(th, key) in tableHeader"
                     :key="key"
                     :prop="th.prop"
                     :label="th.label"
                     :fixed="th.fixed"
                     :sortable="th.sortable?‘custom‘:false"
                     :filters="th.filters"
                     :column-key="th.columnKey"
                     :filtered-value="th.filteredValue"
                     :filter-multiple="th.filterMultiple"
                     :min-width="th.minWidth" align="center">
      <template slot-scope="scope">
        <ex-slot v-if="th.render" :render="th.render" :row="scope.row" :index="scope.$index" :column="th" />
        <span v-else>{{ scope.row[th.prop] || ‘-‘ }}</span>
      </template>
    </el-table-column>
  </el-table>
</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 {
    name: ‘comp-table‘,
    components: { exSlot },
    props: {
      // 表格数据
      tableData: {
        type: Array,
        default: function () {
          return []
        }
      },
      // 表头数据
      tableHeader: {
        type: Array,
        default: function () {
          return []
        }
      }
    },
    methods: {
      // 排序事件
      handleSort (sort) {
        this.$emit(‘sort-events‘, sort)
      },
      // 筛选事件
      filterHandler (filters) {
        this.$emit(‘filter-events‘, filters)
      },
      // 某一行被点击
      handleRowClick (row) {
        this.$emit(‘click-events‘, row)
      }
    }
  }
</script>

在模板中引用:

<template>
    <compTable
      :tableHeader="tableHeader"
      :tableData="tableData"
      @sort-events="handleSort"
      @filter-events="filterHandler"
      @click-events="handleClick"
    />
</template>

<script>
import compTable from ‘@/components/compTable‘
export default {
    components: { compTable },
    data () {
        return {       // 数据结构       tableData: [], // 为请求到的table数据
            tableHeader: [  // 表头信息,可根据minWidth修改宽度
           { prop: ‘uid‘, label: ‘订单号‘, minWidth: ‘160px‘ },
              {
                prop: ‘peopleNumber‘,
                label: ‘人数‘,
                sortable: ‘custom‘,
                minWidth: ‘75px‘
              },
              {
                prop: ‘source‘,
                label: ‘来源‘,
                filters: sourceData,
                columnKey: ‘sourceList‘,
                minWidth: ‘90px‘,
                render: (h, params) => {return h(‘span‘,params.row.source)
               }
            }
        }
    }
}
</script>                                                                                  

原文地址:https://www.cnblogs.com/puerile/p/11897356.html

时间: 2024-08-10 06:31:45

vue+element ui table组件封装,使用render渲染的相关文章

vue + element ui table表格二次封装 常用功能

因为在做后台管理项目的时候用到了大量的表格, 且功能大多相同,因此封装了一些常用的功能, 方便多次复用. 组件封装代码: <template> <el-table :data="tableData" size="medium" ref="multipleTable" border fit @sort-change="handleSort" @filter-change="filterHandler&

element ui table组件自定义合计栏,后台给的数据

合计的数据是后台传的,所以用table组件自定义一行用来合计 <el-table border fit v-loading.body="listLoading" element-loading-text="拼命加载中" :data="getChannelData" style="width: 100%" :default-sort = "{prop: 'date', order: 'descending'}&q

ivew | element ui- 关于table组件自定义sortMethod排序不生效或错误问题处理

最近项目需求需要,需要对表格列进行自定义排序,用的是iview的组件,看了文档,table 排序这部分,但是没有给出相关例子.以为不难搞的,是不难搞,就是折腾了好一会... Iview table 排序 data () { return { columns5: [ { title: 'Date', key: 'date', sortable: true, }, { title: 'Name', key: 'name' }, { title: 'Age', key: 'age', sortable

vue + element ui 阻止表单输入框回车刷新页面

问题 在 vue+element ui 中只有一个输入框(el-input)的情况下,回车会提交表单. 解决方案 在 el-form 上加上 @submit.native.prevent 这个则会阻止表单回车提交. 测试 下面的代码出现表单回车提交 <body> <div id="app"> <el-form ref="form" :model="form" label-width="80px"&

vue+element UI实现分页组件

1.前言 在web页面中,常常需要将后台查询到的数据以表格形式展示出来,而这些数据量往往会非常庞大,如果将所有要展示的数据一次性请求获取并展示到页面上,那页面长度势必会变得非常的长,很不美观.更重要的是,如果数据量过于大,在页面加载时一次性请求全部数据将会耗费大量网络资源,性能极低.但是,如果我们可以将数据分页展示,这样页面首先不会变的冗长,另外只有用户点击页码才会发出请求并且每次请求的数据量也不会很大,这就极大的节省了网络资源,提高了性能.本文就以vue结合element UI实现一个数据分页

vue.js table组件封装

table组件 和 分页组件来自iview,在这里我根据公司业务再次做了一次封装,使用slot进行内容分发,可以随意放置input输入框和button按钮 ,再使用props向子组件传递参数,使用emit属性向父组件传递事件,代码如下 <子组件> <template> <div style=""> <div class="search-bar run-search-bar" style="background:no

vue+element UI实现多级导航菜单

1.前言 在某次日常开发中,项目要求页面的导航菜单需要动态加载,即菜单不能在页面上写死,菜单上的数据由后端开发从数据库中获取返回给前端使用,前端拿到数据后再通过解析数据最终将菜单渲染出来.由于菜单有可能是多级的,所以我们需要使用递归的方式,一层一层的递归数据,将多级菜单完整显示出来.本篇博文借助element UI组件库中的Navmenu导航菜单组件,将其进行改造后封装成一个多级导航菜单组件. 2.工作流程 组件封装好之后,由父组件调用该组件,父组件先向后端发送请求获取菜单数据,然后将菜单数据传

vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、一级mockjs用法、路由懒加载三种方式

不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p>Element UI简单Cascader级联选择器使用</p> <el-cascader :options='options' v-model="selectedOptions" @change="handleChange"> </el-

vue封装element中table组件

后台系统,table被用的次数比较多,所以决定提出来作为组件 1.新建一个Table.vue文件 <!--region 封装的分页 table--> <template>  <div class="table">  <el-table id="iTable" v-loading.iTable="options.loading" :data="list" :stripe="op