Vue项目-三级联动的路由跳转与传参

news2024/12/23 5:43:30

三级联动组件的路由的跳转与传参

三级联动,用户可以点击的:一级分类、二级分类和三级分类
以商城项目为例,Home模块跳转到Search模块,以及会把用户选中的产品(产品名字、产品ID)在路由跳转的时候,进行传递。

路由跳转
声明式导航:router-link
编程式导航:push | replace

  • 声明式导航

  • router-link 来替换a标签跳转(不推荐)
    在这里插入图片描述

  • 但是当鼠标进入三级联动,上下滑动的时候,会出现卡顿现象
    原因:router-link是一个组件,当服务器的数据返回后,循环出很多router-link组件创建实例1000+,创建组件实例的时候,一瞬间创建很多组件很耗内存,因此出现卡顿现象。

  • 编程时导航(常使用)

  • 绑定点击事件
    在这里插入图片描述

  • 点击事件一个方法
    在这里插入图片描述

  • 点击确实能够实现跳转,而且没有卡顿的现象。

  • 但是这种方法也不是最好的
    原因是:因为每一个a标签都绑定了一个@click函数,因为这个三级联动,要循环,可能会有1000+次,所以相当于绑定1000+@click回调函数,那么1000个回调函数。

  • 事件委派+编程式导航(最佳方法)
    事件委派:把原来加给子元素身上的事件绑定在父元素身上,就是把时间委派给父元素。比如说,鼠标点击事件,本来页面上有很多的鼠标点击事件,需要一个个的去写实现函数,但是如果你把鼠标点击事件交给上司来完成,那么就是鼠标点击那里的时候,就相当于上司找对应的下属来完成此事件,而不像前面一个个的去找实现函数。

<ul id="ul1" >
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
如果给每个li添加点击事件:
var li=document.getElementsByTagName('li');
function A(){
    alert(li.innerHTML);
};
li.click=A;

但是事件委派有两个弊端:很耗费资源;如果后期动态添加li,不会拥有这个弹出事件。
事件委派+编程式导航 实现三级联动

  1. 利用事件的委派
    在三级联动的父元素的div绑定一个@click=“goSearch”
<!-- 利用事件委派和编程式导航实现路由跳转和传参-->
<div class="all-sort-list2" @click="goSearch">

methods这样写:

methods:{
   goSearch(){
     this.$router.push('/search');
   }
}

此时实现了跳转search的效果。
但是新问题:第一个问题:怎么知道点击的是a标签?因为三级联动父div里面有a,h3,dt,dl,是把全部子节点的事件委派给父亲节点。第二个问题:即使能确定点击的是a标签,如何区分点击的是一级、二级、三级的a标签?
event是事件对象,可以获取到当前触发事件的节点
解决方法: 把子节点当中a标签,加上自定义属性data-categoryName,其余的子节点是没有的;一级、二级、三级分类的a标签也通过添加自定义属性来判断:

<div class="all-sort-list2" @click="goSearch">
   <div
     class="item"
     v-for="(c1, index) in categoryList"
     :key="c1.categoryId"
     @mouseenter="changeIndex(index)"
     :class="{ cur: currentIndex === index }"
   >
     <h3>
       <!-- 给a标签添加自定义属性 -->
       <a
         :data-categoryName="c1.categoryName"
         :data-category1Id="c1.categoryId"
         >{{ c1.categoryName }}</a>
     </h3>
     <!-- 二三级分类 -->
     <div
       class="item-list clearfix"
       :style="{
         display: currentIndex === index ? 'block' : 'none',
       }"
     >
       <div
         class="subitem"
         v-for="c2 in c1.categoryChild"
         :key="c2.categoryId"
       >
         <dl class="fore">
           <dt>
             <a
               :data-categoryName="c2.categoryName"
               :data-category2Id="c2.categoryId"
               >{{ c2.categoryName }}</a
             >
           </dt>
           <dd>
             <em v-for="c3 in c2.categoryChild" :key="c3.categoryId">
               <a
                 :data-categoryName="c3.categoryName"
                 :data-category3Id="c3.categoryId"
                 >{{ c3.categoryName }}</a
               >
             </em>
           </dd>
         </dl>
       </div>
     </div>
   </div>
 </div>
