<template> <!-- <div :class="classObj" class="app-wrapper"> --> <div class="app-wrapper"> <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" /> <main-navbar /> <div class="main-body"> <sidebar class="sidebar-container cu-nav"/> <div :class="{hasTagsView:needTagsView}" class="main-container"> <div class="main-container-liner"> <div class="main-inright"> <div :class="{'fixed-header':fixedHeader}"> <!-- <navbar /> --> <!-- <tags-view v-if="needTagsView" /> --> </div> <app-main /> <right-panel v-if="showSettings"> <settings /> </right-panel> </div> </div> </div> </div> <!-- 防止刷新后主题丢失 <Theme v-show="false" ref="theme" /> --> </div> </template> <script> import { AppMain, Settings, Sidebar, TagsView, MainNavbar } from './components' import ResizeMixin from './mixin/ResizeHandler' import { mapState } from 'vuex' //import Theme from '@/components/ThemePicker' import Cookies from 'js-cookie' export default { name: 'Layout', components: { AppMain, //Navbar, //RightPanel, Settings, Sidebar, TagsView, //Theme, MainNavbar }, mixins: [ResizeMixin], computed: { ...mapState({ sidebar: state => state.app.sidebar, device: state => state.app.device, showSettings: state => state.settings.showSettings, needTagsView: state => state.settings.tagsView, fixedHeader: state => state.settings.fixedHeader }), classObj() { return { hideSidebar: !this.sidebar.opened, openSidebar: this.sidebar.opened, withoutAnimation: this.sidebar.withoutAnimation, mobile: this.device === 'mobile' } } }, mounted() { if (Cookies.get('theme')) { this.$refs.theme.theme = Cookies.get('theme') this.$store.dispatch('settings/changeSetting', { key: 'theme', value: Cookies.get('theme') }) } }, methods: { handleClickOutside() { this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) } } } </script> <style lang="scss" scope> #app .app-wrapper{ .main-container{ background-color:#02133e; flex:1;position:relative;width:100%;/* border-top:1px solid #002B56;margin-left:1.041vw; */ .main-container-liner{height:100%;/* position:absolute;top:0;left:0;width:100%; */display:flex;} .main-inright{height:100%;width:100%;flex:1;display:flex;flex-direction:column;} } } .app-wrapper{ /* @include clearfix; */position:relative;height:100%;width:100%; display:flex;flex-direction:column;box-orient:vertical;overflow-x:auto; .main-body{/* margin-top:0.26vh;margin-top:0.5vh; */ position:relative; display:flex;flex:1;flex-direction:column; } &.mobile.openSidebar {position:fixed;top: 0;} } .drawer-bg { background: #000; opacity: 0.3; width: 100%; top: 0; height: 100%; position:absolute; z-index: 999; } .fixed-header { /* position: absolute; top: 0; left: 0; z-index: 9; */ width:100%; transition: width 0.28s; padding: 0; } .mobile .fixed-header { width: 100%; } </style>