封装el-table

vue3封装table表格

1.父文件

         <statefulSets
            :columns="columns"
            ref="arrangeRef"
          >
            <template v-slot:header> Deployments </template>
          </statefulSets>
   <script lang="ts">
    import { defineComponent, ref, h, watch, nextTick } from "vue";      
     const columns = [
      {
        label: 'Name',
        prop: "name",
      },
      {
        label: "Namespace",
        prop: "namespace",
      },
      {
        label: "Pods",
        prop: "podInfo",
        render: (row) => {
          return h(
            "span",
            {
              style: " cursor: pointer; display: block;padding:10px;",
            },
            `${row.podInfo.running + "/" + row.podInfo.current}`
          );
        },
      },
            {
        label: "Containers",
        prop: "containerNames",
      },
]

子组件

<template>
  <div>
    <div class="parent">
      <slot name="header"></slot>
    </div>
    <div class="custom-wrapper" style="height: 500px" v-loading="loading">
      <el-table
        :data="tableData"
        element-loading-text="拼命加载中"
        element-loading-spinner="el-icon-loading"
        style="width: 100%; height: 100%; overflow-y: auto"
        @selection-change="tableItemSelect"
        ref="tableRef"
        row-key="uid"
      >
        <el-table-column type="selection" width="55" />
        <el-table-column
          v-for="(item, i) in columns"
          :prop="item.prop"
          :key="i"
          :label="item.label"
          :sortable="item.sort ? 'custom' : false"
          :width="`${item.width}px`"
        >
          <template #default="{ row }" v-if="item.render">
            <v-nodes :render="item.render(row)" />
          </template>
          <template
            #default="{ row }"
            v-else-if="item.prop === 'containerNames'"
          >
            <el-select
              v-model="row.container"
              placeholder="Select a container"
              size="small"
              multiple
            >
              <el-option
                v-for="container in row.containerNames"
                :key="container"
                :label="container"
                :value="container"
              ></el-option>
            </el-select>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent, nextTick, onMounted, ref, watch } from "vue";
import VNodes from "@/components/cluster-management/cluster-detail/VNodes.vue";

export default defineComponent({
  name: "common-table",
  emits: ["tableItemSelect", "refreshSelection"],
  components: { VNodes },
  props: {
    columns: {
      type: Array,
      default: () => [],
    },
    url: {
      type: String,
      default: "",
    },
  },
  setup(props, ctx) {
    const tableRef = ref();

    const tableData = ref([
      {
        id: "1",
        date: "2016-05-03",
        name: "Tom",
        namespace: "No. 189, Grove St, Los Angeles",
        podInfo: {
          current: 1,
          running: 1,
        },
        containerNames: ["alertmanager", "config-reloader"],
      },
      {
        id: "2",
        date: "2016-05-02",
        name: "Tom",
        namespace: "No. 189, Grove St, Los Angeles",
        podInfo: {
          current: 1,
          running: 1,
        },
        containerNames: ["alertmanager", "config-reloader"],
      },
      {
        id: "3",
        date: "2016-05-04",
        name: "Tom",
        namespace: "No. 189, Grove St, Los Angeles",
        podInfo: {
          current: 0,
          running: 1,
        },
        containerNames: ["alertmanager", "config-reloader"],
      },
      {
        id: "4",
        date: "2016-05-01",
        name: "Tom",
        namespace: "No. 189, Grove St, Los Angeles",
        podInfo: {
          current: 1,
          running: 4,
        },
        containerNames: ["alertmanager", "config-reloader"],
      },
    ]);
    const selectValArr: any = ref([]);
    const tableItemSelect = (val) => {
      selectValArr.value = val;
      ctx.emit("tableItemSelect", selectValArr.value);
    };
    const toggleSelection = (rows) => {
      // 选中值回显
      setTimeout(() => {
        nextTick(() => {
          tableData.value.forEach((row) => {
            tableRef.value.toggleRowSelection(row, rows.includes(row.id));
          });
        });
      }, 500);
    };

    return {
      tableData,
      tableRef,
      toggleSelection,
      tableItemSelect,
    };
  },
});
</script>

<style lang="scss" scoped>
.parent {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
</style>

VNodes.vue
// 优化h函数

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
    name: "VNodes",
    props: {
        render: [Array, Object],
    },
    render() {
        return this.render;
    },
});
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值