91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iview-admin 動態菜單

發布時間:2020-06-12 06:41:55 來源:網絡 閱讀:3586 作者:295631788 欄目:web開發

iview-admin 2.5.0 動態菜單

說明

本文大多內容 摘抄自 https://www.cnblogs.com/smilexumu/p/10521612.html 此文章,但是這個文章有個小bug,第一次登錄不顯示菜單,不知道是不是作者寫漏了  還是其他問題。

本文進行了bug修復,實際測試可以使用。 只限2.5.0版本,其他版本沒測試過。

項目實戰

https://github.com/hequan2017/seal-vue/

模擬菜單數據

[{
    "path": '/multilevel',
    "name": 'multilevel',
    "meta": {
        "icon": 'md-menu',
        "title": '多級菜單'
    },
    "component": 'Main',
    "children": [
        {
            "path": '/level_2_1',
            "name": 'level_2_1',
            "meta": {
                "icon": 'md-funnel',
                "title": '二級-1'
            },
            "component": 'multilevel/level-2-1'
        },

    ]
}]

步驟

api/data.js

export const getMockMenuData = () => {
  return axios.request({
    url: 'system/mock_menu',
    method: 'post'
  })
}

新建 src/libs/router-util.js ( 用于轉化請求的menus-data數據為能被vue識別的路由格式)

/**
 * ①添
 * @@新增 定義初始化菜單
 */
// import axios from 'axios'
import { getToken, localSave, localRead } from '@/libs/util'
// import config from '@/config'
import { lazyLoadingCop } from '@/libs/tools'
import { getMockMenuData } from '@/api/data'
import Main from '@/components/main' // Main 是架構組件,不在后臺返回,在文件里單獨引入
import parentView from '@/components/parent-view' // 獲取組件的方法
import store from '@/store' // parentView 是二級架構組件,不在后臺返回,在文件里單獨引入
// eslint-disable-next-line no-unused-vars
const _import = require('@/router/_import_' + process.env.NODE_ENV)

var gotRouter
// 初始化路由
export const initRouter = () => {
  console.log('開始初始化路由')
  if (!getToken()) {
    console.log('沒有獲取到token')
    return
  }
  //  異步請求
  /*  axios.get(baseUrl+'/menuList',{
    header:{'Authorization':getToken()}
  }).then(res=>{
    var menuData=res.data.data;
    localSave('route',JSON.stringify(menuData));
    gotRouter=formatMenu(menuData);
    vm.$store.commit('updateMenuList',gotRouter);
  }); */
  var routerData
  if (!gotRouter) {
    getMockMenuData().then(res => {
      routerData = res.data // 后臺拿到路由
      console.log('保存到本地', routerData)
      localSave('dynamicRouter', JSON.stringify(routerData)) // 存儲路由到localStorage
      gotRouter = filterAsyncRouter(routerData) // 過濾路由,路由組件轉換
      store.commit('updateMenuList', gotRouter)
      dynamicRouterAdd()
    })
  } else {
    gotRouter = dynamicRouterAdd()
  }
  return gotRouter
}

// 加載路由菜單,從localStorage拿到路由,在創建路由時使用
export const dynamicRouterAdd = () => {
  let dynamicRouter = []
  let data = localRead('dynamicRouter')
  console.log('從本地加載出來', data)
  if (!data) {
    return dynamicRouter
  }
  dynamicRouter = filterAsyncRouter(JSON.parse(data))

  return dynamicRouter
}

