vue3中的el-table-column实现拖动调整列宽,并且可以保存调整后的列宽。

本文介绍了如何在Vue项目中使用el-table组件实现列宽的动态调整,并通过监听`header-dragend`事件保存调整后的宽度到本地存储。同时,展示了如何在页面加载时从本地恢复列宽配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先先把表单给写出来,我是通过循环出的表单,如果你们不是还需要按照自己的写法来改一下。

<el-table>标签中添加@header-dragend事件,用于监听列宽调整的结束事件。

<el-table
        :data="tableData"
        border
        @header-dragend="handleHeaderDragend"
    >
      <el-table-column type="selection" width="55"/>
      <el-table-column
          v-for="column in columnConfig"
          :key="column.property"
          :prop="column.property"
          :label="column.label"
          :width="column.width"
          :sortable="column.sortable"
          :show-overflow-tooltip="column.showOverflowTooltip"
      >
        <!-- 使用具名插槽来自定义 category_id 列的显示 -->
        <template v-if="column.property === 'category_id'" #default="scope">
          <el-tag>{{ scope.row.category_id }}</el-tag>
        </template>
      </el-table-column>
      <el-table-column align="right" label="操作" width="70">
        <template #default="scope">
          <el-icon class="hand-cursor mr-1" @click="handleEdit(scope.row.id)">
            <View/>
          </el-icon>
          <el-icon @click="handleDelete(scope.row.id)" class="hand-cursor">
            <Delete/>
          </el-icon>
        </template>
      </el-table-column>
    </el-table>

再写出一个被循环的数组(我没有使用TS,原因可以看我以前写的:TS已被抛弃):

这个比较简单就不多说了,只是一个被循环的数据。

const columnConfig = ref([
  // 示例列配置,你需要根据你的实际需求来设置这些值
  {property: 'name', width: 'defaultWidth', label: '资产', sortable: true, showOverflowTooltip: false},
  {property: 'category_id', width: 'defaultWidth', label: '分类', sortable: true, showOverflowTooltip: false},
  {property: 'vest_name', width: 'defaultWidth', label: '主体', sortable: true, showOverflowTooltip: false},
  {property: 'area', width: 'defaultWidth', label: '区域', sortable: true, showOverflowTooltip: true},
  {property: 'description', width: 'defaultWidth', label: '描述', sortable: false, showOverflowTooltip: true},
  {property: 'location', width: 'defaultWidth', label: '位置', sortable: false, showOverflowTooltip: true},
]);

然后,添加handleHeaderDragend方法,用于保存调整后的列宽。

const handleHeaderDragend = (newWidth, oldWidth, column, event) => {
  console.log(newWidth, oldWidth, column, event)
  const columnWidths = JSON.parse(localStorage.getItem('columnWidths')) || {};
  columnWidths[column.property] = newWidth;

  // 保存列宽度到本地存储
  localStorage.setItem('columnWidths', JSON.stringify(columnWidths));
}

接下来,在onMounted中,获取之前保存的列宽,并将其应用到相应的列上。

import {onMounted} from "vue";//一定记得要引入一下

onMounted(async () => {
  // 获取本地存储中保存的列宽度
  const columnWidths = JSON.parse(localStorage.getItem('columnWidths')) || {};

  // 遍历本地的表格列配置,将保存的列宽度应用到对应的列上
  columnConfig.value.forEach(column => {
    if (columnWidths[column.property]) {
      column.width = columnWidths[column.property];
    }
  });

  await getData()//这里是我获取列表参数的方法,需要按照自己的方式改一下!(不要全抄!)
});

目前到这里就结束了。但是如果你觉得这样对你来说有点丑,你既要可以拖动的功能,又要下面的表格不要边框。你可以在css中加入这段代码:

.el-table--border .el-table__body td,
.el-table__header th { //不要数据的边框
//.el-table--border .el-table__header th {//什么边框都不要
  //border-color: transparent;
  border-right: transparent;
  border-left: transparent;
}

Vue3中,利用Element UI库的`el-table`组件实现拖拽排序功能,通常需要结合`draggable`和`v-model`以及事件监听机制。以下是基本步骤: 1. 首先,在数据表上设置`draggable`属性,以便元素可以被拖动,同时设置`key`属性用于跟踪每个条目的唯一标识。 ```html <template> <el-table :data="tableData" :key="item.id"> <el-table-column type="index"></el-table-column> <!-- 其他... --> <el-table-column prop="sortOrder" label="排序" width="100"> <template slot-scope="scope"> <draggable v-model="scope.row" @start="dragStart(scope.$index)" @end="dragEnd(scope.$index)"> {{ scope.row.label }} </draggable> </template> </el-table-column> </el-table> </template> ``` 2. 使用自定义指令`draggable`,它需要定义`start`和`end`事件处理器。`start`处理开始拖动操作,保存当前元素的位置;`end`处理结束拖动,更新数据的顺序。 ```javascript <script setup> import draggable from &#39;vue-draggable&#39;; const dragStart = (index) => { // 当前拖动的元素索引,可以在此记录原始位置 draggedIndex = index; }; const dragEnd = (index) => { // 获取拖动后的目标位置 const targetIndex = ...; // 根据实际情况计算 // 更新数组的顺序,这里假设tableData是一个响应式数组 const temp = tableData[index]; tableData.splice(index, 1); tableData.splice(targetIndex, 0, temp); // 如果有必要,也可以同步数据库或通知其他部分更新 }; </script> ``` 3. 要确保数据模型支持实时更新,你可以选择使用`ref`、`reactive`或Vue的响应式系统。 4. 这里需要注意的是,实际项目中可能还需要处理多种情况,比如多个元素之间的交互、删除元素等,所以这个示例只是一个基础版的演示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值