Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装
生活随笔
收集整理的這篇文章主要介紹了
Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
組件封裝
為了避免組件代碼的臃腫,這里對主要的功能部件進(jìn)行封裝,保證代碼的模塊化和簡潔度。
組件結(jié)構(gòu)
組件封裝重構(gòu)后,試圖組件結(jié)構(gòu)如下圖所示
代碼一覽
Home組件被簡化,包含導(dǎo)航、頭部和主內(nèi)容三個組件。
Home.vue
<template><div class="container"><!-- 導(dǎo)航菜單欄 --><MenuBar></MenuBar><!-- 頭部區(qū)域 --><HeadBar></HeadBar><!-- 主內(nèi)容區(qū)域 --><Main></Main></div> </template><script> import HeadBar from "./HeadBar/HeadBar" import MenuBar from "./MenuBar/MenuBar" import Main from "./Main/Main" export default {components:{HeadBar,MenuBar,Main} }; </script><style scoped lang="scss">.container {position:absolute;top: 0px;left: 0px;right: 0px;background: #4b5f6e;} </style>HeadBar.vue
<template> <div class="container"><!-- 導(dǎo)航菜單隱藏顯示切換 --><span class="collapse-switcher" @click.prevent="collapse"><i class="el-icon-menu"></i></span><!-- 導(dǎo)航菜單 --><span class="nav-bar"><el-menu :default-active="activeIndex" class="el-menu-demo" text-color="#fff"active-text-color="#ffd04b" mode="horizontal" @select="selectNavBar()"><el-menu-item index="1" @click="$router.push('/')">{{$t("common.home")}}</el-menu-item><el-menu-item index="2">{{$t("common.doc")}}</el-menu-item><el-menu-item index="3">{{$t("common.msgCenter")}}</el-menu-item></el-menu></span><span class="tool-bar"><!-- 主題切換 --><ThemePicker class="theme-picker"></ThemePicker><!-- 語言切換 --><LangSelector class="lang-selector"></LangSelector> <!-- 用戶信息 --><el-dropdown class="user-info-dropdown" trigger="hover"><span class="el-dropdown-link"><img :src="this.userAvatar" /> {{username}}</span><el-dropdown-menu slot="dropdown"><el-dropdown-item>{{$t("common.myMsg")}}</el-dropdown-item><el-dropdown-item>{{$t("common.config")}}</el-dropdown-item><el-dropdown-item divided @click.native="logout">{{$t("common.logout")}}</el-dropdown-item></el-dropdown-menu></el-dropdown></span></div> </template><script> import mock from "@/mock/index.js"; import ThemePicker from "@/components/ThemePicker" import LangSelector from "@/components/LangSelector" export default {components:{ThemePicker,LangSelector},data() {return {isCollapse: false,username: "Louis",userAvatar: "",activeIndex: '1'};},methods: {selectNavBar(key, keyPath) {console.log(key, keyPath)},// 語言切換 handleCommand(command) {let array = command.split(':')let lang = array[0] === '' ? 'zh_cn' : array[0]let label = array[1]document.getElementById("language").innerHTML = labelthis.$i18n.locale = lang},//折疊導(dǎo)航欄collapse: function() {this.isCollapse = !this.isCollapse;},//退出登錄logout: function() {var _this = this;this.$confirm("確認(rèn)退出嗎?", "提示", {type: "warning"}).then(() => {sessionStorage.removeItem("user");this.$router.push("/login");}).catch(() => {});}},mounted() {this.sysName = "I like Kitty";var user = sessionStorage.getItem("user");if (user) {this.userName = user;this.userAvatar = require("@/assets/user.png");}} }; </script><style scoped lang="scss"> .container {position: absolute;left: 200px;right: 0px;height: 60px;line-height: 60px;.collapse-switcher {width: 40px;float: left;cursor: pointer;border-color: rgba(111, 123, 131, 0.8);border-left-width: 1px;border-left-style: solid;border-right-width: 1px;border-right-style: solid;color: white;background: #504e6180;}.nav-bar {margin-left: auto;float: left;.el-menu {background: #504e6180;}}.tool-bar {float: right;.theme-picker {padding-right: 10px;}.lang-selector {padding-right: 10px;font-size: 15px;color: #fff;cursor: pointer;}.user-info-dropdown {font-size: 20px;padding-right: 20px;color: #fff;cursor: pointer;img {width: 40px;height: 40px;border-radius: 10px;margin: 10px 0px 10px 10px;float: right;}}} } </style>MenuBar.vue
<template><div class="menu-bar-container"><!-- logo --><div class="logo" :class="isCollapse?'menu-bar-collapse-width':'menu-bar-width'"><img :src="this.logo" /> <div>{{isCollapse?'':sysName}}</div></div><!-- 導(dǎo)航菜單 --><el-menu default-active="1-1" :class="isCollapse?'menu-bar-collapse-width':'menu-bar-width'" @open="handleopen" @close="handleclose" @select="handleselect" :collapse="isCollapse"><el-submenu index="1"><template slot="title"><i class="el-icon-location"></i><span slot="title">{{$t("sys.sysMng")}}</span></template><el-menu-item index="1-1" @click="$router.push('user')">{{$t("sys.userMng")}}</el-menu-item><el-menu-item index="1-2" @click="$router.push('dept')">{{$t("sys.deptMng")}}</el-menu-item><el-menu-item index="1-3" @click="$router.push('role')">{{$t("sys.roleMng")}}</el-menu-item><el-menu-item index="1-4" @click="$router.push('menu')">{{$t("sys.menuMng")}}</el-menu-item><el-menu-item index="1-5" @click="$router.push('log')">{{$t("sys.logMng")}}</el-menu-item></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-location"></i><span slot="title">{{$t("sys.sysMonitor")}}</span></template></el-submenu><el-menu-item index="3" disabled><i class="el-icon-document"></i><span slot="title">{{$t("sys.nav3")}}</span></el-menu-item><el-menu-item index="4"><i class="el-icon-setting"></i><span slot="title">{{$t("sys.nv4")}}</span></el-menu-item></el-menu></div> </template><script> export default {data() {return {isCollapse: false,sysName: "",logo: "",};},methods: {handleopen() {console.log('handleopen');},handleclose() {console.log('handleclose');},handleselect(a, b) {console.log('handleselect');}},mounted() {this.sysName = "I like Kitty";this.logo = require("@/assets/logo.png");} }; </script><style scoped lang="scss"> .menu-bar-container {.el-menu {position:absolute;top: 60px;bottom: 0px;text-align: left;}.logo {position:absolute;top: 0px;height: 60px; line-height: 60px;background: #4b5f6e;img {width: 40px;height: 40px;border-radius: 0px;margin: 10px 10px 10px 10px;float: left;}div {font-size: 22px;color: white;text-align: left;}}.menu-bar-width {width: 200px;}.menu-bar-collapse-width {width: 65px;} } </style>Main.vue
<template><div class="container"><el-breadcrumb separator="/" class="breadcrumb"><el-breadcrumb-item v-for="item in $route.matched" :key="item.path"><a href="www.baidu.com">{{ item.name }}</a></el-breadcrumb-item></el-breadcrumb><transition name="fade" mode="out-in"><router-view></router-view></transition></div> </template><script> export default {data() {return {};},methods: {},mounted() {} }; </script><style scoped lang="scss"> .container {position: absolute;top: 60px;bottom: 0px;left: 200px;right: 0px;.breadcrumb {padding: 10px; border-color: rgba(38, 86, 114, 0.2);border-bottom-width: 1px;border-bottom-style: solid;background: rgba(138, 158, 170, 0.2);} } </style>國際化語言切換也被封裝成為了組件?LangSelector
LangSelector/index.js
<template><el-dropdown class="lang-selector" @command="handleCommand"><span class="el-dropdown-link"><span id="language">中文</span><i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-item command="zh_cn:中文">中文</el-dropdown-item><el-dropdown-item command="en_us:English">English</el-dropdown-item></el-dropdown-menu></el-dropdown> </template><script>export default {methods: {// 語言切換 handleCommand(command) {let array = command.split(':')let lang = array[0] === '' ? 'zh_cn' : array[0]let label = array[1]document.getElementById("language").innerHTML = labelthis.$i18n.locale = lang}}} </script>組件封裝重構(gòu)之后,同步修改路由配置
import Vue from 'vue' import Router from 'vue-router' import Login from '@/views/Login' import NotFound from '@/views/404' import Home from '@/views/Home' import Intro from '@/views/Intro' import User from '@/views/SysMng/User' import Dept from '@/views/SysMng/Dept' import Role from '@/views/SysMng/Role' import Menu from '@/views/SysMng/Menu' import Log from '@/views/SysMng/Log'Vue.use(Router)const router = new Router({routes: [{path: '/',name: '首頁',component: Home,children: [{ path: '', component: Intro, name: '系統(tǒng)介紹' },{ path: '/user', component: User, name: '用戶管理' },{ path: '/dept', component: Dept, name: '機構(gòu)管理' },{ path: '/role', component: Role, name: '角色管理' },{ path: '/menu', component: Menu, name: '菜單管理' },{ path: '/log', component: Log, name: '日志管理' }]},{path: '/login',name: '登錄',component: Login},{path: '/404',name: 'notFound',component: NotFound}] })router.beforeEach((to, from, next) => {// 登錄界面登錄成功之后,會把用戶信息保存在會話// 存在時間為會話生命周期,頁面關(guān)閉即失效。let user = sessionStorage.getItem('user');if (to.path == '/login') {// 如果是訪問登錄界面,如果用戶會話信息存在,代表已登錄過,跳轉(zhuǎn)到主頁if(user) {next({ path: '/' })} else {next()}} else {// 如果訪問非登錄界面,且戶會話信息不存在,代表未登錄,則跳轉(zhuǎn)到登錄界面if (!user) {next({ path: '/login' })} else {next()}} })export default router測試效果
封裝重構(gòu)之后,啟動界面,效果跟之前差別不大。
?
?
?
源碼下載
后端:https://gitee.com/liuge1988/kitty
前端:https://gitee.com/liuge1988/kitty-ui.git
作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/?
版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明原文作者及出處。
轉(zhuǎn)載于:https://www.cnblogs.com/xifengxiaoma/p/9556328.html
總結(jié)
以上是生活随笔為你收集整理的Vue + Element UI 实现权限管理系统 前端篇(七):功能组件封装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 假设朝鲜发生政变的电影是叫什么
- 下一篇: _itemmod_day_limit