组件封装
在上一篇记录中,首页中有太多的代码,为了避免代码的臃肿,需要对主要的功能模块拆分,来让代码看起来更简洁,且能进行复用。
拆分后还加了些小功能,加入了修改 title 的代码,修改方式参考vue 动态修改 title。
还增加了当前请求的页面缓存,使用状态管理器处理。监听路由,保存到 state 中,来处理的。 如何监听可参考vue 计算属性和监听属性。
完整效果图如下:
首页布局拆分后结构
拆分后的,布局结构图:
拆分后代码
布局最外层 index 代码,使用头部,侧边栏,主内容栏组成,代码如下:
<!-- 布局的首页 --> <template> <div> <l-header></l-header> <l-aside></l-aside> <l-main></l-main> </div> </template> <script> import LHeader from './components/header' import LAside from './components/aside' import LMain from './components/main' export default { data() { return {} }, //引入组件 components: { LHeader, LAside, LMain, }, } </script> <style lang="scss" scoped></style>
头部 index.vue 代码:
<!-- 头部文件 --> <template> <div class="header"> <!-- logo --> <logo></logo> <!-- 折叠按钮 --> <hamburger></hamburger> <!-- 头部导航栏 --> <div class="heardNavBar"> <el-menu default-active="1" class="el-menu-demo" background-color="#4b5f6e" text-color="#fff" active-text-color="#ffd04b" mode="horizontal"> <el-menu-item index="1" @click="$router.push('/')">首页</el-menu-item> <el-menu-item index="2" @click="openUrl('#')">使用文档</el-menu-item> <el-menu-item index="3" @click="openUrl('https://github.com/levy-w-wang/lion-ui')">GitHub</el-menu-item> </el-menu> </div> <!-- 右侧信息 --> <div style="float:right"> <!-- 全屏 --> <div style="float:left;line-height: 60px; padding: 0 10px;"> <i class="el-icon-full-screen" @click="toggleFull"></i> </div> <!-- 个人信息 --> <div class="userinfo"> <el-dropdown trigger="hover"> <span class="el-dropdown-link userinfo-inner"> <img src="/UploadFiles/2021-04-02/user.jpg">头部中引用的相关组件代码如下
折叠导航栏 hamburger 下的 index.vue 代码:
<template> <div @click="toggleCollapse"> <svg :class="{ 'is-active': !isCollapse }" class="hamburger" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"> <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" /> </svg> </div> </template> <script> import { mapState } from 'vuex' export default { name: 'Hamburger', computed: { ...mapState({ isCollapse: (state) => state.app.isCollapse, }), }, methods: { //折叠导航栏 toggleCollapse: function () { this.$store.commit('toggleCollapse') }, }, } </script> <style scoped> .hamburger { padding-left: 13px; padding-right: 13px; text-align: center; width: 34px; height: 60px; line-height: 60px; float: left; cursor: pointer; } .is-active { transform: rotate(180deg); } </style>折叠导航栏 logo 下的 index.vue 代码:
<!-- --> <template> <div class="logo" :class="isCollapse "> <img v-if="isCollapse" src="/UploadFiles/2021-04-02/logo6065.png">侧边栏下的 index.vue代码:
<!-- aside --> <template> <div class="aside-container" :class="isCollapse "> <!--导航菜单 default-active="1-1"--> <el-menu class="el-menu-vertical-demo" :class="isCollapse " :collapse-transition="false" :unique-opened="true" :collapse="isCollapse"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-setting"></i> <span slot="title">系统管理</span> </template> <el-menu-item index="1-1" @click="$router.push('usermanage')">用户管理</el-menu-item> <el-menu-item index="1-2" @click="$router.push('menumanage')">菜单管理</el-menu-item> </el-submenu> <el-menu-item index="2" disabled> <i class="el-icon-magic-stick"></i> <span slot="title">导航一</span> </el-menu-item> <el-menu-item index="3" disabled> <i class="el-icon-reading"></i> <span slot="title">导航二</span> </el-menu-item> </el-menu> </div> </template> <script> import { mapState } from 'vuex' export default { data() { return {} }, //$store.getters.isCollapse computed: { ...mapState({ isCollapse: (state) => state.app.isCollapse, }), mainTabs: { get() { return this.$store.state.app.mainTabs }, set(val) { this.$store.commit('updateMainTabs', val) }, }, mainTabsActiveName: { get() { return this.$store.state.app.mainTabsActiveName }, set(val) { this.$store.commit('updateMainTabsActiveName', val) }, }, }, watch: { $route: 'handleRoute', }, created() { console.log(this.$route) this.handleRoute(this.$route) }, methods: { // 路由操作处理 handleRoute(route) { // tab标签页选中, 如果不存在则先添加 var tab = this.mainTabs.filter((item) => item.name === route.name)[0] if (!tab) { tab = { name: route.name, title: route.meta.title, icon: route.meta.icon, } this.mainTabs = this.mainTabs.concat(tab) } this.mainTabsActiveName = tab.name }, }, } </script> <style lang="scss" scoped> .aside-container { position: fixed; top: 0px; left: 0; bottom: 0; z-index: 1020; .el-menu { position: absolute; top: 60px; bottom: 0px; text-align: left; } } .aside-width { width: 230px; } .aside-collapse-width { width: 65px; } </style>内容模块下的 index.vue代码:
<!-- --> <template> <div class="main-container clear" :class="isCollapse "> <!-- 标签页 --> <el-tabs class="tabs" :class="isCollapse " v-model="mainTabsActiveName" :closable="true" type="card" @tab-click="selectedTabHandle" @tab-remove="removeTabHandle"> <el-dropdown class="tabs-tools" :show-timeout="0" trigger="hover"> <div style="font-size:20px;width:50px;"> <i class="el-icon-arrow-down"></i> </div> <el-dropdown-menu slot="dropdown"> <el-dropdown-item @click.native="tabsCloseCurrentHandle">关闭当前标签</el-dropdown-item> <el-dropdown-item @click.native="tabsCloseOtherHandle">关闭其它标签</el-dropdown-item> <el-dropdown-item @click.native="tabsCloseAllHandle">关闭全部标签</el-dropdown-item> <el-dropdown-item @click.native="tabsRefreshCurrentHandle">刷新当前标签</el-dropdown-item> </el-dropdown-menu> </el-dropdown> <el-tab-pane v-for="item in mainTabs" :key="item.name" :label="item.title" :name="item.name"> <span slot="label"> <i :class="item.icon"></i> {{ item.title }} </span> </el-tab-pane> </el-tabs> <!-- 主内容区域 --> <div class="main-content"> <keep-alive> <transition name="fade" mode="out-in"> <router-view></router-view> </transition> </keep-alive> </div> </div> </template> <script> import { mapState } from 'vuex' export default { data() { return {} }, computed: { ...mapState({ isCollapse: (state) => state.app.isCollapse, }), mainTabs: { get() { return this.$store.state.app.mainTabs }, set(val) { this.$store.commit('updateMainTabs', val) }, }, mainTabsActiveName: { get() { return this.$store.state.app.mainTabsActiveName }, set(val) { this.$store.commit('updateMainTabsActiveName', val) }, }, }, methods: { // tabs, 选中tab selectedTabHandle(tab) { tab = this.mainTabs.filter((item) => item.name === tab.name) if (tab.length >= 1) { this.$router.push({ name: tab[0].name }) } }, // tabs, 删除tab removeTabHandle(tabName) { // 当只有首页时,不允许关掉。 若是其它页面可关掉后,push 首页进去 if (this.mainTabs.length == 1 && this.mainTabs[0].name == 'index') { return } this.mainTabs = this.mainTabs.filter((item) => item.name !== tabName) if (this.mainTabs.length >= 1) { // 当前选中tab被删除 if (tabName === this.mainTabsActiveName) { this.$router.push({ name: this.mainTabs[this.mainTabs.length - 1].name }, () => { this.mainTabsActiveName = this.$route.name }) } } else { this.$router.push('/') } }, // tabs, 关闭当前 tabsCloseCurrentHandle() { this.removeTabHandle(this.mainTabsActiveName) }, // tabs, 关闭其它 tabsCloseOtherHandle() { this.mainTabs = this.mainTabs.filter((item) => item.name === this.mainTabsActiveName) }, // tabs, 关闭全部 tabsCloseAllHandle() { this.mainTabs = [] this.$router.push('/') }, // tabs, 刷新当前 tabsRefreshCurrentHandle() { var tempTabName = this.mainTabsActiveName this.removeTabHandle(tempTabName) this.$nextTick(() => { this.$router.push({ name: tempTabName }) }) }, }, } </script> <style lang="scss" scoped> .main-container { padding: 0 5px 5px; position: absolute; top: 60px; left: 1px; right: 1px; bottom: 0px; .tabs { position: fixed; top: 60px; right: 50px; padding-left: 0px; padding-right: 2px; z-index: 1020; height: 40px; line-height: 40px; font-size: 14px; background: rgb(255, 253, 255); border-color: rgba(200, 206, 206, 0.5); // border-left-width: 1px; // border-left-style: solid; border-bottom-width: 1px; border-bottom-style: solid; } .tabs-tools { position: fixed; top: 60px; right: 0; z-index: 1020; height: 40px; // padding: 0 10px; font-size: 14px; line-height: 40px; cursor: pointer; border-color: rgba(200, 206, 206, 0.5); border-left-width: 1px; border-left-style: solid; border-bottom-width: 1px; border-bottom-style: solid; background: rgba(255, 255, 255, 1); } .tabs-tools:hover { background: rgba(200, 206, 206, 1); } .main-content { position: absolute; top: 45px; left: 5px; right: 5px; bottom: 5px; padding: 5px; // background: rgba(209, 212, 212, 0.5); } } .position-left { left: 230px; } .position-collapse-left { left: 65px; } </style>状态管理中添加 app 模块
代码如下:
export default { state: { // 是否折叠导航栏 isCollapse: false, // 访问页集合 mainTabs: [], // 当前访问页名 mainTabsActiveName: '', }, getters: { isCollapse: (state) => { return state.isCollapse }, }, mutations: { toggleCollapse(state) { state.isCollapse = !state.isCollapse }, updateMainTabs(state, tabs) { state.mainTabs = tabs }, updateMainTabsActiveName(state, name) { state.mainTabsActiveName = name }, }, actions: {}, }当然还有一些小的调整点,可参考 git 上的提交版本 首页组件拆分
总结
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]