最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue.js實(shí)現(xiàn)動態(tài)面包屑

 更新時(shí)間:2022年04月13日 11:08:33   作者:姣姣醬  
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)動態(tài)面包屑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近在學(xué)習(xí)vue,正好手上有個(gè)項(xiàng)目還是用jquery寫的,就自己嘗試將這個(gè)項(xiàng)目的前端用vue實(shí)現(xiàn),途中遇到了動態(tài)面包屑的問題,特此記錄一下,如有不對的地方,歡迎指正.

需求描述:

點(diǎn)擊左側(cè)的導(dǎo)航,跳轉(zhuǎn)到不同的頁面,并且根據(jù)導(dǎo)航的路徑,動態(tài)生成面包屑.面包屑的數(shù)據(jù)均來自于左側(cè)的導(dǎo)航.

思路:

1.面包屑作為一個(gè)單獨(dú)的組件,在頁面中引入.頁面的結(jié)構(gòu)如下:

<template>
? ? <div class="page-center">
? ? ? ? <top-bar></top-bar> <!--頁面頂部信息,固定在頂部-->
? ? ? ? <div class="webui-menu-vertical left-nav" ?v-bind:style="{ width:colspan?'100px':'220px' }">
? ? ? ? ? ? <menu-vertical
? ? ? ? ? ? ? ? :menu-list="menuList"
? ? ? ? ? ? ? ? @flexMenuClick="flexMenuClick"
? ? ? ? ? ? ? ? @menuClick="menuClick"></menu-vertical>
? ? ? ? </div> <!--左側(cè)菜單導(dǎo)航,點(diǎn)擊這邊的菜單,右邊的面包屑變化-->
? ? ? ? <div class="right-content" ?v-bind:style="{ marginLeft: colspan?'100px':'220px' }">
? ? ? ? ? ? <bread-crumb></bread-crumb> <!--面包屑組件-->
? ? ? ? ? ? <div class="content">
? ? ? ? ? ? ? ? <router-view></router-view> <!--路由頁面-->
? ? ? ? ? ? </div>
? ? ? ? ? ??
? ? ? ? </div>
? ? ? ??
? ? </div>
</template>

2.面包屑組件的實(shí)現(xiàn):

<!--主要代碼實(shí)現(xiàn),樣式自己DIY-->
<template>
? ? <div class="bread-crumb">
? ? ? ? <ul>
? ? ? ? ? ? <li v-for=" (item, index) in breadCrumbList" :key="item.title">
? ? ? ? ? ? ? ? <router-link>{{item.title}}</router-link>
? ? ? ? ? ? ? ? <span v-if="index < breadCrumbList.length-1">/</span>
? ? ? ? ? ? </li>
? ? ? ? </ul>
? ? </div>
</template>
?
<script>
?
export default {
? ? name:'bread-crumb',
? ? computed: {
? ? ? breadCrumbList() { //將面包屑的數(shù)據(jù)存儲在vuex狀態(tài)中
? ? ? ? ? return this.$store.state.breadCrumbList
? ? ? }
? ? },
}
</script>

3.每次路由更新的時(shí)候,更新面包屑的數(shù)據(jù):

