当前位置: 首页 > 知识库问答 >
问题:

javascript - table如何分组拖拽排序?

夏嘉德
2024-10-11

请教大佬们个问题,vue2中我有一个基础的el-table表格,表格里分置顶区域和非置顶区域,需求是置顶区域之间可以互相拖拽排序,非置顶区域可以互相拖拽排序,非置顶和置顶之间不可拖拽排序,

比如1.2.3条数据是置顶的,可以互相拖拽排序,4.5.6是非置顶数据,可以拖拽排序,但1.2.3和4.5.6之间不可互相拖拽,感谢各位大佬解惑

共有1个答案

谈琛
2024-10-11

要实现您所描述的表格分组拖拽排序功能,您可以使用一些前端库,如 Sortable.js 或者 Vue.Draggable(如果您在使用Vue.js)等,这些库提供了强大的拖拽排序功能。以下是一个基于 Sortable.js 的实现思路,因为它是一个轻量级的JavaScript库,适用于大多数场景。

步骤 1: 引入 Sortable.js

首先,您需要在您的项目中引入Sortable.js。您可以通过CDN或npm来安装。

<!-- 通过CDN引入Sortable.js -->
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/dist/sortable.min.js"></script>

步骤 2: 准备HTML结构

假设您的表格HTML结构如下:

<table id="myTable">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Is Sticky</th>
        </tr>
    </thead>
    <tbody>
        <tr data-group="sticky">
            <td>1</td>
            <td>Item 1</td>
            <td>Yes</td>
        </tr>
        <tr data-group="sticky">
            <td>2</td>
            <td>Item 2</td>
            <td>Yes</td>
        </tr>
        <tr data-group="non-sticky">
            <td>3</td>
            <td>Item 3</td>
            <td>No</td>
        </tr>
        <!-- 更多行... -->
    </tbody>
</table>

注意,这里使用 data-group 属性来区分置顶和非置顶的行。

步骤 3: 使用Sortable.js初始化拖拽排序

接下来,使用Sortable.js初始化拖拽排序,但需要分别处理置顶和非置顶的行。

// 初始化置顶区域的拖拽排序
var stickyList = document.querySelectorAll('tr[data-group="sticky"]');
Sortable.create(stickyList, {
    group: "sticky",
    animation: 150,
    onEnd: function (/**Event*/evt) {
        // 拖拽结束后的回调,可以用来更新数据等
        console.log('Sticky item moved!');
    }
});

// 初始化非置顶区域的拖拽排序
var nonStickyList = document.querySelectorAll('tr[data-group="non-sticky"]');
Sortable.create(nonStickyList, {
    group: "non-sticky",
    animation: 150,
    onEnd: function (/**Event*/evt) {
        // 拖拽结束后的回调
        console.log('Non-sticky item moved!');
    }
});

// 注意:由于Sortable.js默认不支持跨列表拖拽,上面的分组设置确保了置顶和非置顶区域之间不能互相拖拽

然而,这里有个小问题:Sortable.js通常用于列表(如<ul><ol>),而不是表格行(<tr>)。对于表格,您可能需要考虑使用其他库(如Vue.Draggable在Vue中,或实现自定义的拖拽逻辑),或者将表格行转换为可拖拽的列表项,并在拖动后更新表格的DOM。

如果您想要继续使用表格形式并希望保持结构不变,可能需要寻找或编写一个更适用于表格的拖拽库,或者采用一些DOM操作技巧来模拟拖拽效果。

替代方案

如果Sortable.js不完全符合您的需求,您还可以考虑使用像jQuery UI的Sortable插件(虽然它也不再是官方维护的重点),或者完全自定义拖拽逻辑,使用HTML5的拖放API (dragdrop 事件) 来实现。

 类似资料:
  • Sortable 怎么实现 拖拽列 不拖拽行 比如我把 value11 拖拽到 value22 的位置 最后结果如图 拖拽元素和目标元素交换位置 最后结果

  • 本文向大家介绍jqueryUI里拖拽排序示例分析,包括了jqueryUI里拖拽排序示例分析的使用技巧和注意事项,需要的朋友参考一下 示例参考http://jsfiddle.net/KyleMit/Geupm/2/  (这个站需要FQ才能看到效果) 其实是jqueryUI官方购物车拖拽添加例子的增强版,就是在拖拽的时候增加了排序 这个是html代码   这个是js代码主要在js代码中红色代码部分设置

  • 本文向大家介绍举例说明js如何拖拽排序?相关面试题,主要包含被问及举例说明js如何拖拽排序?时的应答技巧和注意事项,需要的朋友参考一下 可能和 @HCLQ 说的思路差不多

  • 功能是切换上面checkbox,生成底下的标签,底下的标签可以拖拽排序。现在的问题是对底下的标签进行拖拽排序之后,上面的checkbox再切换,会对顺序进行重新排列。怎么实现切换上边的checkbox,不对底下的标签产生影响?

  • 本文向大家介绍针对后台列表table拖拽比较实用的jquery拖动排序,包括了针对后台列表table拖拽比较实用的jquery拖动排序的使用技巧和注意事项,需要的朋友参考一下 现在很多后台列表为了方便均使用拖拽排序的功能,对列表进行随意的排序。 话不多说 ,我在网上找了一些demo,经过对比,现在把方便实用的一个demo列出来,基于jqueryUI.js 先上html代码,很简单: 复制代码 复制

  • 本文向大家介绍vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序,包括了vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序的使用技巧和注意事项,需要的朋友参考一下 vue拖拽克隆clone组件API, vue.draggable实现盒子之间相互拖拽排序克隆(网上资源整理的文档) 效果图: -----------------