zoukankan      html  css  js  c++  java
  • 基于element table的二次封装

    <!--region 封装table-->
    <template>
      <div class="table">
        <el-table
          id="iTable"
          :data="data"
          ref="mutipleTable"
          @selection-change="handleSelectionChange"
          v-loading="isLoad"
          element-loading-text="数据正在加载中..."
          :show-summary="isShowSummary"
          :empty-text="emptyText"
          :border="border"
        >
          <!--region 数据列-->
          <template v-for="column in columns">
            <template v-if="column.type">
              <el-table-column
                :type="column.type"
                :key="column.label"
                :label="column.label"
                :align="column.align"
                :width="column.width"
              ></el-table-column>
            </template>
            <template v-else>
              <el-table-column
                :prop="column.prop"
                :key="column.label"
                :label="column.label"
                :align="column.align"
                :width="column.width"
              >
                <template slot-scope="scope">
                  <slot
                    :scope="scope.row"
                    v-if="column.slot"
                    :name="column.slot"
                    :row="scope.row[column.slot]"
                  />
                  <span v-else>{{ scope.row[column.prop] }}</span>
                </template>
              </el-table-column>
            </template>
          </template>
          <!--endregion-->
        </el-table>
      </div>
    </template>
    <!--endregion-->
    <script>
    export default {
      props: {
        // 数据列表
        data: {
          type: Array,
          default: [],
        },
        // 需要展示的列 === prop:列数据对应的属性,label:列名,align:对齐方式,width:列宽, // table 表格的控制参数
        columns: {
          type: Array,
          default: [],
        },
        //是否加载
        isLoading: {
          type: Boolean,
          default: false,
        },
        //是否在表尾显示合计行
        isShowSummary: {
          type: Boolean,
          default: false,
          require: false,
        },
        //emptyText
        emptyText: {
          type: String,
          default: "暂无数据",
          require: false,
        },
        //是否带边框
        border: {
          type: Boolean,
          default: false,
          require: false,
        },
        //选择方式(仅用于多选时)
        type: {
          type: String,
          default: "select",   //select:多选    radio:单选
          require: false,
        },
      },
      // 数据
      data() {
        return {
          pageIndex: 1,
          multipleSelection: [], // 多行选中
          isLoad: this.isLoading,
        };
      },
      watch: {
        isLoading: function (val, old) {
          this.isLoad = val;
        },
      },
      methods: {
        // 多行选中
        handleSelectionChange(val) {
          this.multipleSelection = val;
          this.$emit("result", val);
        },
      },
    };
    </script>

    使用场景:

    <script>
    import Table from "@/components/Table";
    export default {
        components: {
        Table,
      },
        data() {
        return {
          projectList: [], //项目列表
          projectListCloumn: [
            {
              type: "index",
              label: "序号",
            },
            {
              prop: "name",
              label: "工程项目或者费用名称",
            },
            {
              prop: "projectType",
              label: "项目类型",
              slot: "projectType",
            },
            {
              prop: "amount",
              label: "概算总价(万元)",
            },
            {
              prop: "purchaseType",
              label: "采购形式",
              slot: "purchaseType",
            }
          ],
        };
      },
    }
    </script>
        <Table :data="projectList" :columns="projectListCloumn">
              <template slot="projectType" slot-scope="scope">
                <el-select v-model="scope.scope.projectType" placeholder="请选择">
                  <el-option
                    v-for="item in projectTypes"
                    :key="item.value"
                    :label="item.text"
                    :value="item.value"
                  >
                  </el-option>
                </el-select>
              </template>
              <template slot="purchaseType" slot-scope="scope">
                <el-select v-model="scope.scope.purchaseType" placeholder="请选择">
                  <el-option
                    v-for="item in purchaseTypes"
                    :key="item.value"
                    :label="item.text"
                    :value="item.value"
                  >
                  </el-option>
                </el-select>
              </template>
              <template slot="option" slot-scope="scope">
                <i class="el-icon-document font-purple"
                  ><span @click="save(scope.scope.id)">查看</span></i
                >
                <i class="el-icon-document font-purple"><span>启动</span></i>
                <i class="el-icon-document font-purple"><span>编辑</span></i>
                <i class="el-icon-delete font-red"><span>删除</span></i>
              </template>
            </Table>

    如果不需要自定义列内容,只是想单纯展示的话,在定义列的时候就不需要定义slot,直接定义prop及lable就好

    然后在页面中直接使用封装的组件就好,代码如下

    <Table :data="projectList" :columns="projectListCloumn"></Table>

    注:1、template 中的slot值一定要跟列定义中的slot值一样,不然无法对应匹配

      2、slot-scope中的scope值实际包含row及scope,但是真正的列表行数据在scope中,所以如果想取当前行数据的话,一定要通过scope.scope来取值,不然就修改table封装中的scope值

  • 相关阅读:
    VB6:从Comctl.dll中加载TREEVIEW并美化OCX版本(修正)
    一个围猫的小游戏
    从RES文件中直接加载JPG的函数
    Vistaform Control v1.40正式发布(下载)
    比CopyMemory还要快的函数SuperCopyMemory
    VB开发日志:做按钮时顺便做的颜色调整工具
    魔兽按键精灵 V2.0(修正1)
    魔兽按键精灵准备开发3.0版本
    VB高级编程之:完全子类化模仿OFFICE2007按钮
    VB:我的进度条Diy
  • 原文地址:https://www.cnblogs.com/xiaoxiaomini/p/14744087.html
Copyright © 2011-2022 走看看