国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue實(shí)戰(zhàn)【調(diào)整Vue-element-admin中的菜單欄,并添加頂部模塊菜單欄】

這篇具有很好參考價(jià)值的文章主要介紹了Vue實(shí)戰(zhàn)【調(diào)整Vue-element-admin中的菜單欄,并添加頂部模塊菜單欄】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??前言

因?yàn)樽罱谡瞎镜捻?xiàng)目,需要把所有系統(tǒng)里的功能集成到一個項(xiàng)目里,這樣就導(dǎo)致菜單欄目錄會特別的多,不便于用戶使用,體驗(yàn)效果極差。于是想到了一個方法,就是增加頂部導(dǎo)航欄,點(diǎn)擊的時(shí)候讓側(cè)邊菜單欄在顯示相對應(yīng)模塊的所有菜單;這樣的話就可以很大程度提升我們的用戶體驗(yàn)啦。

??小伙伴們先看

element 任務(wù)欄,Vue【前端無上心法】,vue.js,javascript,前端

??實(shí)現(xiàn)思路

嗯,干活前一定要先把思路理清楚,記在小本本上,畫個圖都行哈哈

  • 布局方面我需要在Navbar組件內(nèi)添加一個導(dǎo)航組件以便我們?nèi)ヤ秩卷敳磕K菜單;
  • 因?yàn)槭莿討B(tài)路由所以我們可以:
    • 登錄的時(shí)候讓后端返回所有的當(dāng)前用戶下所有的菜單權(quán)限;
    • 登錄時(shí)候只返回默認(rèn)顯示的菜單,每次點(diǎn)擊的時(shí)候再去獲取相應(yīng)的模塊菜單權(quán)限。

我這邊用的是第一種方式,登陸的時(shí)候獲取全部的存在vuex里,每次點(diǎn)擊的時(shí)候再去處理相應(yīng)的數(shù)據(jù);小伙伴們也可以嘗試一下第二種方式哦。

??具體代碼

話不多說,直接開整。。。

<!--src/layout/components/Navbar.vue-->
<template>
  <div class="navbar">
    <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />

    <!--重點(diǎn)一:頂部menu-->
    <el-menu
      mode="horizontal"
      default-active="/"
      @select="handleSelect"
    >
      <el-menu-item v-for="item in menuList" :key="item.path" class="menuItem" :index="item.path">
        <icon :class="item.meta?item.meta.icon:''" />
        <span slot="title">{{ item.name }}</span>
      </el-menu-item>
    </el-menu>
    <div class="right-menu">
      <el-dropdown class="avatar-container" trigger="click">
        <div class="avatar-wrapper">
          <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">
          <i class="el-icon-caret-bottom" />
        </div>
        <el-dropdown-menu slot="dropdown" class="user-dropdown">
          <router-link to="/">
            <el-dropdown-item>
              Home
            </el-dropdown-item>
          </router-link>
          <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
            <el-dropdown-item>Github</el-dropdown-item>
          </a>
          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
            <el-dropdown-item>Docs</el-dropdown-item>
          </a>
          <el-dropdown-item divided @click.native="logout">
            <span style="display:block;">Log Out</span>
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'

export default {
  components: {
    Breadcrumb,
    Hamburger
  },
  computed: {
    ...mapGetters([
      'sidebar',
      'avatar'
    ]),
    toIndex() { // 根據(jù)路徑綁定到對應(yīng)的一級菜單,防止頁面刷新重新跳回第一個
      return '/' + this.$route.path.split('/')[1]
    }
  },
  // eslint-disable-next-line vue/order-in-components
  data() {
    return {
      menuList: [ // 水平一級菜單欄的菜單

      ]
    }
  },
  mounted() {
  // 初始化菜單數(shù)據(jù)
    this.initMenuList()
  },
  methods: {
  // 重點(diǎn)二:
  // 因?yàn)檎麄€項(xiàng)目工程比較大,所以當(dāng)時(shí)搭建了一個demo,菜單數(shù)據(jù)我寫在了本地;
  // 大家在實(shí)現(xiàn)的時(shí)候可以通過上邊第一種方法;
  // 后臺獲取回來數(shù)據(jù)以后通過 router.addRoutes(獲取回來的菜單數(shù)組)方法;
  // 動態(tài)的掛載到我們的router上。
    initMenuList() {
      const menuList = ['/login', '/404']
      this.menuList = this.$router.options.routes.filter((v, i) => {
        return v.path !== menuList[i]
      })
    },
    // 重點(diǎn)三:
    // 根據(jù)當(dāng)前惦記的頂部模塊菜單去切換左側(cè)菜單欄,把當(dāng)前點(diǎn)擊的菜單path存在vuex里
    // 我這邊是存在了store/modules/user里邊,這個沒有要求,小伙伴們隨意
    handleSelect(path) {
      this.$store.dispatch('user/setPath', path)
    },

    toggleSideBar() {
      this.$store.dispatch('app/toggleSideBar')
    },
    async logout() {
      await this.$store.dispatch('user/logout')
      this.$router.push(`/login?redirect=${this.$route.fullPath}`)
    }
  }
}
</script>

