实现行数据拖拽sortablejs

news/2024/7/19 14:39:17 标签: vue, js

拖拽实现参考   sortablejs中文网 sortablejs官方实现参考

需求:实现列表行拖拽,比如将列表的第二行拖动到第一行,序号不变

1-安装:

js">npm install sortablejs

2-引入:

js"> import Sortable from "sortablejs";

3-vue3+elementplus+sortablejs实现,代码如下:

保持拖拽后序号不变——最终用到了比对的方法(getRowNumber:比对当前的名称在拖拽后的数组中的序号,就修改当前序号)

详见代码具体逻辑:

js"><script setup lang="ts">
  import { nextTick, ref, computed } from 'vue';
  import type { FormInstance } from "element-plus";
  import Sortable from "sortablejs";
  const systemStore = useSystemStore();
  // 表格数据展示 默认数据
  const tableData = ref([
    '自定义1', '自定义2', '自定义3', '自定义4',
    '自定义5', '自定义6', '自定义7', '自定义8'
  ].map((name, index) => ({
    id: String(index + 1),
    name,
    showName: name,
    isShow: false
  })));

  // 拖拽之后的数组
  const dragInfoArr = ref([...tableData.value]);
  const tableDataRef = ref < FormInstance > ();
 
  // 具体逻辑1——行拖拽实现
  const rowDrop = () => {
    nextTick(() => {
      if (terminalInfoShowRef.value) {
        const tableEl = tableDataRef.value.$el.querySelector('.el-table__body-wrapper tbody');
        Sortable.create(tableEl, {
          animation: 180,
          delay: 0,
          onEnd ({ newIndex, oldIndex }) {
          //实现得到交换的数据
            let dragItem = dragInfoArr.value.splice(oldIndex, 1);
            dragInfoArr.value.splice(newIndex, 0, ...dragItem);
          },
          filter: '.disabled-drag'
        })
      }

    });
  }
  //具体逻辑2——保持索引不变  
  const getRowNumber = (name) => {
    // 在 dragInfoArr 中查找对应名字的项
    const index = dragInfoArr.value.findIndex(item => item.name === name);
    // 如果找到了对应项,则返回该项的索引值加一;否则返回 -1
    return index !== -1 ? index + 1 : -1;
  };

</script>

<template>
  <div>
          <el-table :data="tableData" :height="600" class="border border-solid border-[1px] border-[#eee]"
            ref="tableDataRef"
            :header-cell-style="{ background: 'rgba(240,243,245,0.39)',color: '#333', fontWeight: 'bold', fontSize: '12px' }"
            empty-text="暂无数据" :cell-class-name="setCellClassName" use-virtual show-overflow-tooltip
            showBodyOverflow="tooltip" showHeaderOverflow="title" tooltip-effect="light" highlight-current-row stripe
            resizable>
            <el-table-column label="序号" fixed="left" width="60">
              <template #default="scope">
                {{ getRowNumber(scope.row.name) }}
              </template>
            </el-table-column>
            <el-table-column width="60" label="显示" align="center">
              <template #default="scope">
                <el-checkbox v-model="scope.row.isShow"></el-checkbox>
              </template>
            </el-table-column>
            <el-table-column min-width="80" prop="name" label="属性" align="center" />
            <el-table-column prop="showName" label="名称" min-width="120px">
              <template #default="scope">
                <el-input v-model="scope.row.showName" style="width:140px;"></el-input>
              </template>
            </el-table-column>
            <el-table-column min-width="40" label="调整" fixed="right">
              <template #default="scope">
                <div class="p-[10px]" @mouseenter="rowDrop">
                拖动调整
                </div>
              </template>
            </el-table-column>
          </el-table>
  </div>
</template>


http://www.niftyadmin.cn/n/5459718.html

相关文章

【如何解决一些常见的 Composer 错误的保姆级讲解】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

如何注册谷歌邮箱gmail

不知道大家在工作生活中有没有需要用到谷歌邮箱的地方&#xff0c;但是最近我就用到了它。因为注册ChatGPT的事&#xff0c;用了outlook&#xff0c;hotmail邮箱注册的gpt账号都被封了&#xff0c;然后通过各方面的了解&#xff0c;发现谷歌的邮箱是没有问题的&#xff0c;不会…

公司服务器被.rmallox攻击了如何挽救数据?

公司服务器被.rmallox攻击了如何挽救数据&#xff1f; .rmallox这种病毒与之前的勒索病毒变种有何不同&#xff1f;它有哪些新的特点或功能&#xff1f; .rmallox勒索病毒与之前的勒索病毒变种相比&#xff0c;具有一些新的特点和功能。这种病毒主要利用加密技术来威胁用户&am…

以太网/USB 数据采集卡 24位16通道 labview 256K同步采样

XM7016以太网SUB数据采集卡 XM7016是一款以太网/USB高速数据采集卡&#xff0c;具有16通道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率256ksps. 16通道同步共计4.096Msps、精密前置增益放大、集成IEPE/ICP硬件支持的特点。本产品采用了多个高精度24位ADC单元…

vscode调试Unity

文章目录 vscode调试UnityC#环境需求开始调试 Lua添加Debugger环境配置联系.txt文件配置Java环境 添加调试代码断点不生效的问题 vscode调试Unity C# 现在使用vscode调试Unity的C#代码很简单&#xff0c;直接在vscode的EXTENSIONS里面搜索“Unity”&#xff0c;第一个就是&am…

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介…

C 传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值&#xff1a; #include <stdio.h> #include <time.h>void getSeconds(unsi…

【算法】归并排序(迭代法)

简介 归并排序有两种实现方法: 递归法(Top-down implementation)迭代法(Bottom-up implementation)关于归并排序的介绍请看之前的 归并排序(递归法)。 算法步骤(迭代) 设待排列序列有 n 个序列。子序列宽度为 width = 1。 将宽度为 width 的子序列每对相邻两个子序…