Vue项目三级联动路由跳转与传参的思路详解

 更新时间:2024年08月22日 10:23:21   作者:简 。单  
这篇文章主要介绍了Vue项目三级联动的路由跳转与传参的思路详解,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

三级联动,用户可以点击的:一级分类、二级分类和三级分类
以商城项目为例,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,不会拥有这个弹出事件。
事件委派+编程式导航 实现三级联动

利用事件的委派

  • 在三级联动的父元素的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);
        }
      }
    },

到此这篇关于Vue项目-三级联动的路由跳转与传参的文章就介绍到这了,更多相关Vue路由跳转与传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue axios库发送请求的示例介绍

    Vue axios库发送请求的示例介绍

    axios是基于promise的HTTP库,可以使用在浏览器和node.js中,它不是vue的第三方插件,vue-axios是axios集成到Vue.js的小包装器,可以像插件一样安装使用:Vue.use(VueAxios, axios),本文给大家介绍Vue axios和vue-axios关系,感兴趣的朋友一起看看吧
    2022-08-08
  • vue监听sessionStorage中值的变化方式

    vue监听sessionStorage中值的变化方式

    这篇文章主要介绍了vue监听sessionStorage中值的变化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 使用vue-print-nb打印el-table问题总结

    使用vue-print-nb打印el-table问题总结

    这篇文章主要介绍了使用vue-print-nb打印el-table问题总结,通过实例代码介绍了vue-print-nb 打印功能,本文结合实例代码讲解的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • vue中element 上传功能的实现思路

    vue中element 上传功能的实现思路

    这篇文章主要介绍了vue中element 的上传功能的实现思路,本文大概通过两种实现思路,具体内容详情大家跟随脚本之家小编一起看看吧
    2018-07-07
  • Vue自定义组件中v-model的使用方法示例

    Vue自定义组件中v-model的使用方法示例

    日常开发中除了直接在input标签上使用v-model指令外,封装的组件也需要v-model,下面这篇文章主要给大家介绍了关于Vue自定义组件中v-model使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Vue中的数据监听和数据交互案例解析

    Vue中的数据监听和数据交互案例解析

    这篇文章主要介绍了Vue中的数据监听和数据交互案例解析,在文章开头部分先给大家介绍了vue中的数据监听事件$watch,具体代码讲解,大家可以参考下本文
    2017-07-07
  • vue3+ts+vite+pinia+element plus项目使用语言国际化详解

    vue3+ts+vite+pinia+element plus项目使用语言国际化详解

    文章介绍了如何在Vue 3 + TypeScript + Vite + Pinia + Element Plus项目中实现语言国际化,主要步骤包括安装vue-i18n、创建语言文件、创建i18n实例、全局引入、类型声明(可选)、创建语言切换组件、动态加载语言文件以及在组件和PiniaStore中使用国际化
    2025-11-11
  • vue 扩展现有组件的操作

    vue 扩展现有组件的操作

    这篇文章主要介绍了vue 扩展现有组件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • el-tree的实现叶子节点单选的示例代码

    el-tree的实现叶子节点单选的示例代码

    本文主要介绍了el-tree的实现叶子节点单选的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • vue中添加mp3音频文件的方法

    vue中添加mp3音频文件的方法

    本篇文章主要介绍了vue中添加mp3音频文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论