vue 实现Tabs 组件自定义删除+拖拽排序功能

2023-11-10

前言:目前市面上有很多实现拖拽排序功能的插件和方法,本节不过多累述,只讲一种:vue的v-dragging内置组件

效果图:

主图:

 拖拽中的图:

 1. 安装

npm install awe-dnd --save

2. 在 main.js 文件中引入

import VueDND from 'awe-dnd'
Vue.use(VueDND)

3. v-dragging 调用

v-dragging="{ list: tabList, item: item, group: 'item' }"

4. v-dragging 参数

5. 重构带删除的Tabs组件

因为element的el-tabs组件不支持拖拽排序功能,并且该标签封装了多层嵌套div,不利于拖动排序的时候操作内部的DOM节点,所以首先重写一个带删除的Tab组件

  • 重构DOM
  • <span class="all-app" :class="{tabActiveAll:activeAllFlag}" @click="changeTab">{{$t('apps.all_app')}}</span>
    <div class=""tab-container>
        <div class="tab-box" v-for="(item, index) in categoryList" v-dragging="{ list: categoryList, item: item, group: 'item' }" :key="item.id" :class="{tabActive:currentIndex === index}" @click="changeTab(item, index)">
             // Tab标签超出长度显示el-tooltip提示  placement为提示显示位置  disabled为提示是否显示(本案例是文字长度超过了7个才显示)
             <el-tooltip class="item" effect="dark" :content="item.name" placement="right" :disabled="item.name.length < 7">
                 <div class="tab-pane"> {{item.name}}</div>
             </el-tooltip>
             // 删除图标
             <i class="el-icon-close" @click.stop="removeTab(item.id)"></i>
        </div>
    </div>
  • Data中定义数据

<script>
     export default {
         data() {
             return {
                 categoryList: [],  // Tab 数组
                 tabActive: '', // 当前点击的Tab
                 currentIndex: 0, // 当前点击的Tab索引
                 activeAllFlag: true // 是否选中全部应用
             }
         }
     }
</script>

6. methods方法中使用

Tab 自定义删除功能

   // 点击Tab
    changeTab(tab, index) {
        this.currentTabId = tab.id
        // 动态添加tabActive样式,模拟element Tab被选中,呈现下边线样式
        this.currentIndex = index
        // index为undefined时, 为点击的是全部应用
        if (index === undefined) {
            this.currentTabId = ''、
            // 动态添加tabActiveAll类名,模拟element Tab被选中,呈现下边线样式
            this.activeAllFlag = true
        } else {
            // 未点击全部应用,则动态移除当前样式
            this.activeAllFlag = false
        }
    },
    // 删除Tab标签
    removeTab(targetId) {
        let data = []
        let currentId = ''
        // 当前删除Tab ID
        this.categoryList.forEach(item => {
            if (item.id === targetId) currentId = item.id
        })
        // 调用删除接口,时时同步数据
        delTab(currentId).then(res => {
            this.$message.success('删除成功')
        })
     }

Tab 拖拽排序功能

    mounted() {
        this.$dragging.$on('dragend', () => {
            this.orderIds = []
            this.categoryList.forEach((item) => {
                this.orderIds.push(item.id)
            })
            // 推荐此种前后端交互:
             此接口交互,是将拖拽后重组的ID集合,传给接口,时时更新数据,和v-dragging 数据处理结构保存一致
            changeOrder(this.orderIds).then((res) => {
                this.$message.success('拖拽排序成功')
            })
        })
    }

7. 模拟element Tab 标签样式

<style lang="scss" scoped>
    .all-app {
        height: 48px;
        cursor: pointer;
        color: #1F2226;
        font-size: 16px;
    }
    .tabActiveAll {
        height: 47px;
        color: #526ECC;
        border-bottom: 2px solid #526ECC;
    }
    .tabActive {
        height: 48px;
        border-bottom: 2px solid #526ECC;
        .tab-pane {
            color: #526ECC!important;
        }
        .el-icon-close {
            color: #526ECC;
        }
    }
    .tab-container {
        display: flex;
        height: 50px;
        line-height: 50px;
        .tab-box {
            max-width: 140px;
            display: flex;
            margin-left: 30px;
            cursor: pointer;
            .tab-pane {
                max-width: 97px;
                height: 48px;
                cursor: pointer;
                color: #1F2226;
                font-size: 16px;
                text-align: center;
                margin-right: 7px;
                overflow: hidden;
                white-space: nowrap;
                text-overflow: ellipsis;
            }
            .el-icon-close {
                color: #1F2226;
                line-height: 51px;
            }
        }
    }
</style>

转载自:

掘金https://juejin.cn/post/7021066895478489095

end...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 实现Tabs 组件自定义删除+拖拽排序功能 的相关文章

