vue基于el-table自定义table组件

Posted 今夜月色很美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue基于el-table自定义table组件相关的知识,希望对你有一定的参考价值。

自定义table组件

  <template>
    <div>
      <el-table ref="_myTb" :data="tableData" style="width: 100%">
        <template v-for="(item, index) in fieldList">
          <el-table-column v-if="typeInference(item)" v-bind="item" :key="columnKey(item, index)">
            <template slot="header" slot-scope="scope">
              <slot :name="slotName(item, 'headerScope')" :scope="scope">
                <template v-if="item.editable">
                   scope.column.label 
                  <i class="el-icon-edit-outline"></i>
                </template>
                <template v-else-if="openRtSet && item.operable">
                   scope.column.label 
                </template>
                <template v-else> scope.column.label </template>
              </slot>
            </template>
            <template slot-scope="scope">
              <template v-if="item.editable">
                <div v-if="editor(scope.row, scope.column, scope.$index)">
                  <slot :name="slotName(item)" :scope="
                    row: scope.row,
                    column: scope.column,
                    $index: scope.$index
                  ">
                    <el-input v-model.trim="scope.row[item.prop]"></el-input>
                  </slot>
                </div>
                <div v-else>
                  <i v-if="editorChangeIcon(scope.row, scope.column.property)"
                    class="el-icon-caret-left editorIcon"></i>
                  <template v-if="typeof item.formatter === 'function'">
                    <div v-html="
                      item.formatter(
                        scope.row,
                        scope.column,
                        scope.cellValue,
                        scope.index
                      )
                    "></div>
                  </template>
                  <template v-else> scope.row[item.prop] </template>
                </div>
              </template>
              <template v-else-if="item.scope">
                <slot :name="slotName(item, 'scope')" :scope="scope"></slot>
              </template>
              <template v-else-if="item.render">
                <ex-slot :render="item.render" :params="scope" />
              </template>
            </template>
          </el-table-column>
          <el-table-column v-else-if="typeInference(item, 'normal')" v-bind="item" :key="index">
            <template slot="header" slot-scope="scope">
              <slot :name="slotName(item, 'headerScope')" :scope="scope">
                <template v-if="openRtSet && item.operable">
                   scope.column.label 
                </template>
                <template v-else> scope.column.label </template>
              </slot>
            </template>
          </el-table-column>
        </template>
      </el-table>
    </div>
  </template>

  <script>
    export default 
      props: 
        tableInfo: 
          type: Object,
          default () 
            return 
          
        
      ,
      data() 
        return 
          openRtSet: false,
          fieldList: [],
          tableData: [],
        
      ,
      computed: 
        columnKey() 
          return function (item, index) 
            if (item.prop) return item.prop
            return item.type ? item.type : index
          
        ,
        typeInference() 
          return function (item, type) 
            if (item.hidden) return false
            return type ? true : item.editable || item.scope || item.render
          
        ,
        slotName() 
          return function (item, type) 
            // 默认使用 prop 作为 slot name,特殊情况没有 prop 时,使用具体类型的值
            const name = item.prop ? item.prop : item[type]
            return type === "headerScope" ? `$nameHeader` : name
          
        ,
      ,
      created() 
        let tableInfo = this.tableInfo
        // 只显示show为true的列
        const list = [...tableInfo.fieldList]
        this.fieldList = list.filter(item => 
          // boss要求所有页面操作列宽度默认 200
          if (item.type === "action") 
            item.width = item.actWidth ? item.actWidth : 200
          
          if (typeof item.show === "boolean") return item.show
          return true
        )
      ,
      methods: 
        // 获取当前表格实例,用于调用表格提供的方法
        getTbInstance() 
          return this.$refs._myTb
        ,
        // 获取当前表格数据
        getCurPageData() 
          return [...this.tableData]
        ,
        // 直接绑定表格数据数据方法
        loadData(data) 
          this.tableData = data
        ,
      
    
  </script>

测试自定义table组件

<template>
  <div>
    <my-table ref="tableInfo" :tableInfo="tableInfo" @row-click="handleSelect"></my-table>
    <button @click="getList">取消</button>
  </div>
</template>
<script>
  import MyTable from "@/components/custom/MyTable";
  export default 
    name: "TableTest",
    components: 
      MyTable
    ,
    data() 
      return 
        tableInfo: this.getTableInfo(),
        tableData: [
          date: '2016-05-02',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1518 弄'
        , 
          date: '2016-05-04',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1517 弄'
        , 
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 弄'
        , 
          date: '2016-05-03',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1516 弄'
        ]
      
    ,
    mounted() 
      this.getList()
    ,
    methods: 
      // 设置tableInfo
      getTableInfo() 
        return 
          fieldList: [
             prop: 'date', label: '日期', align: 'center', width: 120 ,
             prop: 'name', label: '姓名', align: 'center', width: 120 ,
             prop: 'address', label: '地址', align: 'center', width: 160 ,
          ],
        
      ,
      getList() 
        this.$refs.tableInfo.loadData(this.tableData)
      ,
      handleSelect(row) 
        this.$refs.tableInfo.getTbInstance().toggleRowSelection(row)
      ,
    
  ;
</script>

父组件调用子组件方法this.$refs.tableInfo.methodXXX()

父组件获取子组件原生对象实例this.$refs.tableInfo.getTbInstance(),拿到原生对象后可以调用子组件原生对象的方法

以上是关于vue基于el-table自定义table组件的主要内容,如果未能解决你的问题,请参考以下文章

vue+ element-ui el-table组件自定义合计(summary-method)坑

一文图解自定义修改el-table样式

一文图解自定义修改el-table样式

vue element-ui 动态生成el-table 自定义input input赋值问题

vue中el-table高度 动态自适应

el-table自定义表头的两种方式