Virtualized Table 虚拟化表格--Element-plus


<script lang="ts" setup>
  import { ref,h } from 'vue'
  import {Search} from '@element-plus/icons-vue'
  const input=ref('')
  function generateRandomId(length) {  
    let result = '';  
    const characters = 'ABCDEFGHIJKLM11dsWXYZ0123456789';  
    const charactersLength = characters.length;  
    for (let i = 0; i < length; i++) {  
        result += characters.charAt(Math.floor(Math.random() * charactersLength));  
    }  
    return result;  
}  
    const columns = [
  {
    key: "id",
    dataKey: "id",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填id
    title: "预约id",//显示在单元格表头的文本
    width: 50,//当前列的宽度,必须设置
    fixed: true,//是否固定列
    class:"id_style", //添加列自定义样式
    headerClass:"id_style" //添列header列自定义样式
    
  },
  {
    key: "order_id",
    dataKey: "order_id",
    title: "预约编号",

    width: 100,
    align: "center",
  },
  {
    key: "name",
    dataKey: "name",//需要渲染当前列的数据字段,如{id:9527,name:'Mike'},则填name
    title: "用户姓名",
    width: 100,
    fixed: true,
  },
  {
    key: "id_number",
    dataKey: "id_number",
    title: "联系方式",
    width: 180,
  },
  {
    key: "department",
    dataKey: "department",
    title: "账户",
    minWidth: 100,
    width: 100,
  },
  {
    key: "create_time",
    dataKey: "create_time",
    title: "预约时间",
    width: 100,
  },
  {
    key: "end_time",
    dataKey: "end_time",
    title: "结束时间",
    width: 100,
  },
  {
    key: "release_status",
    dataKey: "release_status",
    title: "发放状态",
    width: 100,
    cellRenderer: ({ cellData }) =>
      h(
        ElTag,//这里不能写成字符串'ElTag',如果是普通的html标签如'div',则可以。
        { type: cellData == "可发放" ? "success" : "danger",
         },
        { default: () => cellData }//也可以写成字符串如'这是标签内容',但控制台会有警告
      )
  },
  
  {
    key: "resource",
    dataKey: "resource",
    title: "自习室名称",
    width: 90,
    align: "center",
    
  },

  {
    key: "tip",
    dataKey: "tip",
    title: "备注信息",
    width: 100,
    align: "center",
  },
  {
    key: "operation",
    title: "操作",
    width: 100,
    align: "center",
    cellRenderer: ({ cellData }) =>
      h(
        ElButton,//这里不能写成字符串'ElTag',如果是普通的html标签如'div',则可以。
        { type: "primary", size: "small" ,
        onClick:()=>{
            ElMessage.success("编辑成功"+cellData,)
          } 
        },
        { default: () => "编辑" },
      ),
      
  },
];



const numObjects = 15; // 假设我们想生成15个对象  
const data = Array.from({ length: numObjects }, (_, index) => ({  
  id: (index + 1).toString(),  
  name: "Mike",  
  order_id: generateRandomId(10),  
  id_number: "123456789",  
  department: "IT",  
  create_time: "2023-05-01",  
  end_time: "2023-05-02",  
  release_status: "已发放",  
  resource: `自习室${index + 1}`,  
  tip: "无"  
}));  
  
  const kls = ref<string>('')
  </script>

<template>
     <div class="search" style="margin-bottom: 15px;">
    <el-input
    v-model="input"
    style="width: 240px"
    placeholder="请输入要搜索的预约id"
    clearable

  />
  <el-button :icon="Search" circle class="btn" @click="handleClick()"/>
 </div>
    <div style="height: 600px">
      <el-auto-resizer>
        <template #default="{ height, width }">
          <el-table-v2
          :cache="5"
            :columns="columns"
            :cell-props="cellProps"
             :row-class="tableRowClassName"
            :class="kls"
            :data="data"
            :width="width"
            :height="height"
          />
        </template>
      </el-auto-resizer>
    </div>
  </template>
  
  
  
  <style>
  .hovering-col-0 [data-key='hovering-col-0'],
  .hovering-col-1 [data-key='hovering-col-1'],
  .hovering-col-2 [data-key='hovering-col-2'],
  .hovering-col-3 [data-key='hovering-col-3'],
  .hovering-col-4 [data-key='hovering-col-4'],
  .hovering-col-5 [data-key='hovering-col-5'],
  .hovering-col-6 [data-key='hovering-col-6'],
  .hovering-col-7 [data-key='hovering-col-7'],
  .hovering-col-8 [data-key='hovering-col-8'],
  .hovering-col-9 [data-key='hovering-col-9'],
  .hovering-col-10 [data-key='hovering-col-10'] {
    background: var(--el-table-row-hover-bg-color);
  }
  
  [data-key='hovering-col-0'] {
    font-weight: bold;
    user-select: none;
    pointer-events: none;
  }
  .id_style{
    background-color: rgb(241, 240, 238);
  }
  </style>

element-plus 是一个基于 Vue.js 的 UI 组件库,提供了丰富的 UI 组件供开发者使用。如果你想在 element-plus 的表格中实现树形数据虚拟化,可以按照以下步骤进行操作: 1. 首先,你需要使用 element-plus 的表格组件,并在表格中配置树形数据的相关属性。可以通过设置 `tree` 属性为 true 来启用树形数据功能,并使用 `row-key` 属性指定每一行数据的唯一标识。 2. 接下来,你可以使用 element-plus 的虚拟滚动组件(Virtual Scroll)来实现数据的虚拟化渲染。在表格中设置 `v-scroll` 属性为 true,并根据需要配置虚拟滚动的相关参数,如 `item-height`(每个子项的高度)、`start-index`(起始索引)和 `end-index`(结束索引)等。 3. 使用 element-plus 的插槽(Slot)功能来自定义树形数据的展示方式。例如,你可以使用 `<el-table-column>` 组件的 `scoped-slot` 属性来自定义每一列的内容显示,通过判断当前行数据是否是树形节点,来决定是否显示展开/折叠按钮等。 4. 最后,你可以结合 element-plus 的事件处理机制,监听用户的操作事件(如展开/折叠节点、选择节点等),并通过修改数据源中对应节点的属性来实现交互功能。 需要注意的是,以上步骤只是提供了一种实现树形数据虚拟化表格的思路,具体的实现方式可能还需要根据你的业务需求进行调整和扩展。希望对你有所帮助!如果你有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向画

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值