goSearch(event) {
      //event.target:获取到的是触发事件的元素(div、h3、a、em、dt、dl)
      let node = event.target;
      //给a标签添加自定义属性data-categoryName,全部的字标签当中只有a标签带有自定义属性,别的标签名字----dataset纯属扯淡
      let { categoryname, category1id, category2id, category3id } =
        node.dataset;
      //第二个问题解决了:点击的到底是不是a标签(只要这个标签身上带有categoryname)一定是a标签
      //当前这个if语句:一定是a标签才会进入
      if (categoryname) {
        //准备路由跳转的参数对象
        let loction = { name: "search" };  // 固定参数
        let query = { categoryName: categoryname };
        //一定是a标签:一级目录
        if (category1id) {
          query.category1Id = category1id;
          //一定是a标签:二级目录
        } else if (category2id) {
          query.category2Id = category2id;
          //一定是a标签:三级目录
        } else {
          query.category3Id = category3id;
        }
        //判断:如果路由跳转的时候,带有params参数,捎带脚传递过去
        if (this.$route.params) {
          // 添加动态参数
          loction.params = this.$route.params;
          //动态给location配置对象添加query属性
          loction.query = query; 
          //路由跳转
          this.$router.push(loction);
        }
      }
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【控糖有道,健康无忧!糖尿病患者的饮食黄金法则大揭秘】

在快节奏的现代生活中&#xff0c;糖尿病作为一种常见的慢性疾病&#xff0c;正悄然影响着越来越多人的生活质量。面对这一挑战&#xff0c;科学合理的饮食管理成为了控制病情、提升生活品质的关键。今天&#xff0c;就让我们一同揭开糖尿病饮食的黄金法则&#xff0c;让“控糖…

CentOS服务器三级等保加固

1.密码周期: vim /etc/login.defs max_days:90 mindays:2 minlen:8 warnage:72.密码复杂度: vim /etc/pam.d/system-auth &#xff1a; password requisite pam_cracklib.so retry3 difok3 minlen8 lcredit-1 dcredit-1 ucredit-1 ocredit-1 【Ubuntu系统->vim /etc/pam.d/c…

Linux组的介绍,所有者,所在组,修改所在组

目录 linux组的介绍 文件/目录所有者 组的创建 文件/目录所在组 其它组 改变用户所在组 linux组的介绍 每个用户必须属于一个组&#xff0c;不能独立于组外。 这个文件是谁创建的&#xff0c;这个文件的所有者就是谁。 这个文件属于组1&#xff0c;那么组2对它来说就…

VoLTE基本信令流程(整理的学习笔记)

VoLTE基本信令流程 1. 注册基本过程 UE进行Attach&#xff0c;建立QCI9的默认承载使用IMS APN建立PDN连接&#xff0c;建立 QCI5 的默认承载&#xff0c;用于传送 SIP 信令&#xff0c;同时获取到了IMS入口的P-CSCF地址信息UE 通过 QCI5 的默认承载向 IMS 发起注册请求IMS 域…

亚马逊ERP全功能 无隐藏收费的几个地方

亚马逊全功能 ERP 采集图片订单翻译&#xff0c;无任何隐藏收费。 说说有关采集和管理的软件&#xff01;1. 对于做跟卖的人来说需要大量采集产品&#xff0c;采集过来的产品还需要进行文本、图片翻译、修图等操作&#xff0c;图片储存和站点维护另算。市面上有些 ERP 软件在这…

美国高防服务器到底怎么选

美国高防服务器因其强大的硬件设施、高度的网络连接性、丰富的带宽资源和先进的防御技术而受到全球用户的欢迎。以下是选择美国高防服务器时需要考虑的关键因素&#xff0c;rak部落为您整理发布美国高防服务器到底怎么选。 确定服务器需求 容量和带宽&#xff1a;根据业务规模…

共享电动单车管理系统 ---附源码131016

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享电动单车管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了共享电动单车管理系统&#xff0c;它彻底…

React 学习——Class类组件生命周期函数

componentDidMount&#xff1a;组件渲染完执行一次&#xff0c;发送网络请求 componentWillUnmount&#xff1a;组件卸载的时候执行&#xff0c;副作用&#xff08;清理的工作 清除定时器 事件绑定&#xff09; import { Component,useState } from react; class Counter e…

敏捷架构开发方法和实践:迎接数字化时代的挑战

在当前飞速发展的数字化时代&#xff0c;传统企业架构的局限性日益显现&#xff0c;特别是在应用敏捷方法的过程中&#xff0c;许多企业发现其架构和组织结构无法支持真正的敏捷转型。为应对这一挑战&#xff0c;《数字化时代的敏捷架构》提出了一个全新的架构框架——敏捷架构…

Typora 软件介绍和利用

Typora 软件介绍 Typora 是一款功能强大的 Markdown 编辑器&#xff0c;以简洁直观的设计和无缝的实时预览而著称。本文将详细介绍 Typora 的功能、优势以及使用体验。 目录 简介主要功能软件优势使用体验系统支持安装与设置 简介 Typora 是一款由 Abner Lee 开发的 Markdo…

最新完整版手机APP软件应用下载类网站模板源码/手游导航源码app软件下载

源码简介&#xff1a; 手机APP软件应用下载类网站模板源码&#xff0c;它是最新完整版&#xff0c;也是手游导航源码&#xff0c;app软件排行榜下载网页源码。 这是一款带有强大后台的app软件手游类源码&#xff0c;界面设计得很漂亮&#xff0c;非常适合做app软件、手机软件…

PPT分享:埃森哲-流程制造的智能工厂规划设计

在分享PPT之前&#xff0c;笔者与大家一起熟悉下&#xff0c;流程制造是什么&#xff0c;与离散制造有哪些区别。 往期回顾>> 125页PPT&#xff1a;某行业数据架构蓝图规划方案 170页PPT&#xff1a;制造业采购供应链及财务管控业务流程蓝图规划 60页PPT:集团SRM项目业…

OpenGL-ES 学习(8) ---- FBO

目录 FBO OverViewFBO 优点使用FBO的步骤 FBO OverView FBO(FrameBuffer Object) 指的是帧缓冲对象&#xff0c;实际上是一个可以添加缓冲区容器&#xff0c;可以为其添加纹理或者渲染缓冲区对象(RBO) FBO(FrameBuffer Object) 本身不能用于渲染&#xff0c;只有添加了纹理或者…

【JS】如何给fetch添加超时功能

前言 Ajax有两种方式实现请求&#xff0c;分别是xhr和fetch&#xff0c;前者有超时功能&#xff0c;fetch则不然。下文尝试给fetch添加超时功能。 实现 使用终止器&#xff0c;在controller.abort()时便会在使用其signal信号的fetch函数发送一个终止信号&#xff0c;请求就会…

PTA 求整数的位数及各位数字之和

对于给定的正整数N&#xff0c;求它的位数及其各位数字之和。 输入格式&#xff1a; 输入在一行中给出一个不超过109的正整数N。 输出格式&#xff1a; 在一行中输出N的位数及其各位数字之和&#xff0c;中间用一个空格隔开。 输入样例&#xff1a; 321输出样例&#xff…

maven进阶(超详细)

多模块开发 1.抽取entity模块 将先前的SSMProject01项目中的entity文件夹抽取出来&#xff0c;成为一个独立的模块 在SSMProject01项目中引入maven_03_entity 首先找到maven_03_entity的pom文件 直接引入SSMProject01 尝试编译&#xff08;compile&#xff09;SSMProject01项…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Vue自己实现监视数据、Vue.set创建属性、Vue监视数据的原理

目录 1. 自己实现监视数据2. 使用Vue.set创建一个数据属性3. Vue监视数据的原理 1. 自己实现监视数据 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body&g…

【blender小技巧】如何拆分模型、合并和删除模型,删除多余骨骼

文章目录 前言进入面选择模式选取全部面拆分模型1、选中项——单独拆分2、按材质——按材质拆分3、按按松散块 合并模型删除模型某一块删除多余骨骼1、手动删除2、使用CATS插件的Fix Model 最终效果完结 前言 有时候&#xff0c;我们得到的模型是一个整体&#xff0c;想修改其…

VUE使用过程中的问题记录

现象1&#xff1a;npm run dev卡住不动 现象 问题原因&#xff1a; template 里面放一个元素我放了两个&#xff0c;改成一个好了