随机推荐

  • Redis源码分析(三)—— 字典的设计与实现

    前言 字典是一种用于保存键值对的数据结构 Redis数据库使用字典做为底层实现 字典也是哈希键的底层实现之一 C语言中并没有内置字典这个数据结构 Redis自己实现了字典 以下结合源码分析Redis字典的设计与实现 源码版本 Redis 6
  • java执行linux命令:head -n 80 /dev/urandom

    看了微信小程序api后 发现登录Logo接口需要处理随机key 所以着手处理了一下 直接贴代码 先运行命令 让其生成168位随机数 private static String wxSessionkey F3UENUg3JcI31O2RpoB
  • weex实现带有跟手动画的tab栏

    在weex开发的群中看到有人提到这个问题 就想着去实现以下 还不是很完美 只支持一屏的tab栏内容 后续会进行优化 2019 6 20 更新 已支持滚动跟手 可以超出屏幕 2019 6 23 更新 解决子元素包含滚动标签时无法滑动切换的问题
  • Poppuwindow的简单使用

    继 DialogFragment的简单使用 之后 我们再来试试 Poppuwindow 的简单使用 切记 本篇博客只能保证你入门哦 适合小白学习 效果展示 1 几个常用的构造方法 public PopupWindow Context con
  • 什么是压力测试?如何进行Jmeter压力测试

    一 什么是压力测试 软件测试中 压力测试 Stress Test 也称为强度测试 负载测试 压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷 长时间或超大负荷地运行测试软件 来测试被测系统的性能 可靠性 稳定性等 常用的压力测试软
  • 因果学习论文阅读

    论文阅读 因果机器学习的前沿进展综述 Overview of the Frontier Progress of Causal Machine Learning 因果概念 提出因果旨在解决虚假相关的问题 相关只需要保持两个变量的分布相同 而因
  • python中的CSV 工具类

    CSV工具类是Python中的自带包 用来解析CSV文件 实例化一个CSV对象 需要传入一个CSV文件的路径 with open case csv as casefile csv DictReader 将CSV读取成字典的形式 rows2
  • Python练习(二)

    目录 列表元素计算 字典最大值 输出一串字符对应的Unicode值 列表基本操作 元素增加 删除 字典值求和 习题 列表元素计算 描述 从键盘输入一个列表 计算输出列表元素的平均值 请完善代码 def mean numlist s 0 0
  • opencv+matlab双目标定(python版)

    采集的图像用opencv自带程序识别不出棋盘格角点 可能是因为分辨率太低了 好在MATLAB标定工具箱可以正常使用 不过获得的标定参数导入opencv之后需要转置 记录一下官方自带实例的方法免得以后忘了 1 MATLAB标定 导入左右相机图
  • 【uniapp关联unicloud,阿里云云服务空间】unicloud本地调试服务启动失败:当前项目未关联unicloud服务空间,请调整后重新运行,已解决

    最近开发app项目 很多都是第一次上手 1 在Hbuider中运行项目 出现如下提示 2 项目根目录下已有uniCloud文件夹 3 如果云开发环境未创建 可以右击项目 选择创建uniCloud云开发环境 4 创建好的目录如下 index
  • DES 数据加密标准 结构详解

    DES Data Encryption Standard 又称数据加密标准 是一种对称加密算法 也是密码学摆脱古典流加密后最简单的一种块加密算法 由于香农与1949年提出 完善保密性 该标准要求密钥长度不短于明文长度 实际操作难以达到 因此
  • 黑白棋子问题

    黑白棋子问题 1 问题描述 两个人下棋 一方执黑棋 一方执白棋 要求双方轮流下子 给出两种情况的解决办法 1 执黑子一方先下 2 双方都可以先下 谁先抢到棋盘谁先下 2 解决 情况 1 信号量 bfg 1 wfg 0 注意信号量及初值的设置
  • 一个顽疾——QT不能包含tslib的头和库文件联合编译的解决方法

    先介绍一下我的交叉编译环境 OS是Fedora9 交叉编译器是arm linux gcc 4 3 3 arm 2009q1 其它 tslib 1 4 QT4 7 2 硬件平台Omap3530 以前我的交叉编译器使用的是arm linux g
  • Java技术之提取指定文件

    目录 序幕 详解 开发工具 简介 主线程代码 静态变量 复制指定文件的方法创建 分析并实现 在Main主线程中的使用 简单搬运 序幕 嗨嗨 我又来咯 距离上一次发布已经有了很长一段时间 问我在干嘛 我在消磨人生 直到昨天 收到了来自父亲的这
  • java content-type设置_POST请求时 content-type的设置以及参数传递

    前提 在前后端联调的时候总会牵扯到一个问题 就是参数的传递方式 GET请求就不说了 参数往url后面一拼 万事大吉 然而一到POST请求的时候 花样就来了 后端童鞋跟你说 我这个接口在postman试过是没问题的 你content type
  • centos7将python升级为3.7

    centos7将python升级为3 7
  • Java实现二叉树的遍历(递归和非递归)

    现有一颗如下图所示的二叉树 一 基本概念 1 先序遍历 深度优先遍历 前 中 后这三个词是针对根节点的访问顺序而言的 先访问根结点 再访问左子结点 最后访问右子结点 图中的二叉树的先序遍历的顺序是1 2 4 8 9 5 3 6 7 2 中序
  • DHCP详解

    DHCP简介 我们都知道一台计算机或者手机想要上网 必须要有一个IP地址 要不然别人是找不到你的 如果我们要手动配置IP的话 是非常麻烦的 因为一个IP地址要对应着一个网络 而一个网络对应一个位置 如果主机更改位置了 要重新变换IP地址 实
  • ERROR: Could not find a version that satisfies the requirement setuptools_scm (from versions: none)

    一 项目场景 在使用百度飞桨导入paddlehub包时 一直出现没有 paddlehub 包的错误 换了好几个镜像源都不行 出现以下错误 WARNING The repository located at pypi douban com i
  • vue 实现Tabs 组件自定义删除+拖拽排序功能

    前言 目前市面上有很多实现拖拽排序功能的插件和方法 本节不过多累述 只讲一种 vue的v dragging内置组件 效果图 主图 拖拽中的图 1 安装 npm install awe dnd save 2 在 main js 文件中引入 i