<style lang="scss" scoped>
.navbar {
  display: flex;
  justify-content: space-between;
  height: 50px;
  overflow: hidden;
  position: relative;
  background: #fff;
  box-shadow: 0 1px 4px rgba(0,21,41,.08);

  .hamburger-container {
    line-height: 46px;
    height: 100%;
    float: left;
    cursor: pointer;
    transition: background .3s;
    -webkit-tap-highlight-color:transparent;

    &:hover {
      background: rgba(0, 0, 0, .025)
    }
  }

  .breadcrumb-container {
    float: left;
  }

  .right-menu {
    float: right;
    height: 100%;
    line-height: 50px;

    &:focus {
      outline: none;
    }

    .right-menu-item {
      display: inline-block;
      padding: 0 8px;
      height: 100%;
      font-size: 18px;
      color: #5a5e66;
      vertical-align: text-bottom;

      &.hover-effect {
        cursor: pointer;
        transition: background .3s;

        &:hover {
          background: rgba(0, 0, 0, .025)
        }
      }
    }

    .avatar-container {
      margin-right: 30px;

      .avatar-wrapper {
        margin-top: 5px;
        position: relative;

        .user-avatar {
          cursor: pointer;
          width: 40px;
          height: 40px;
          border-radius: 10px;
        }

        .el-icon-caret-bottom {
          cursor: pointer;
          position: absolute;
          right: -20px;
          top: 25px;
          font-size: 12px;
        }
      }
    }
  }
}
  .menuItem{
    height: 47px;
  }
</style>

