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

Vue2動(dòng)態(tài)路由

這篇具有很好參考價(jià)值的文章主要介紹了Vue2動(dòng)態(tài)路由。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

應(yīng)用場(chǎng)景:

?

一般管理端的菜單欄是根據(jù)登錄用戶角色不同,動(dòng)態(tài)生成的,在vue中我們不止菜單欄需要?jiǎng)討B(tài)生成,同時(shí)我們路由也需要?jiǎng)討B(tài)生成。

使用到的組件:

組件名稱 組件版本 組件作用
axios 1.3.4 用于發(fā)送請(qǐng)求獲取數(shù)據(jù)
element-ui 2.15.13 前端ui組件庫(kù),制作頁(yè)面使用
vue-router 3.5.1 vue路由組件
vuex 3.6.2 路由狀態(tài)管理
mockjs 1.1.0 模擬后臺(tái)返回?cái)?shù)據(jù)接口

代碼實(shí)現(xiàn):

項(xiàng)目結(jié)構(gòu):

vue2動(dòng)態(tài)路由,vue.js,javascript,前端,ui,ecmascript

axios相關(guān)代碼

http.js

import axios from 'axios'
import router from '@/router/index.js'
import ElementUI from 'element-ui'
const request = axios.create({
  // baseURL: 'http://192.168.1.150:8888/'
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

request.interceptors.response.use(config => {
  const code = config.data.code
  if (code === 200) {
    return config
  } else {
    ElementUI.Message('服務(wù)忙')
    return Promise.reject
  }
}, error => {
  switch (error.response.status) {
    case 404:
      router.push('/404')
      break
    case 500:
      ElementUI.Message('error')
  }
  return Promise.reject
})
export default request

login.js

import request from '@/utils/http.js'

/**
 * 獲取驗(yàn)證碼
 */
export function code () {
  return request({
    url: '/getCode',
    method: 'get'
  })
}
/**
 * 登錄
 */
export function loginAPI (loginInfo) {
  return request({
    url: '/login',
    method: 'post',
    data: {
      loginInfo
    }
  })
}

/**
 * 獲取菜單
 */
export function getMenu () {
  return request({
    url: '/sys/getMenu',
    method: 'post'
  })
}

mock.js

import Mock from 'mockjs'

const Random = Mock.Random
const R = {
  code: 200,
  message: '執(zhí)行成功',
  data: null
}
// 獲取驗(yàn)證碼
Mock.mock('/getCode', 'get', () => {
  R.data = {
    token: Random.string(32),
    imageUri: Random.dataImage('100x100', '8878')
  }
  return R
})
// 登錄
Mock.mock('/login', 'post', (value) => {
  console.log(value)
  R.data = {
    token: 'token'
  }
  return R
})
// 獲取菜單欄信息
Mock.mock('/sys/getMenu', 'post', () => {
  const menu = [{
    id: 1,
    title: '系統(tǒng)設(shè)置',
    name: 'settings',
    path: '/sys',
    icon: 'el-icon-setting',
    component: '/sys/SysSettings.vue',
    children: [
      {
        id: 2,
        title: '用戶管理',
        name: 'user',
        path: '/sys/user',
        component: '/sys/UserInfo.vue',
        icon: 'el-icon-user'
      },
      {
        id: 3,
        title: '角色管理',
        name: 'role',
        path: '/sys/role',
        component: '/sys/RoleInfo.vue',
        icon: 'el-icon-menu'
      },
      {
        id: 4,
        title: '權(quán)限管理',
        name: 'menu',
        path: '/sys/menu',
        component: '/sys/MenuInfo.vue',
        icon: 'el-icon-menu'
      }
    ]
  }]
  const role = []
  R.data = { menu, role }
  return R
})

vuex相關(guān)代碼

menu.js

import Vue from 'vue'
import Vuex from 'vuex'
import { getMenu } from '@/api/login.js'

Vue.use(Vuex)

export default {
  state: {
    menuList: [],
    flag: false
  },
  getters: {
  },
  mutations: {
    updateMenu (state, value) {
      state.menuList = value
    },
    updateFlag (state, value) {
      state.flag = value
    }
  },
  actions: {
    async httpGetMenu (store) {
      const { data } = await getMenu()
      store.commit('updateMenu', data.data.menu)
      store.commit('updateFlag', true)
    }
  }
}

index.js

import Vue from 'vue'
import Vuex from 'vuex'
import menu from '@/store/modules/Menu.js'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    token: ''
  },
  getters: {
  },
  mutations: {
    updateToken (state, value) {
      state.token = value
      localStorage.setItem('token', value)
    },
    restState (stste) {
      stste.token = ''
    }
  },
  actions: {
  },
  modules: {
    namespaced: true,
    menu
  }
})

