首页 > 其他分享 >vue之实现单击与双击、同一标签使用click实现单双击操作、不选最后一个子元素的选择器、实现返回上一级功能、根据当前id获取上级id、树形菜单单级展示、pop、not、last

vue之实现单击与双击、同一标签使用click实现单双击操作、不选最后一个子元素的选择器、实现返回上一级功能、根据当前id获取上级id、树形菜单单级展示、pop、not、last

时间:2024-03-28 18:30:31浏览次数:39  
标签:选项 菜单 name 实现 id item optionList 双击

MENU


html

<template>
    <div class="box">
        <div class="box_content">
            <p class="box_p1" @click.prevent="tabSwitch({ id: 'keyId' })">
                <span :class="[queryParam.id === 'keyId' ? 'activity' : '']">全部</span>
                <span>|</span>
            </p>
            <p class="box_p2" :class="{ activity: queryParam.id === item.id }" v-for="item in  optionList"
                :key="item.id" @click.prevent="tabSwitch(item)">
                {{ item.name }}
            </p>
        </div>

        <div class="go_back" v-if="showBackButton" @click.prevent="goBack">上一级</div>
    </div>
</template>

JavaScript

export default {
    data() {
        return {
            queryParam: {
                id: 'keyId',
                pageIndex: 1,
                pageSize: 10
            },
            optionList: [],
            previousItems: [],
            lastClickTime: 0,
            originList: [
                {
                    id: 1,
                    pId: undefined,
                    name: '一级1',
                    child: [
                        {
                            id: 2,
                            pId: 1,
                            name: '二级1'
                        }
                    ]
                },
                {
                    id: 3,
                    pId: undefined,
                    name: '一级2',
                    child: [
                        {
                            id: 4,
                            pId: 3,
                            name: '二级2',
                            child: [
                                {
                                    id: 8,
                                    pId: 4,
                                    name: '三级1'
                                }
                            ]
                        },
                        {
                            id: 100,
                            pId: 3,
                            name: '二级5'
                        }
                    ]
                },
                {
                    id: 5,
                    pId: undefined,
                    name: '一级3',
                    child: [
                        {
                            id: 6,
                            pId: 5,
                            name: '二级3'
                        },
                        {
                            id: 9,
                            pId: 5,
                            name: '二级4'
                        }
                    ]
                },
                {
                    id: 7,
                    pId: undefined,
                    name: '一级4'
                },
            ]
        }
    },
    computed: {
        showBackButton() {
            return this.previousItems.length > 0;
        }
    },
    created() {
        this.optionList = this.originList.filter(item => item.pId === undefined);
    },
    methods: {
        findParentId(tree, currentId, parentId = undefined) {
            for (let item of tree) {
                if (item.id === currentId) return parentId;
                if (item.child) {
                    let foundId = this.findParentId(item.child, currentId, item.id);

                    if (foundId !== undefined) return foundId;
                }
            }

            return undefined;
        },
        // 返回上一级
        goBack() {
            let id = this.optionList[0].id;
            id = this.findParentId(this.originList, id);

            this.optionList = this.previousItems.pop();

            this.tabSwitch({ id });
        },
        // 点击事件
        tabSwitch(item) {
            const currentTime = new Date().getTime();
            const timeDiff = currentTime - this.lastClickTime;

            this.lastClickTime = currentTime;

            if (timeDiff <= 230) {
                // 双击事件进入子菜单
                if (item.child) {
                    this.previousItems.push(this.optionList);
                    this.optionList = item.child || [];
                    // 默认请求的id
                    // 可以设置为默认第一个选项
                    // this.queryParam.id = this.optionList[0].id;
                    this.queryParam.id = 'keyId';
                    this.search();
                }
            } else {
                if (this.queryParam.id === item.id) return false;
                // 单击事件激活tabBar
                this.queryParam.id = item.id;
                this.search();
            }
        },
        search() {
            console.log('发送Ajax请求... ...', this.queryParam);
        }
    }
}

style

.box {
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 20px;

    .go_back {
        cursor: pointer;
        margin-left: 68px;
    }

    .box_content {
        display: flex;

        .box_p1 {
            display: flex;

            span:first-child {
                cursor: pointer;
            }

            span:last-child {
                margin: 0 10px
            }
        }

        .box_p2 {
            cursor: pointer;
        }

        .box_p2:not(:last-child) {
            margin-right: 10px;
        }
    }
}

.activity {
    color: #409eff;
}

解析

一个Vue.js组件,渲染一个带有标签切换功能的菜单。


模板部分
1、使用一个外层容器div.box包裹整个组件。
2、在box内部有一个box_content容器,用于容纳标签元素。
3、使用两个span元素,第一个用于显示"全部",另一个用v-for循环渲染optionList中的元素。
4、最后,如果showBackButton为true,则显示一个"上一级"的按钮。


