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

使用vue-element-admin框架從后端動(dòng)態(tài)獲取菜單功能的實(shí)現(xiàn)

 更新時(shí)間:2021年04月29日 10:21:06   作者:#Empty  
​ vue-element-admin是一個(gè)純前端的框架,左側(cè)菜單是根據(jù)路由生成的。實(shí)際開發(fā)中經(jīng)常需要根據(jù)當(dāng)前登陸人員的信息從后端獲取菜單進(jìn)行展示,本文將詳細(xì)介紹如何實(shí)現(xiàn)該功能

2、詳解

​整體思路為:登陸 > 成功后根據(jù)用戶信息獲取菜單 > 根據(jù)菜單生成路由信息

2.1、新增asyncRoutes路由

​在vue-router路徑src\router\index.js中新增asyncRoutes數(shù)組,用來存放后端獲取的菜單對應(yīng)的路由信息。

export const asyncRoutes = [
  { path: '*', redirect: '/404', hidden: true }
]

constantRoutes和asyncRoutes的區(qū)別

constantRoutes:不需要?jiǎng)討B(tài)判斷權(quán)限的路由,如登錄頁、404等通用頁面。

asyncRoutes:需求動(dòng)態(tài)判斷權(quán)限并通過addRoutes動(dòng)態(tài)添加的頁面

2.2、新建permission.js文件

​在vuex路徑src\store\modules\permission.js下新建permission.js文件,該操作為最重要的一步,主要是從后端查詢菜單并生成路由。

import { asyncRoutes, constantRoutes } from '@/router'
import { fetchUserMenuList } from '@/api/user'
import Layout from '@/layout'

/**
 * 靜態(tài)路由懶加載
 * @param view  格式必須為 xxx/xxx 開頭不要加斜杠
 * @returns 
 */
export const loadView = (view) => {
  return (resolve) => require([`@/views/${view}.vue`], resolve)
}

/**
 * 把從后端查詢的菜單數(shù)據(jù)拼裝成路由格式的數(shù)據(jù)
 * @param routes
 * @param data 后端返回的菜單數(shù)據(jù)
 */
export function generaMenu(routes, data) {
  data.forEach(item => {
    const menu = {
      path: item.url, 
      component: item.component === '#' ? Layout : loadView(item.component), 
      hidden: item.status === 0, // 狀態(tài)為0的隱藏
      redirect: item.redirect,
      children: [],
      name: item.code,
      meta: item.meta
    }

    if (item.children) {
      generaMenu(menu.children, item.children)
    }
    routes.push(menu)
  })
  return routes
}

const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    // 拼接靜態(tài)路由和動(dòng)態(tài)路由
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, token) {
    return new Promise(resolve => {
      // 通過token從后端獲取用戶菜單,并加入全局狀態(tài)
      fetchUserMenuList(token).then(res => {
        const menuData = Object.assign([], res.data)
        const tempAsyncRoutes = Object.assign([], asyncRoutes)
        const accessedRoutes = generaMenu(tempAsyncRoutes, menuData)

        commit('SET_ROUTES', accessedRoutes)
        resolve(accessedRoutes)
      }).catch(error => {
        console.log(error)
      })
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

2.3、在vuex中注冊permission模塊

​如果使用的是vue-element-admin請?zhí)^此步,因?yàn)樗?code>src\store\index.js中自動(dòng)注冊了src\store\modules下的所有模塊。如果你使用的是vue-element-template,可以參考admin,將index.js文件改造一下,也可以手動(dòng)import一下。

import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'

Vue.use(Vuex)

// https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', true, /\.js$/)

// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // set './app.js' => 'app'
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})

const store = new Vuex.Store({
  modules,
  getters
})

export default store

2.4、在getters中增加路由狀態(tài)

​在vuex路徑src\store\getters.js添加menusRoutes狀態(tài)

menusRoutes: state => state.permission.routes

2.5、修改菜單生成數(shù)據(jù)來源

​在路徑src\layout\components\Sidebar\index.vue修改routes數(shù)據(jù)來源,原來數(shù)據(jù)源是路由,改為從vuex中獲取。

routes() {
      // return this.$router.options.routes
      return this.$store.getters.menusRoutes
    },

​至此,從后端獲取菜單數(shù)據(jù)到頁面展示的邏輯已經(jīng)完畢,下面開始在登陸后進(jìn)行調(diào)用。

2.6、登陸后獲取菜單

​在vuex路徑src\store\modules\user.js的login方法中,加入登陸成功通過token獲取菜單生成路由邏輯。

 // 獲取菜單,調(diào)用其他文件中actions時(shí)必須加 { root: true }
          dispatch('permission/generateRoutes', data, { root: true }).then((accessRoutes) => {
            router.addRoutes(accessRoutes)
          })