vue-router

import Vue from 'vue'
import VueRouter from 'vue-router'
import UserLogin from '@/views/UserLogin.vue'
import HomeIndex from '@/views/HomeIndex.vue'
import store from '@/store/index.js'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    name: 'login',
    component: UserLogin
  },
  {
    path: '/home',
    name: 'home',
    component: HomeIndex,
    children: []
  }

]

const router = new VueRouter({
  routes
})
router.beforeEach(async (to, form, next) => {
  const flag = store.state.menu.flag
  if (!flag) {
    await store.dispatch('httpGetMenu')
    const menuList = store.state.menu.menuList
    for (const i in menuList) {
      if (menuList[i].children) {
        for (let j = 0; j < menuList[i].children.length; j++) {
          const childrenMenu = {
            path: menuList[i].children[j].path,
            name: menuList[i].children[j].name,
            children: []
          }
          childrenMenu.component = () => import('@/views' + menuList[i].children[j].component)
          router.addRoute('home', childrenMenu)
          next({ ...to, replace: true })
        }
      }
    }
  }
  next()
})

// 獲取原型對(duì)象push函數(shù)
const originalPush = VueRouter.prototype.push

// 獲取原型對(duì)象replace函數(shù)
const originalReplace = VueRouter.prototype.replace

// 修改原型對(duì)象中的push函數(shù)
VueRouter.prototype.push = function push (location) {
  return originalPush.call(this, location).catch(err => err)
}

// 修改原型對(duì)象中的replace函數(shù)
VueRouter.prototype.replace = function replace (location) {
  return originalReplace.call(this, location).catch(err => err)
}
export default router

home.vue文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-828484.html

<template>
  <div class="home_root">
    <el-container>
      <el-header
        >物業(yè)管理
        <el-dropdown :hide-on-click="false">
          <span class="el-dropdown-link">
            設(shè)置<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>個(gè)人中心</el-dropdown-item>
            <el-dropdown-item @click.native="loginOut()">退出</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </el-header>
      <el-container>
        <el-aside width="200px">
          <el-col>
            <el-menu
              default-active="2"
              class="el-menu-vertical-demo"
              background-color="#545c64"
              text-color="#fff"
              active-text-color="#ffd04b"
            >
              <el-submenu
                :index="menu.id + ''"
                v-for="menu in menuList"
                :key="menu.id"
              >
                <template slot="title">
                  <i :class="menu.icon"></i>
                  <span>{{ menu.title }}</span>
                </template>
                <el-menu-item
                  :index="children.id + ''"
                  v-for="children in menu.children"
                  :key="children.id"
                >
                  <template slot="title">
                    <div @click="openUri(children.path)">
                      <i :class="children.icon"></i>
                      <span slot="title">{{ children.title }}</span>
                    </div>
                  </template>
                </el-menu-item>
              </el-submenu>
            </el-menu>
          </el-col>
        </el-aside>
        <el-main>
          <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>

<script>
export default {
  computed: {
    menuList () {
      return this.$store.state.menu.menuList
    }
  },
  methods: {
    handleClose (tag) {
      this.tags.splice(this.tags.indexOf(tag), 1)
    },
    openUri (uri) {
      this.$router.push(uri)
    },
    loginOut () {
      console.log('loginOut')
      localStorage.clear()
      sessionStorage.clear()
      this.$store.commit('restState')
      this.$router.push('/')
    }
  }
}
</script>

<style lang="less" scoped>
.home_root {
  padding: 0;
  margin: 0;
  height: 100vh;
}
.el-container {
  padding: 0;
  margin: 0;
  height: 100%;
}
.el-header,
.el-footer {
  background-color: #b3c0d1;
  color: #333;
  text-align: center;
  line-height: 60px;
}

.el-aside {
  background-color: #d3dce6;
  color: #333;
  text-align: center;
  line-height: 200px;
}

.el-main {
  background-color: #e9eef3;
  color: #333;
  // text-align: center;
  // line-height: 160px;
  padding: 0;
}

body > .el-container {
  margin-bottom: 40px;
}