// @函數: 遍歷后臺傳來的路由字符串,轉換為組件對象
export const filterAsyncRouter = asyncRouterMap => {
  const accessedRouters = asyncRouterMap.filter(route => {
    if (route.component) {
      if (route.component === 'Main') {
        // Main組件特殊處理
        route.component = Main
      } else if (route.component === 'parentView') {
        // parentView組件特殊處理
        route.component = parentView
      } else {
        // route.component = _import(route.component)
        route.component = lazyLoadingCop(route.component)
      }
    }
    if (route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })
  return accessedRouters
}

src->libs->toos.js, 中添加 引入.vue組件的封裝函數`

export const lazyLoadingCop = file => require('@/view/' + file + '.vue').default

src-->router,中新增_import_development.j s和_import_production.js 為引入.vue組件的封裝

_import_development.js

module.default = file => require('@/view/' + file + '.vue').default // vue-loader at least v13.0.0+

_import_production.js

module.exports = file => () => import('@/view/' + file + '.vue')

vux部分updateMenuList更新菜單數據 , src->store->module->app.js中的mutations添加 updateMenuList 操作 state中的 menuList:[] (添加)

state: {
    menuList: []
  },
  getters: {
    menuList: (state, getters, rootState) =>
      getMenuByRouter(state.menuList, rootState.user.access),
    errorCount: state => state.errorList.length
  },
  mutations: {
    updateMenuList (state, routes) {
      // 添接受前臺數組,刷新菜單
      router.addRoutes(routes) // 動態添加路由
      state.menuList = routes
      console.log('updateMenuList 添  menuList', state.menuList)
    },
    }

src->router->routers.js 主要是左側菜單的加入

 import Main from '@/components/main'
import { dynamicRouterAdd } from '@/libs/router-util' // ①添 引入加載菜單

/**
* iview-admin中meta除了原生參數外可配置的參數:
* meta: {
*  title: { String|Number|Function }
*         顯示在側邊欄、面包屑和標簽欄的文字
*         使用'{{ 多語言字段 }}'形式結合多語言使用,例子看多語言的路由配置;
*         可以傳入一個回調函數,參數是當前路由對象,例子看動態路由和帶參路由
*  hideInBread: (false) 設為true后此級路由將不會出現在面包屑中,示例看QQ群路由配置
*  hideInMenu: (false) 設為true后在左側菜單不會顯示該頁面選項
*  notCache: (false) 設為true后頁面在切換標簽后不會緩存,如果需要緩存,無需設置這個字段,而且需要設置頁面組件name屬性和路由配置的name一致
*  access: (null) 可訪問該頁面的權限數組,當前路由設置的權限會影響子路由
*  icon: (-) 該頁面在左側菜單、面包屑和標簽導航處顯示的圖標,如果是自定義圖標,需要在圖標名稱前加下劃線'_'
*  beforeCloseName: (-) 設置該字段,則在關閉當前tab頁時會去'@/router/before-close.js'里尋找該字段名對應的方法,作為關閉前的鉤子函數
* }
*/
// 不作為Main組件的子頁面展示的頁面單獨寫
export const otherRouter = [{
  path: '/login',
  name: 'login',
  meta: {
    title: 'Login - 登錄',
    hideInMenu: true
  },
  component: () => import('@/view/login/login.vue')
}, {
  path: '/401',
  name: 'error_401',
  meta: {
    hideInMenu: true
  },
  component: () => import('@/view/error-page/401.vue')
}, {
  path: '/500',
  meta: {
    title: '500-服務端錯誤'
  },
  name: 'error_500',
  component: () => import('@/view/error-page/500.vue')
}
];

// 作為Main組件的子頁面展示但是不在左側菜單顯示的路由寫在mainRouter里
export const mainRouter = [{
  path: '/',
  name: '_home',
  redirect: '/home',
  component: Main,
  meta: {
    hideInMenu: true,
    notCache: true
  },
  children: [
    {
      path: '/home',
      name: 'home',
      meta: {
        hideInMenu: true,
        title: '首頁',
        notCache: true,
        icon: 'md-home'
      },
      component: () => import('@/view/single-page/home')
    }
  ]
}, {
  path: '/message',
  name: 'message',
  component: Main,
  meta: {
    hideInBread: true,
    hideInMenu: true
  },
  children: [
    {
      path: 'message_page',
      name: 'message_page',
      meta: {
        icon: 'md-notifications',
        title: '消息中心'
      },
      component: () => import('@/view/single-page/message/index.vue')
    }
  ]
}];

// 作為Main組件的子頁面展示并且在左側菜單顯示的路由寫在appRouter里
export const appRouter = [...dynamicRouterAdd()];

export const routes = [
  ...otherRouter,
  ...mainRouter,
  ...appRouter
]

// 所有上面定義的路由都要寫在下面輸出
export default routes

src/router/index.js

import { dynamicRouterAdd } from '@/libs/router-util'

const turnTo = (to, access, next) => {
    if (canTurnTo(to.name, access, [...routes, ...dynamicRouterAdd()])) next()
        // 有權限,可訪問
    else next({ replace: true, name: 'error_401' }) // 無權限,重定向到401頁面
}

掛載

src->main.js 實例化對象 添加掛載時的動態路由調用


 import { initRouter } from '@/libs/router-util' // 新增  引入動態菜單渲染

new Vue({
  el: '#app',
  router,
  i18n,
  store,
  render: h => h(App),
  mounted() {
    initRouter() // 新增 調用方法,動態生成路由,
  }
})

store/module/user.js


import { initRouter } from '@/libs/router-util' // ①新增  引入動態菜單渲染

 handleLogin ({ commit }, { userName, password }) {
      userName = userName.trim()
      return new Promise((resolve, reject) => {
        login({
          userName,
          password
        })
          .then(res => {
            const data = res.data
            commit('setToken', data.token)
            console.log('token', getToken())
            initRouter()   // 主要修改這里 
            resolve()
          })
          .catch(err => {
            reject(err)
          })
      })
    },
    // 退出登錄
    handleLogOut ({ state, commit }) {
      return new Promise((resolve, reject) => {
        logout(state.token)
          .then(res => {
            console.log('退出', res)
            commit('setToken', '')
            commit('setAccess', [])
            localSave('dynamicRouter', []) // 主要修改這里       清空本地路由
            resolve()
          })
          .catch(err => {
            reject(err)
          })
        // 如果你的退出登錄無需請求接口,則可以直接使用下面三行代碼而無需使用logout調用接口
        // commit('setToken', '')
        // commit('setAccess', [])
        // resolve()
      })
    },
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

繁峙县| 美姑县| 闽侯县| 杂多县| 临沭县| 漳浦县| 霸州市| 高碑店市| 阿拉善左旗| 板桥市| 临湘市| 开化县| 万山特区| 莱芜市| 个旧市| 房山区| 荣昌县| 滦平县| 湖北省| 六盘水市| 怀柔区| 南昌市| 华容县| 金昌市| 灌南县| 当阳市| 公安县| 榆林市| 黑水县| 西吉县| 梁河县| 金沙县| 醴陵市| 巴彦淖尔市| 集安市| 酒泉市| 彭泽县| 阿克陶县| 秭归县| 张掖市| 曲阜市|