// src/store/modules/user
import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',
    // 定義以下兩個狀態(tài)
    menuList: [], // 動態(tài)路由
    path: '/' // 當(dāng)前點(diǎn)擊的菜單模塊path
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 定義SET_MENULIST方法用來保存我們的動態(tài)路由
  SET_MENULIST: (state, menuList) => {
    state.menuList = menuList
  },
   // 定義SET_MENULIST方法用來保存我當(dāng)前點(diǎn)擊的頂部模塊菜單path
  SET_PATH: (state, path) => {
    state.path = path
  }
}

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password } = userInfo
    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password: password }).then(response => {
        const { data } = response
        commit('SET_TOKEN', data.token)
        setToken(data.token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },
  
  //定義兩個actions 方法用來執(zhí)行我們上邊定義的SET_MENULIST和SET_PATH
  setMenuList({ commit }, menuList) {
    commit('SET_MENULIST', menuList)
  },
  setPath({ commit }, path) {
    commit('SET_PATH', path)
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response

        if (!data) {
          return reject('Verification failed, please Login again.')
        }

        const { name, avatar } = data

        commit('SET_NAME', name)
        commit('SET_AVATAR', avatar)
        resolve(data)
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state }) {
    return new Promise((resolve, reject) => {
      logout(state.token).then(() => {
        removeToken() // must remove  token  first
        resetRouter()
        commit('RESET_STATE')
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

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


動態(tài)菜單和path都存好了以后我們就可以根據(jù)當(dāng)前點(diǎn)擊的path去動態(tài)的渲染我們的側(cè)邊欄啦

<!--src/layout/components/Sidebar/index.vue-->
<template>
  <div :class="{'has-logo':showLogo}">
    <logo v-if="showLogo" :collapse="isCollapse" />
    <el-scrollbar wrap-class="scrollbar-wrapper">
      <el-menu
        :default-active="activeMenu"
        :collapse="isCollapse"
        :background-color="variables.menuBg"
        :text-color="variables.menuText"
        :unique-opened="false"
        :active-text-color="variables.menuActiveText"
        :collapse-transition="false"
        mode="vertical"
      >
        <sidebar-item v-for="route in menuList" :key="route.path" :item="route" :base-path="route.path" />
      </el-menu>
    </el-scrollbar>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss'

export default {
  components: { SidebarItem, Logo },
  computed: {
    ...mapGetters([
      'sidebar'
    ]),
    routes() {
      return this.$router.options.routes
    },
    activeMenu() {
      const route = this.$route
      const { meta, path } = route
      // if set path, the sidebar will highlight the path you set
      if (meta.activeMenu) {
        return meta.activeMenu
      }
      return path
    },
    showLogo() {
      return this.$store.state.settings.sidebarLogo
    },
    variables() {
      return variables
    },
    isCollapse() {
      return !this.sidebar.opened
    }
  },
  watch: {
  // 因?yàn)槊看吸c(diǎn)擊頂部菜單的時(shí)候path都會改變,所以我們要對它進(jìn)行監(jiān)聽;
  // 通過數(shù)組的filter方法去過濾出來我們想要的菜單數(shù)組就可以啦。
    '$store.state.user.path': {
      handler: function(newVal, oldVal) {
        console.log('新值' + newVal, '舊值' + oldVal)
        console.log('vuex里存的菜單', this.$store.state.user.menuList)
        this.menuList = this.$store.state.user.menuList.filter(v => {
          return newVal === v.path
        })
      }
    }
  },
  mounted() {
  // 頁面渲染時(shí)候獲取一下vuex里的menuList,因?yàn)閯偛旁趘uex里定義的path默認(rèn)給了'/';
  // 所以第一次進(jìn)來的時(shí)候默認(rèn)顯示的首頁
    console.log('當(dāng)前path', this.$store.state.user.path)
    this.$store.dispatch('user/setMenuList', this.$router.options.routes)
    this.menuList = this.$store.state.user.menuList.filter(v => {
      return this.$store.state.user.path === v.path
    })
  },
  // eslint-disable-next-line vue/order-in-components
  data() {
    return {
      menuList: []
    }
  }
}
</script>

??最后

當(dāng)我們接到新需求的時(shí)候,一定要仔細(xì)分析把邏輯梳理清楚了;復(fù)雜的話我們可以畫一下流程圖以便我們更好的去寫代碼;萬變不離其宗,思路最重要。小伙伴們?nèi)绻懈玫乃悸罚梢砸黄鸾涣?,共同進(jìn)步。

?原創(chuàng)不易,還希望各位大佬支持一下!
?? 點(diǎn)贊,你的認(rèn)可是我創(chuàng)作的動力!
?? 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進(jìn)步的財(cái)富!文章來源地址http://www.zghlxwxcb.cn/news/detail-794763.html

到了這里,關(guān)于Vue實(shí)戰(zhàn)【調(diào)整Vue-element-admin中的菜單欄,并添加頂部模塊菜單欄】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 后臺管理系統(tǒng)模板推薦(vue-element-admin)

    后臺管理系統(tǒng)模板推薦(vue-element-admin)

    vue-element-admin 是基于vue 和 Element-ui 的一套后臺管理系統(tǒng)集成的模板 GitHub地址: https://github.com/PanJiaChen/vue-element-admin 項(xiàng)目在線預(yù)覽: https://panjiachen.gitee.io/vue-element-admin 由尚硅谷提供的 登錄頁面 主頁面 element-ui 是餓了么前端出品的基于 Vue.js的 后臺組件庫,方便程序員進(jìn)行頁

    2024年02月16日
    瀏覽(20)
  • 虛擬機(jī)Ubuntu下運(yùn)行vue-element-admin項(xiàng)目

    虛擬機(jī)Ubuntu下運(yùn)行vue-element-admin項(xiàng)目

    首先附上vue-element-admin項(xiàng)目的相關(guān)介紹鏈接 介紹 | vue-element-admin (gitee.io) 一.環(huán)境搭建 1.安裝nodejs 安裝完成后,查看對應(yīng)的版本號 沒有問題,會輸出對應(yīng)版本號,我這里是10.19.0 2.安裝npm 安裝完成查看對應(yīng)的版本號,確認(rèn)OK 我這里是版本是6.14.4 3.安裝Vue 同樣查看一下版本號確

    2024年02月07日
    瀏覽(20)
  • 6. vue-element-admin 二次開發(fā)避坑指南

    6. vue-element-admin 二次開發(fā)避坑指南

    上一篇博文,我們分享了vue-element-admin二次開發(fā)的改造優(yōu)化技巧,這篇博文匯總 vue-element-admin 二次開發(fā)可能遇到的坑。 1.1.1 切換標(biāo)簽時(shí)未保存頁面的操作內(nèi)容 有時(shí)候會發(fā)現(xiàn)一個神奇的現(xiàn)象,當(dāng)打開多個tab標(biāo)簽,然后當(dāng)修改某個標(biāo)簽頁面內(nèi)容,再次切換標(biāo)簽頁面的時(shí)候,會發(fā)

    2024年02月10日
    瀏覽(22)
  • 安裝運(yùn)行vue-element-admin的報(bào)錯問題-解決辦法

    安裝運(yùn)行vue-element-admin的報(bào)錯問題-解決辦法

    官網(wǎng)安裝鏈接如下: https://panjiachen.gitee.io/vue-element-admin-site/zh/guide/#%E5%AE%89%E8%A3%85 我遇到的報(bào)錯主要在以下階段: 按上方安裝鏈接里git clone后npm install無法安裝 npm install完成后無法啟動,即npm run dev失敗 后經(jīng)查找網(wǎng)上各種資料,于 2022.11.20 完成安裝并成功運(yùn)行。 下面將分這兩

    2023年04月23日
    瀏覽(102)
  • Vue-Element-Admin項(xiàng)目學(xué)習(xí)筆記(6)Vuex狀態(tài)管理

    Vue-Element-Admin項(xiàng)目學(xué)習(xí)筆記(6)Vuex狀態(tài)管理

    前情回顧: vue-element-admin項(xiàng)目學(xué)習(xí)筆記(1)安裝、配置、啟動項(xiàng)目 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(2)main.js 文件分析 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(3)路由分析一:靜態(tài)路由 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(4)路由分析二:動態(tài)路由及permission.js vue-element-admin項(xiàng)目學(xué)習(xí)筆記(5)路由分析

    2024年02月09日
    瀏覽(27)
  • Vue-element-admin項(xiàng)目中完全移除ES lint

    由于不需要用到eslint,因此需要完全移除此插件,過程如下: 在項(xiàng)目根目錄下,執(zhí)行以下命令,卸載與 ESLint 相關(guān)的依賴包: npm uninstall @vue/cli-plugin-eslint lint-staged husky eslint babel-eslint eslint-config-standard eslint-friendly-formatter eslint-loader eslint-plugin-html eslint-plugin-promise eslint-plugin-s

    2024年02月07日
    瀏覽(30)
  • 【Vue-Element-Admin】導(dǎo)出el-table全部數(shù)據(jù)

    因?yàn)閑l-table實(shí)現(xiàn)了分頁查詢,所以想要實(shí)現(xiàn)el-table需要重新編寫一個查詢?nèi)繑?shù)據(jù)的方法 listQuery:

    2024年02月09日
    瀏覽(21)
  • 課程13:vue-element-admin安裝與移除實(shí)例代碼

    本文是《.Net Core從零學(xué)習(xí)搭建權(quán)限管理系統(tǒng)》教程專欄的課程(點(diǎn)擊

    2024年02月08日
    瀏覽(18)
  • Vue-Element-Admin項(xiàng)目學(xué)習(xí)筆記(9)表單組件封裝,父子組件雙向通信

    Vue-Element-Admin項(xiàng)目學(xué)習(xí)筆記(9)表單組件封裝,父子組件雙向通信

    前情回顧: vue-element-admin項(xiàng)目學(xué)習(xí)筆記(1)安裝、配置、啟動項(xiàng)目 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(2)main.js 文件分析 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(3)路由分析一:靜態(tài)路由 vue-element-admin項(xiàng)目學(xué)習(xí)筆記(4)路由分析二:動態(tài)路由及permission.js vue-element-admin項(xiàng)目學(xué)習(xí)筆記(5)路由分析

    2024年02月11日
    瀏覽(28)
  • vue-element-admin項(xiàng)目-Host key verification failed.-已解決

    vue-element-admin項(xiàng)目-Host key verification failed.-已解決

    在網(wǎng)上下載的element-admin項(xiàng)目,install的時(shí)候一直報(bào)錯Host key verification failed, 實(shí)測好用?。。∫呀鉀Q 報(bào)錯問題: 上面寫到主機(jī)密鑰驗(yàn)證失敗,無法從遠(yuǎn)程倉庫拉取。說明我們需要生成一個新的密鑰,然后添加到遠(yuǎn)程倉庫 ? ? 打開 Git Bash 終端,將下面的文本復(fù)制進(jìn)去執(zhí)行(使

    2024年02月08日
    瀏覽(101)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包