.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {
  line-height: 260px;
}

.el-container:nth-child(7) .el-aside {
  line-height: 320px;
}
.el-dropdown {
  float: right;
}
.el-dropdown-link {
  cursor: pointer;
  color: #060606;
}
.el-icon-arrow-down {
  font-size: 12px;
}
.el-col-24 {
  height: 100%;
  .el-menu {
    height: 100%;
  }
}
</style>

到了這里,關(guān)于Vue2動(dòng)態(tài)路由的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • vue2+antd——實(shí)現(xiàn)動(dòng)態(tài)菜單路由功能——基礎(chǔ)積累

    vue2+antd——實(shí)現(xiàn)動(dòng)態(tài)菜單路由功能——基礎(chǔ)積累

    最近在寫后臺(tái)管理系統(tǒng),遇到一個(gè)需求就是要將之前的靜態(tài)路由改為動(dòng)態(tài)路由,使用的后臺(tái)框架是: vue-antd-admin 然后通過(guò) loadRoutes 方法來(lái)實(shí)現(xiàn)異步動(dòng)態(tài)路由。 如上圖所示,需要在登錄接口調(diào)用成功后,書(shū)寫以下的代碼: import { loadRoutes } from \\\'@/utils/routerUtil.js\\\'; import { getCodeL

    2024年02月08日
    瀏覽(21)
  • 前端vue2、vue3去掉url路由“ # ”號(hào)——nginx配置

    前端vue2、vue3去掉url路由“ # ”號(hào)——nginx配置

    大家好,我是yma16,本文分享關(guān)于vue2、vue3去掉url路由 # 號(hào)——nginx配置。 html的 hash模式 HTML的hash模式指的是URL中的錨點(diǎn)部分(#后面的內(nèi)容)被用于在單個(gè)頁(yè)面中顯示不同的內(nèi)容,而不是導(dǎo)航到不同的頁(yè)面。例如: 在這個(gè)示例中, #about 部分是一個(gè)錨點(diǎn),用于在頁(yè)面上顯示關(guān)

    2024年02月11日
    瀏覽(101)
  • Vue2 +Element-ui實(shí)現(xiàn)前端頁(yè)面

    Vue2 +Element-ui實(shí)現(xiàn)前端頁(yè)面

    以一個(gè)簡(jiǎn)單的前端頁(yè)面為例。主要是利用vue和element-ui實(shí)現(xiàn)。 里面涉及的主要包括:新建vue項(xiàng)目、一行多個(gè)輸入框、頁(yè)面實(shí)現(xiàn)等。 ? ①首先安裝nodejs,這部分在此就不講啦。 ②然后安裝vue-cli: 查看是否安裝成功: 安裝成功之后就輸出vue的版本 ③在cmd窗口新建一個(gè)vue2腳手架

    2024年02月16日
    瀏覽(34)
  • 管理系統(tǒng)的前端模板(vue2+Element UI)

    管理系統(tǒng)的前端模板(vue2+Element UI)

    目錄 前言 一、模板展示圖 二、獲取的方式及操作運(yùn)行步驟? (一)獲取方式 (二)操作步驟? 1.下載安裝node.js? 2.下載完成解壓縮后在idea的里面打開(kāi)終端。 3.輸入下載相關(guān)依賴的命令 4.運(yùn)行項(xiàng)目的命令 5.然后把給到的地址瀏覽器打開(kāi)就可以了 ?三、代碼的展示(這個(gè)點(diǎn)的內(nèi)

    2024年02月05日
    瀏覽(31)
  • 【Vue框架】Vue2中Vue.js路由—路由介紹、路由控制組件切換、路由重定向、路由傳參、嵌套路由、路由布局(附源碼詳解)

    【Vue框架】Vue2中Vue.js路由—路由介紹、路由控制組件切換、路由重定向、路由傳參、嵌套路由、路由布局(附源碼詳解)

    Vue Router官方文檔 :https://router.vuejs.org/zh/installation.html 使用路由文件: 1.引用vue-router路由js文件 2.創(chuàng)建router對(duì)象 3.在vm對(duì)象中注冊(cè)router對(duì)象 4.在視圖中使用 router-view 標(biāo)簽 第一種傳參形式——路由路徑進(jìn)行傳參,如:/login?id=20 第二種傳參形式——路由占位符進(jìn)行傳參,如:/

    2023年04月08日
    瀏覽(27)
  • 【前端vue升級(jí)】vue2+js+elementUI升級(jí)為vue3+ts+elementUI plus

    【前端vue升級(jí)】vue2+js+elementUI升級(jí)為vue3+ts+elementUI plus

    gogo code 是一個(gè)基于 AST (源代碼的抽象語(yǔ)法結(jié)構(gòu)樹(shù)狀表現(xiàn)形式)的 JavaScript/Typescript/HTML 代碼轉(zhuǎn)換工具,可以用它來(lái)構(gòu)建一個(gè)代碼轉(zhuǎn)換程序來(lái)幫助自動(dòng)化完成如框架升級(jí)、代碼重構(gòu)、多平臺(tái)轉(zhuǎn)換等工作。 當(dāng)前 GoGoCode 支持解析和操作如下類型的代碼: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    瀏覽(31)
  • vue2創(chuàng)建項(xiàng)目的兩種方式,配置路由vue-router,引入element-ui

    vue2創(chuàng)建項(xiàng)目的兩種方式,配置路由vue-router,引入element-ui

    提示:vue2依賴node版本8.0以上 使用@vue/cli腳手架vue create創(chuàng)建 使用vue-cli腳手架vue init webpack創(chuàng)建 1、查看nodejs版本 2、全局安裝vue腳手架和webpack腳手架 3、新建vue2項(xiàng)目 創(chuàng)建選項(xiàng)除了,Install vue-router??選擇是,其他選擇的否 4、安裝依賴并啟動(dòng)文件 5、預(yù)覽 6、目錄結(jié)構(gòu) 1、如果安

    2024年04月14日
    瀏覽(27)
  • 前端2023最全面試題(javaScript、typeScript、vue2、vue3、html、css、uniapp、webpack、vite、react)

    答案:JavaScript中的閉包是一種函數(shù),它有權(quán)訪問(wèn)其詞法環(huán)境的變量和其它函數(shù)。這意味著,即使其包含它的函數(shù)已經(jīng)執(zhí)行完畢,其詞法環(huán)境仍然存在,因此可以訪問(wèn)其作用域內(nèi)的變量。 答案:回調(diào)函數(shù)是在某個(gè)特定事件之后執(zhí)行的函數(shù)。在JavaScript中,通常使用回調(diào)函數(shù)來(lái)處

    2024年02月06日
    瀏覽(34)
  • Vue2路由:手動(dòng)配置使用路由&路由嵌套、路由動(dòng)態(tài)傳參(:參數(shù),query、props)、編程式導(dǎo)航(back、go)、導(dǎo)航守衛(wèi)

    Vue2路由:手動(dòng)配置使用路由&路由嵌套、路由動(dòng)態(tài)傳參(:參數(shù),query、props)、編程式導(dǎo)航(back、go)、導(dǎo)航守衛(wèi)

    過(guò)了一遍vue2的router,整理一下小結(jié) 目錄 一、前端路由的概念與原理 1.1 什么是路由 1.2 路由的工作方式 二、vue-router的基本使用 2.1 安裝、配置、使用router 2.2 redirect重定向 三、嵌套路由 3.1 聲明子路由的規(guī)則 3.2 默認(rèn)子路由 四、動(dòng)態(tài)路由 4.1 動(dòng)態(tài)路由的概念 4.2 動(dòng)態(tài)路由取參方

    2024年02月05日
    瀏覽(24)
  • 【手機(jī)號(hào)驗(yàn)證/前端】Vue2+elementUI編寫一個(gè)手機(jī)號(hào)驗(yàn)證碼登錄頁(yè)面,路由式開(kāi)發(fā)(附完整代碼)

    【手機(jī)號(hào)驗(yàn)證/前端】Vue2+elementUI編寫一個(gè)手機(jī)號(hào)驗(yàn)證碼登錄頁(yè)面,路由式開(kāi)發(fā)(附完整代碼)

    目錄 效果圖: 一、template部分 二、style樣式 三、script部分 1.先對(duì)手機(jī)號(hào)的格式進(jìn)行一個(gè)判斷 2.接下來(lái)就是表單驗(yàn)證規(guī)則rules 3.最后就是methods了 (1)首先我們給獲取驗(yàn)證碼綁定一個(gè)方法 (2)然后封裝一個(gè)axios接口,方便后面測(cè)試聯(lián)調(diào)(這部分每個(gè)人封裝的都不一樣) (3)然

    2024年02月17日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包