//main.js
router.beforeEach( (to, from, next) => { //這里用到導(dǎo)航守衛(wèi)
? store.commit('setCurrRouteNme', {currRouteNme:to.name});
? store.dispatch('setMenuList').then( ()=> { //因?yàn)槊姘嫉臄?shù)據(jù)來自左側(cè)菜單,這邊先獲取左側(cè)導(dǎo)航數(shù)據(jù)然后根據(jù)當(dāng)前路徑生成面包屑
? ? store.dispatch('setBreadCrumb');
? });
?
? next();
})?
//store.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
?
Vue.use(Vuex)
?
export default new Vuex.Store({
? state: {
? ? currRouteNme: String,
? ? oriMenuList:Array,
? ? menuList:Array,
? ? breadCrumbList:Array,
? },
?
? mutations: {
? ? setCurrRouteNme( state, payload ) {
? ? ? state.currRouteNme = payload.currRouteNme
? ? },
?
? ? setMenuList( state, payload) {
? ? ? state.menuList = payload.menuList
? ? },
?
? ? setOriMenuList( state, payload) {
? ? ? state.oriMenuList = payload.oriMenuList
? ? },
?
? ? setBreadCrumb( state, payload) {
? ? ? state.breadCrumbList = payload.breadCrumbList
? ? },
?
? },
? actions: { //因?yàn)閿?shù)據(jù)是異步請求獲取的,所以改變state要通過dispatch,commit只能處理同步數(shù)據(jù)
? ? setMenuList ( {commit} ) {
? ? ? let menuList;
? ? ? return new Promise ( (resolve) => {
? ? ? ? axios(url).then( res => { //url是請求菜單數(shù)據(jù)的接口
? ? ? ? ? menuList = res.data.authList.map(({id,symbol,pId,forward,resName,isLeaf})=>{
? ? ? ? ? ? return {
? ? ? ? ? ? ? id,
? ? ? ? ? ? ? symbol,
? ? ? ? ? ? ? pId,
? ? ? ? ? ? ? forward,
? ? ? ? ? ? ? label:resName,
? ? ? ? ? ? ? isLeaf:isLeaf,
? ? ? ? ? ? ? icon:isLeaf == 1?'':'el-icon-goods'
? ? ? ? ? ? }
? ? ? ? ? });
?
? ? ? ? ? commit('setOriMenuList', {
? ? ? ? ? ? oriMenuList: menuList
? ? ? ? ? });
? ? ? ? //這邊是為了左側(cè)菜單而進(jìn)行的數(shù)據(jù)處理,可忽略
? ? ? ? let menuTree = menuList.reduce(function (prev, item) {
? ? ? ? ? ? prev[item.pId] ? prev[item.pId].push(item) : prev[item.pId] = [item];
? ? ? ? ? ? return prev;
? ? ? ? ? }, {});
? ? ? ? ??
? ? ? ? ? for (let parentItem in menuTree) {
? ? ? ? ? ? menuTree[parentItem].forEach(function (item) {
? ? ? ? ? ? ? ? item.children = menuTree[item.id] ? menuTree[item.id] : null;
? ? ? ? ? ? });
? ? ? ? ? }
? ? ? ? ??
? ? ? ? ? commit('setMenuList', {
? ? ? ? ? ? menuList: menuTree[0]
? ? ? ? ? });?
?
? ? ? ? ? resolve();
? ? ? ? })
? ? ? })
??
? ? },
?
? ? setBreadCrumb ( {commit, state} ) {
?
? ? ? let currMenuList = state.oriMenuList;
? ? ? let currMenu;
? ? ? let breadCrumbPre = [];
??
? ? ? for (let i=0; i<currMenuList.length; i++) {
? ? ? ? ? if(currMenuList[i]['symbol'] == state.currRouteNme){
? ? ? ? ? ? currMenu = currMenuList[i];
? ? ? ? ? ? ? let breadCrumbItem = {};
? ? ? ? ? ? ? breadCrumbItem.title = currMenuList[i].label;
? ? ? ? ? ? ? breadCrumbItem.path = '';
? ? ? ? ? ? ? breadCrumbPre.unshift(breadCrumbItem);
? ? ? ? ? }
? ? ? }
? ? ? function setBreadCrumb(menu){ //遞歸找出當(dāng)前菜單的所有父親菜單
? ? ? ? ? if(menu.pId != 0){
? ? ? ? ? ? ? for (let i=0; i<currMenuList.length; i++) {
? ? ? ? ? ? ? ? if(currMenuList[i]['id'] == menu.pId){
? ? ? ? ? ? ? ? ? let breadCrumbItem = {};
? ? ? ? ? ? ? ? ? breadCrumbItem.title = currMenuList[i]['label'];
? ? ? ? ? ? ? ? ? breadCrumbItem.path = '';
? ? ? ? ? ? ? ? ? breadCrumbPre.unshift(breadCrumbItem);
? ? ? ? ? ? ? ? ? setBreadCrumb(currMenuList[i])
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? }
? ? ? setBreadCrumb(currMenu);
? ? ? let index = {
? ? ? ? ? title:'首頁',
? ? ? ? ? path:''
? ? ? };
? ? ? breadCrumbPre.unshift(index);
? ? ? commit('setBreadCrumb', {
? ? ? ? breadCrumbList:breadCrumbPre
? ? ? })
? ? }
?
? }
})

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

连南| 邵阳市| 福贡县| 祁连县| 贵定县| 六安市| 施甸县| 扎鲁特旗| 友谊县| 海宁市| 仪征市| 亳州市| 平顺县| 桂平市| 北辰区| 黎川县| 区。| 自治县| 金坛市| 云安县| 江源县| 横山县| 淮安市| 连城县| 北海市| 林周县| 北川| 茌平县| 卫辉市| 思茅市| 志丹县| 额尔古纳市| 电白县| 会理县| 隆昌县| 甘德县| 临高县| 贵港市| 文成县| 灵寿县| 壤塘县|