2.7、解決刷新后頁面空白

​以上內(nèi)容已經(jīng)可以實(shí)現(xiàn)登陸后展示左側(cè)菜單功能,但是會(huì)發(fā)現(xiàn)每次刷新頁面后,頁面都會(huì)變空白。這是因?yàn)樵陧撁嫠⑿聲r(shí),會(huì)重新加載vue實(shí)例,vuex的store中的數(shù)據(jù)會(huì)被重新賦值,導(dǎo)致我們存在vuex中的路由信息被清空。

​在src\permission.js中增加重新獲取路由代碼。

const accessRoutes = await store.dispatch('permission/generateRoutes', store.getters.token)
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })

3、總結(jié)

​至此根據(jù)用戶信息動(dòng)態(tài)獲取菜單內(nèi)容已經(jīng)全部完成。

到此這篇關(guān)于使用vue-element-admin框架從后端動(dòng)態(tài)獲取菜單的文章就介紹到這了,更多相關(guān)vue-element-admin動(dòng)態(tài)獲取菜單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue.js輪播圖組件使用方法詳解

    vue.js輪播圖組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue.js輪播圖組件使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • vue前端實(shí)現(xiàn)打印下載示例詳解

    vue前端實(shí)現(xiàn)打印下載示例詳解

    這篇文章主要為大家介紹了vue前端實(shí)現(xiàn)打印下載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vite+vue3使用@路徑報(bào)錯(cuò)處理

    vite+vue3使用@路徑報(bào)錯(cuò)處理

    本文主要介紹了vite+vue3使用@路徑報(bào)錯(cuò)處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 使用VueCli3+TypeScript+Vuex一步步構(gòu)建todoList的方法

    使用VueCli3+TypeScript+Vuex一步步構(gòu)建todoList的方法

    這篇文章主要介紹了使用VueCli3+TypeScript+Vuex一步步構(gòu)建todoList的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在Vue環(huán)境下利用worker運(yùn)行interval計(jì)時(shí)器的步驟

    在Vue環(huán)境下利用worker運(yùn)行interval計(jì)時(shí)器的步驟

    這篇文章主要介紹了在Vue環(huán)境下利用worker運(yùn)行interval計(jì)時(shí)器的步驟,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 詳解vue使用$http服務(wù)端收不到參數(shù)

    詳解vue使用$http服務(wù)端收不到參數(shù)

    這篇文章主要介紹了vue使用$http服務(wù)端收不到參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue3?中的插件和配置推薦大全

    Vue3?中的插件和配置推薦大全

    這篇文章主要介紹了Vue3?中的插件和配置推薦大全,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼

    vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue基于v-charts封裝雙向條形圖的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • vue3搭配pinia的踩坑實(shí)戰(zhàn)記錄

    vue3搭配pinia的踩坑實(shí)戰(zhàn)記錄

    Pinia是一個(gè)同時(shí)支持Vue2和Vue3的應(yīng)用狀態(tài)管理工具,簡單來說就是為了管理整個(gè)應(yīng)用中的響應(yīng)式數(shù)據(jù),解決各個(gè)組件交互時(shí)數(shù)據(jù)狀態(tài)的不好管理的問題,下面這篇文章主要給大家介紹了關(guān)于vue3搭配pinia踩坑的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Vue+Echarts實(shí)現(xiàn)分時(shí)圖和交易量圖的繪制

    Vue+Echarts實(shí)現(xiàn)分時(shí)圖和交易量圖的繪制

    近來發(fā)現(xiàn)Echarts?API越發(fā)的強(qiáng)大,對于繪制各類圖形可以使用Echarts實(shí)現(xiàn)。本文將利用Echarts實(shí)現(xiàn)分時(shí)圖和交易量圖的繪制,希望對大家有所幫助
    2023-03-03

最新評論

舞阳县| 黄浦区| 南安市| 章丘市| 年辖:市辖区| 宜兰市| 盐亭县| 邓州市| 抚顺市| 安国市| 抚松县| 柯坪县| 昌都县| 成都市| 吕梁市| 西林县| 榆树市| 若尔盖县| 北海市| 舟山市| 玛沁县| 资源县| 宁河县| 东兴市| 哈密市| 钟祥市| 长寿区| 囊谦县| 五河县| 浠水县| 九龙县| 康乐县| 呼伦贝尔市| 涪陵区| 美姑县| 元谋县| 滁州市| 舟山市| 阿鲁科尔沁旗| 凤阳县| 安徽省|