Vue项目三级联动路由跳转与传参的思路详解
作者:简 。单
这篇文章主要介绍了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路由跳转与传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!