table行拖拽并改变数组顺序及列表拖动

话不多说代码复制直接运行看效果

一、table行拖拽并改变数组顺序

<template>
  <el-table :data="dataList" style="width: 100%" :row-class-name="activeClass" class="outputTable">
    <el-table-column prop="id" label="ID" width="120" />
    <el-table-column prop="name" label="Name" width="120" />
    <el-table-column prop="date" label="Date" width="120" />
    <el-table-column prop="address" label="Address" />
    <el-table-column label="操作1">
      <template #default="$index">
        <el-button link type="primary" @click="tuozuai($index)">
            点击后拖拽排序
        </el-button>
      </template>
    </el-table-column>
    <el-table-column label="操作2">
        <template #default="$index">
          <el-button link @mouseenter="enableDrag($index)" @mouseleave="disableDrag($index)">
            鼠标悬停拖拽排序
          </el-button>
        </template>
    </el-table-column>
  </el-table>
</template>
<script lang="ts" setup>
import { nextTick, ref } from 'vue';
const dataList = ref<any>([
  {
    id:'1',
    date: "2024-07-01",
    name: "Name1",
    address: "贵州省",
  },
  {
    id:'2',
    date: "2024-07-02",
    name: "Name2",
    address: "贵州省",
  },
  {
    id:'3',
    date: "2024-07-03",
    name: "Name3",
    address: "重庆市",
  },
  {
    id:'4',
    date: "2024-07-04",
    name: "Name4",
    address: "重庆市",
  },
]);
const dragIndex = ref<any>();
const newDragIndex = ref<any>();
const activeClass = ({ row, rowIndex }) => {
  if (rowIndex === newDragIndex.value) {
    return "isDragBox active-drag";
  }
  return "isDragBox";
};
const dragStartItem = (idx) => {
  dragIndex.value = idx;
};
const dragOverItem = (index) => {
  newDragIndex.value = index;
};
const dragEndItem = () => {
  const data =  dataList.value[dragIndex.value];
  dataList.value.splice(dragIndex.value, 1);
  dataList.value.splice(newDragIndex.value, 0, data);
  dataList.value.forEach((item, index) => {
    return (item.sort = index);
  });
};
const handleSort = ( j = "", istrue =true) => {
  nextTick(() => {
    const dragBox = document.querySelectorAll(".outputTable .isDragBox");
    dragBox.forEach((i: any, idx) => {
    if(istrue){
      i.setAttribute("draggable", "true");
      i.ondragstart = () => dragStartItem(idx);
      i.ondragover = () => dragOverItem(idx);
      i.ondragend = () => dragEndItem();
      }
      else{
       i.setAttribute("draggable", "false");
       }
    });
  });
};
//鼠标点击 “点击后拖拽排序”后拖动
const tuozuai=(num)=>{
handleSort()
};
// 鼠标悬停启用拖拽
function enableDrag(a) {
handleSort(a)
};
// 鼠标离开禁用拖拽
function disableDrag(a) {
 handleSort(a, false)
};
</script>

运行后页面

二、列表拖动

<template>
  <ul>
    <li
      v-for="(item, index) in list"
      :key="item.id"
      :ref="setDraggableRef"
      @dragstart="dragStart(index)"
      @dragover.prevent
      @dragenter="dragEnter(index)"
      @dragend="dragEnd"
      draggable="true"
    >
      {{ item.text }}
    </li>
  </ul>
</template>
 
<script>
import { ref, reactive, onMounted } from 'vue';
 
export default {
  setup() {
    const list = reactive([
      { id: 1, text: 'Item 1' },
      { id: 2, text: 'Item 2' },
      { id: 3, text: 'Item 3' },
      // ...
    ]);
 
    const draggableRefs = ref([]);
 
    const dragData = reactive({
      draggedIndex: null,
      hoverIndex: null,
    });
 
    const setDraggableRef = (el, index) => {
      if (el) {
        draggableRefs.value[index] = el;
      }
    };
 
    const dragStart = (index) => {
      dragData.draggedIndex = index;
    };
 
    const dragEnter = (index) => {
      dragData.hoverIndex = index;
    };
 
    const dragEnd = () => {
      if (dragData.draggedIndex !== null && dragData.hoverIndex !== null) {
        const draggedItem = list[dragData.draggedIndex];
        list.splice(dragData.draggedIndex, 1);
        list.splice(dragData.hoverIndex, 0, draggedItem);
      }
      dragData.draggedIndex = null;
      dragData.hoverIndex = null;
    };
 
    onMounted(() => {
      // 确保所有的列表项都是可拖动的
      draggableRefs.value.forEach((el) => {
        el.draggable = true;
      });
    });
 
    return {
      list,
      setDraggableRef,
      dragStart,
      dragEnter,
      dragEnd,
    };
  },
};
</script>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 关于Element UI中表格拖动改变顺序的问题,您可以通过设置"sortable"属性来实现该功能。具体操作可以参考Element UI官方文档中关于表格列排序的部分。在该部分中,提供了相应的API和示例代码,供您参考和使用。 ### 回答2: Element UI是一个基于Vue.js的桌面端UI框架,提供了丰富的组件供开发者使用。其中,Element UI的表格组件提供了列拖动改变顺序的功能。 在使用Element UI的表格组件时,我们可以通过设置`border`属性为true来开启列边框,然后在表头的每一列右侧会出现一个可拖动的图标。当鼠标放置在该图标上并按住鼠标左键时,可以通过拖动列的边界来改变列的顺序。 具体操作时,我们需要在表格的`el-table-column`标签上设置`resizable`属性为true,使列可调整大小。然后,当拖动列边界时,Element UI会自动更新表格的列顺序,并触发相应的事件。 如果需要对列的顺序保存和恢复,可以在拖动结束时,通过获取表格的`columns`属性来获取当前的列顺序,并将其保存到后端或本地缓存中。当需要恢复列顺序时,再将保存的列顺序传递给表格的`columns`属性,即可恢复原先的列顺序。 需要注意的是,除了改变列的顺序Element UI的表格组件还提供了很多其他的功能,比如排序、筛选、分页等,都可以通过相应的属性和事件进配置。通过灵活使用这些功能,可以让表格更加适应实际需求。 综上所述,Element UI的表格组件提供了列拖动改变顺序的功能,并且还支持其他丰富的表格操作。开发者可以根据实际需求进配置,使表格具备更好的用户体验和功能扩展性。 ### 回答3: Element UI 提供了一个非常方便的列拖动功能,可以通过拖动表格列来改变它们的顺序。 在使用 Element UI 的 Table 组件时,需要将列定义在 columns 数组中。在列定义中,通过设置 `resizable` 属性为 true 来启用列拖动功能。 ```html <template> <el-table :data="tableData" style="width: 100%"> <el-table-column v-for="column in columns" :key="column.label" :prop="column.prop" :label="column.label" :resizable="true" ></el-table-column> </el-table> </template> ``` 在上面的代码中,`columns` 是一个包含列定义的数组,每个列定义将包含一个 `label` 属性来指定列的标题,以及一个 `prop` 属性来指定列的数据字段。通过在每个列定义中设置 `resizable` 属性为 true,可以启用列拖动功能。 现在,当用户在页面上拖动表格列时,它们可以自由调整它们的顺序。用户可以将某个列拖动到其他列的前面或后面,从而改变它们的顺序。 这就是如何使用 Element UI 的列拖动功能来改变表格列的顺序。它非常简单易用,提供了良好的用户体验,使用户可以轻松自定义表格布局。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值