Vue項目三級聯(lián)動路由跳轉與傳參的思路詳解
三級聯(lián)動組件的路由的跳轉與傳參
三級聯(lián)動,用戶可以點擊的:一級分類、二級分類和三級分類
以商城項目為例,Home模塊跳轉到Search模塊,以及會把用戶選中的產品(產品名字、產品ID)在路由跳轉的時候,進行傳遞。
路由跳轉
- 聲明式導航:router-link
- 編程式導航:push | replace
聲明式導航
- router-link 來替換a標簽跳轉(不推薦)
- 但是當鼠標進入三級聯(lián)動,上下滑動的時候,會出現(xiàn)卡頓現(xiàn)象。
原因:router-link是一個組件,當服務器的數(shù)據(jù)返回后,循環(huán)出很多router-link組件創(chuàng)建實例1000+,創(chuàng)建組件實例的時候,一瞬間創(chuàng)建很多組件很耗內存,因此出現(xiàn)卡頓現(xiàn)象。
編程時導航(常使用)
綁定點擊事件
點擊事件一個方法
- 點擊確實能夠實現(xiàn)跳轉,而且沒有卡頓的現(xiàn)象。
- 但是這種方法也不是最好的
- 原因是:因為每一個a標簽都綁定了一個@click函數(shù),因為這個三級聯(lián)動,要循環(huán),可能會有1000+次,所以相當于綁定1000+@click回調函數(shù),那么1000個回調函數(shù)。
事件委派+編程式導航(最佳方法)
事件委派:把原來加給子元素身上的事件綁定在父元素身上,就是把時間委派給父元素。比如說,鼠標點擊事件,本來頁面上有很多的鼠標點擊事件,需要一個個的去寫實現(xiàn)函數(shù),但是如果你把鼠標點擊事件交給上司來完成,那么就是鼠標點擊那里的時候,就相當于上司找對應的下屬來完成此事件,而不像前面一個個的去找實現(xiàn)函數(shù)。
<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;
但是事件委派有兩個弊端:很耗費資源;如果后期動態(tài)添加li,不會擁有這個彈出事件。
事件委派+編程式導航 實現(xiàn)三級聯(lián)動
利用事件的委派
- 在三級聯(lián)動的父元素的div綁定一個@click=“goSearch”
<!-- 利用事件委派和編程式導航實現(xiàn)路由跳轉和傳參--> <div class="all-sort-list2" @click="goSearch">
methods這樣寫:
methods:{ goSearch(){ this.$router.push('/search'); } }
此時實現(xiàn)了跳轉search的效果。
- 但是新問題:第一個問題:怎么知道點擊的是a標簽?因為三級聯(lián)動父div里面有a,h3,dt,dl,是把全部子節(jié)點的事件委派給父親節(jié)點。第二個問題:即使能確定點擊的是a標簽,如何區(qū)分點擊的是一級、二級、三級的a標簽?
- event是事件對象,可以獲取到當前觸發(fā)事件的節(jié)點
解決方法: 把子節(jié)點當中a標簽,加上自定義屬性data-categoryName,其余的子節(jié)點是沒有的;一級、二級、三級分類的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:獲取到的是觸發(fā)事件的元素(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) { //準備路由跳轉的參數(shù)對象 let loction = { name: "search" }; // 固定參數(shù) let query = { categoryName: categoryname }; //一定是a標簽:一級目錄 if (category1id) { query.category1Id = category1id; //一定是a標簽:二級目錄 } else if (category2id) { query.category2Id = category2id; //一定是a標簽:三級目錄 } else { query.category3Id = category3id; } //判斷:如果路由跳轉的時候,帶有params參數(shù),捎帶腳傳遞過去 if (this.$route.params) { // 添加動態(tài)參數(shù) loction.params = this.$route.params; //動態(tài)給location配置對象添加query屬性 loction.query = query; //路由跳轉 this.$router.push(loction); } } },
到此這篇關于Vue項目-三級聯(lián)動的路由跳轉與傳參的文章就介紹到這了,更多相關Vue路由跳轉與傳參內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
element-ui中select組件綁定值改變,觸發(fā)change事件方法
今天小編就為大家分享一篇element-ui中select組件綁定值改變,觸發(fā)change事件方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08詳解使用vue-router進行頁面切換時滾動條位置與滾動監(jiān)聽事件
本篇文章主要介紹了詳解使用vue-router進行頁面切換時滾動條位置與滾動監(jiān)聽事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03Vuex報錯之[vuex] unknown mutation type: han
這篇文章主要介紹了Vuex報錯之[vuex] unknown mutation type: handlePower問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07vue實現(xiàn)長圖垂直居上 vue實現(xiàn)短圖垂直居中
這篇文章主要為大家詳細介紹了vue彈性布局實現(xiàn)長圖垂直居上,vue實現(xiàn)短圖垂直居中,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10