JavaScript部分
1、在data中定义了组件的初始数据,包括queryParam对象、optionList用于存放选项列表、previousItems用于存放历史选项列表、lastClickTime用于记录上次点击时间等。
在computed中定义了showBackButton方法,用于判断是否显示返回按钮。
3、在created钩子中初始化optionList,筛选出顶级菜单选项。
4、methods中定义了两个方法
4.1、goBack用于返回上一级菜单,将当前选项列表切换为上一次点击时存储的选项列表,并重新发送请求。
4.2、tabSwitch用于处理标签切换事件。根据点击的频率来判断是单击还是双击事件。如果是双击事件且当前点击的选项有子菜单,则将当前选项列表存入previousItems中,并将选项列表切换为点击选项的子菜单。如果是单击事件,则直接切换选项并发送请求。


样式部分
使用SCSS或者LESS预处理器语法,定义了一些样式规则,包括box和box_content的布局样式,以及活动状态的样式定义。


逻辑解释
1、组件加载时,会根据originList中的数据初始化顶级菜单选项,并将其赋值给optionList。
2、点击顶级菜单的选项会触发tabSwitch方法,根据点击频率判断是单击还是双击事件。如果是双击事件且点击的选项有子菜单,则将当前选项列表存入previousItems中,并将选项列表切换为点击选项的子菜单,并发送请求。
4、单击顶级菜单选项或子菜单选项会直接切换选项并发送请求。
5、点击返回按钮会触发goBack方法,将选项列表切换为上一级菜单,并重新发送请求。


pop() 方法从数组中删除最后一个元素,并返回该元素的值。此方法会更改数组的长度。

标签:选项,菜单,name,实现,id,item,optionList,双击
From: https://blog.csdn.net/weixin_51157081/article/details/121342912

相关文章

  • 【异常】IDEA运行单元测试覆盖率统计时,出现运行 整个项目(4)时出错,配置按模块工作目录
    一、报错内容运行整个项目(4)时出错:配置按模块工作目录时将禁用‘覆盖’。只指定一个工作目录,或将测试范围更改为一个模块。二、报错说明这段文字描述了一个在运行整个项目时遇到的错误。错误信息提示说,在配置按模块工作目录时,将禁用’覆盖’。为了解决这个问题,建议......
  • husky配置实现代码提交前校验与规范提交信息
    husky是一个GitHook管理工具,主要用于实现提交前eslint校验和commit信息的规范校验。Husky的原理是让我们在项目根目录中写一个配置文件,然后在安装Husky的时候把配置文件和GitHook关联起来,这样我们就能在团队中使用GitHook了。首先,确保已经安装了husky和commitlint......
  • NVIDIA H200 创下 MLPerf LLM 最新推理记录
    NVIDIAH200TensorCoreGPU和NVIDIATensorRT-LLM创下MLPerfLLM最新推理记录生成式人工智能正在解锁新的计算应用程序,通过持续的模型创新来极大地增强人类的能力。生成式AI模型(包括大型语言模型(LLM))用于制作营销文案、编写计算机代码、渲染详细图像、创作音......
  • 【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
    在PostgreSQL中,我们可以使用SELECTDISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。1.SELECTDISTINCT语句SELECTDISTINCT语句用于从表中选择不重复的记录。如果没有指定列名,则会选择所有列。在......
  • android编译方法
    参考资料:https://blog.csdn.net/u012514113/article/details/125514512 在编译Android源码时,开始一定会初始化系统环境变量,几条熟悉的命令:sourcebuild/envsetup.shlunchxxxmake 下面是具体作用:source:用于执行一个shell脚本文件,通常用于设置环境变量或者切换到......
  • pageoffice 6 实现pdf加盖印章和签字功能
    PageOffice支持两种电子印章方案,可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章(全方位保护、防篡改、防伪造)。Word和Excel的盖章功能请参考:Word和Excel加盖印章和签字功能简易印章管理平台。PageOffice内置了简易印章管理平台功能,也称为自带电子印章,通过......
  • BOSHIDA DC电源模块的设计与制造流程
    BOSHIDADC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中,如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述: 1.需求分析:在设计DC电源模块之前,首先需要进行需求分析。这包括确定输出电......
  • ETLCloud结合Oracle实现CDC
    CDC,即Change Data Capture(变更数据捕获)功能,主要针对实时数据同步和更新场景,能够实时监测数据库中的数据变化,并将发生变化的数据进行高效精准地捕获和传输,极大地提高了数据处理的效率以及系统的响应速度。在实际应用中,CDC功能对于对数据时效性要求极高的业务场景尤为关键,例如金......
  • Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签
    1方案一:命令cd<项目目录>gitfetch--allgitfetch--tagsgitremoterenameoriginold-origin#可以不保留gitremoteaddoriginhttp://***(项目的新仓库地址)#gitremoteset-urlorigin<项目的新仓库地址>gitpushorigin--allgitpush--tags有多个分支的话......
  • uniapp小程序中onShareAppMessage(OBJECT)实现带参数的分享功能
    一、引言小程序中用户点击分享后,在js中定义onShareAppMessage处理函数(和onLoad等生命周期函数同级),设置该页面的分享信息。用户点击分享按钮的时候会调用。这个分享按钮可能是小程序右上角原生菜单自带的分享按钮,也可能是开发者在页面中放置的分享按钮(<buttonopen-ty......