Skip to content

Commit 1fdaca0

Browse files
committed
fix: merge mixin, fix user-layout 320px css
1 parent e8e2426 commit 1fdaca0

File tree

14 files changed

+112
-108
lines changed

14 files changed

+112
-108
lines changed

src/components/layouts/UserLayout.vue

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div id="userLayout" class="user-layout-wrapper">
2+
<div id="userLayout" :class="['user-layout-wrapper', device]">
33
<div class="container">
44
<div class="top">
55
<div class="header">
@@ -31,10 +31,12 @@
3131

3232
<script>
3333
import RouteView from "@/components/layouts/RouteView"
34+
import { mixinDevice } from '@/utils/mixin.js'
3435
3536
export default {
3637
name: "UserLayout",
3738
components: { RouteView },
39+
mixins: [mixinDevice],
3840
data () {
3941
return {}
4042
},
@@ -51,6 +53,15 @@
5153
#userLayout.user-layout-wrapper {
5254
height: 100%;
5355
56+
&.mobile {
57+
.container {
58+
.main {
59+
max-width: 368px;
60+
width: 98%;
61+
}
62+
}
63+
}
64+
5465
.container {
5566
width: 100%;
5667
min-height: 100%;
@@ -105,6 +116,7 @@
105116
}
106117
107118
.main {
119+
min-width: 260px;
108120
width: 368px;
109121
margin: 0 auto;
110122
}

src/components/menu/SideMenu.vue

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<a-layout-sider
3-
:class="['sider', device === 'desktop' ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
3+
:class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
44
width="256px"
55
:collapsible="collapsible"
66
v-model="collapsed"
@@ -21,11 +21,12 @@
2121
import ALayoutSider from "ant-design-vue/es/layout/Sider"
2222
import Logo from '../tools/Logo'
2323
import SMenu from './index'
24-
import { mapState } from 'vuex'
24+
import { mixin, mixinDevice } from '@/utils/mixin.js'
2525
2626
export default {
2727
name: "SideMenu",
2828
components: { ALayoutSider, Logo, SMenu },
29+
mixins: [mixin, mixinDevice],
2930
props: {
3031
mode: {
3132
type: String,
@@ -52,15 +53,6 @@
5253
required: true
5354
}
5455
},
55-
created () {
56-
57-
},
58-
computed: {
59-
...mapState({
60-
device: state => state.app.device,
61-
fixSiderbar: state => state.app.fixSiderbar,
62-
})
63-
},
6456
methods: {
6557
onSelect (obj) {
6658
this.$emit('menuSelect', obj)

src/components/page/GlobalHeader.vue

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,21 +43,26 @@
4343
import SMenu from '../menu/'
4444
import Logo from '../tools/Logo'
4545
46-
import { mapState } from 'vuex'
46+
import { mixin } from '@/utils/mixin.js'
4747
4848
export default {
49-
name: "LayoutHeader",
49+
name: "GlobalHeader",
5050
components: {
5151
UserMenu,
5252
SMenu,
5353
Logo
5454
},
55+
mixins: [mixin],
5556
props: {
5657
mode: {
5758
type: String,
5859
// sidemenu, topmenu
5960
default: 'sidemenu'
6061
},
62+
menus: {
63+
type: Array,
64+
required: true
65+
},
6166
theme: {
6267
type: String,
6368
required: false,
@@ -76,24 +81,12 @@
7681
},
7782
data() {
7883
return {
79-
menus: [],
8084
headerBarFixed: false,
8185
}
8286
},
8387
mounted () {
8488
window.addEventListener('scroll', this.handleScroll)
8589
},
86-
created() {
87-
this.menus = this.mainMenu.find((item) => item.path === '/').children
88-
},
89-
computed: {
90-
...mapState({
91-
mainMenu: state => state.permission.addRouters,
92-
sidebarOpened: state => state.app.sidebar.opened,
93-
fixedHeader: state => state.app.fixedHeader,
94-
autoHideHeader: state => state.app.autoHideHeader,
95-
}),
96-
},
9790
methods: {
9891
handleScroll () {
9992
if (this.autoHideHeader) {

src/components/page/GlobalLayout.vue

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<template v-if="layoutMode === 'sidemenu'">
55
<a-drawer
66
v-if="device === 'mobile'"
7-
:wrapClassName="'drawer-sider ' + theme"
7+
:wrapClassName="'drawer-sider ' + navTheme"
88
placement="left"
99
@close="() => this.collapsed = false"
1010
:closable="false"
@@ -14,24 +14,24 @@
1414
mode="inline"
1515
:menus="menus"
1616
@menuSelect="menuSelect"
17-
:theme="theme"
17+
:theme="navTheme"
1818
:collapsed="false"
1919
:collapsible="true"></side-menu>
2020
</a-drawer>
2121

2222
<side-menu
2323
v-else
24+
mode="inline"
2425
:menus="menus"
25-
:theme="theme"
26-
:mode="menuMode"
26+
:theme="navTheme"
2727
:collapsed="collapsed"
2828
:collapsible="true"></side-menu>
2929
</template>
3030
<!-- 下次优化这些代码 -->
3131
<template v-else>
3232
<a-drawer
3333
v-if="device === 'mobile'"
34-
:wrapClassName="'drawer-sider ' + theme"
34+
:wrapClassName="'drawer-sider ' + navTheme"
3535
placement="left"
3636
@close="() => this.collapsed = false"
3737
:closable="false"
@@ -41,15 +41,22 @@
4141
mode="inline"
4242
:menus="menus"
4343
@menuSelect="menuSelect"
44-
:theme="theme"
44+
:theme="navTheme"
4545
:collapsed="false"
4646
:collapsible="true"></side-menu>
4747
</a-drawer>
4848
</template>
4949

5050
<a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: fixSiderbar && device === 'desktop' ? `${sidebarOpened ? 256 : 80}px` : '0' }">
5151
<!-- layout header -->
52-
<global-header :mode="layoutMode" :theme="theme" :collapsed="collapsed" :device="device" @toggle="toggle"/>
52+
<global-header
53+
:mode="layoutMode"
54+
:menus="menus"
55+
:theme="navTheme"
56+
:collapsed="collapsed"
57+
:device="device"
58+
@toggle="toggle"
59+
/>
5360

5461
<!-- layout content -->
5562
<a-layout-content :style="{ margin: '24px 24px 0', height: '100%', paddingTop: fixedHeader ? '64px' : '0' }">
@@ -71,41 +78,33 @@
7178
import GlobalHeader from '@/components/page/GlobalHeader'
7279
import GlobalFooter from '@/components/page/GlobalFooter'
7380
import SettingDrawer from '@/components/setting/SettingDrawer'
74-
import { triggerResize } from '@/utils/util'
81+
import { triggerWindowResizeEvent } from '@/utils/util'
7582
import { mapState, mapActions } from 'vuex'
83+
import { mixin, mixinDevice } from '@/utils/mixin.js'
84+
7685
export default {
77-
name: "BasicLayout",
86+
name: "GlobalLayout",
7887
components: {
7988
SideMenu,
8089
GlobalHeader,
8190
GlobalFooter,
8291
SettingDrawer
8392
},
93+
mixins: [mixin, mixinDevice],
8494
data () {
8595
return {
86-
// light, dark
87-
menuTheme: 'light',
88-
// inline, horizontal
89-
menuMode: 'inline',
9096
collapsed: false,
9197
menus: []
9298
}
9399
},
94100
computed: {
95101
...mapState({
102+
// 主路由
96103
mainMenu: state => state.permission.addRouters,
97-
layoutMode: state => state.app.layout,
98-
sidebarOpened: state => state.app.sidebar.opened,
99-
fixedHeader: state => state.app.fixedHeader,
100-
fixSiderbar: state => state.app.fixSiderbar,
101-
contentWidth: state => state.app.contentWidth,
102-
theme: state => state.app.theme,
103-
device: state => state.app.device,
104104
})
105105
},
106106
watch: {
107107
sidebarOpened(val) {
108-
console.log('watch',val)
109108
this.collapsed = !val
110109
},
111110
},
@@ -116,11 +115,11 @@
116115
...mapActions(['setSidebar']),
117116
toggle() {
118117
this.collapsed = !this.collapsed
119-
triggerResize()
120118
this.setSidebar(!this.collapsed)
119+
triggerWindowResizeEvent()
121120
},
122121
menuSelect() {
123-
if (this.device !== 'desktop') {
122+
if (!this.isDesktop()) {
124123
this.collapsed = false
125124
}
126125
}

src/components/setting/SettingDrawer.vue

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
<template slot='title'>
9393
该设定仅 [顶部栏导航] 时有效
9494
</template>
95-
<a-select size="small" style="width: 80px;" :defaultValue="contentWidth" @change="handleContentWidthChange">
95+
<a-select size="small" style="width: 80px;" :defaultValue="contentWidth" @change="handleContentWidthChange">
9696
<a-select-option value="Fixed">固定</a-select-option>
9797
<a-select-option value="Fluid" v-if="layoutMode !== 'sidemenu'">流式</a-select-option>
9898
</a-select>
@@ -160,39 +160,25 @@
160160
import SettingItem from '@/components/setting/SettingItem'
161161
import config from '@/defaultSettings'
162162
import { updateTheme, updateColorWeak, colorList } from '@/components/tools/setting'
163-
import { mapState } from 'vuex'
163+
import { mixin, mixinDevice } from '@/utils/mixin.js'
164164
165165
export default {
166166
components: {
167167
DetailList,
168168
SettingItem
169169
},
170+
mixins: [mixin, mixinDevice],
170171
data() {
171172
return {
172173
visible: true,
173174
colorList,
174175
}
175176
},
176-
computed: {
177-
...mapState({
178-
navTheme: state => state.app.theme,
179-
layoutMode: state => state.app.layout,
180-
primaryColor: state => state.app.color,
181-
colorWeak: state => state.app.weak,
182-
fixedHeader: state => state.app.fixedHeader,
183-
fixSiderbar: state => state.app.fixSiderbar,
184-
autoHideHeader: state => state.app.autoHideHeader,
185-
contentWidth: state => state.app.contentWidth,
186-
}),
187-
},
188177
watch: {
189178
190179
},
191180
mounted () {
192181
const vm = this
193-
/*this.$nextTick(() => {
194-
vm.visible = false
195-
})*/
196182
setTimeout(() => {
197183
vm.visible = false
198184
}, 16)

src/defaultSettings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export default {
1717
primaryColor: '#1890FF', // primary color of ant design
1818
navTheme: 'dark', // theme for nav menu
1919
layout: 'sidemenu', // nav menu position: sidemenu or topmenu
20-
contentWidth: 'Fluid', // layout of content: Fluid or Fixed, only works when layout is topmenu
20+
contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu
2121
fixedHeader: false, // sticky header
2222
fixSiderbar: false, // sticky siderbar
2323
autoHideHeader: false, // auto hide header

src/utils/mixin.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// import Vue from 'vue'
2+
import { mapState } from "vuex";
3+
4+
// const mixinsComputed = Vue.config.optionMergeStrategies.computed
5+
// const mixinsMethods = Vue.config.optionMergeStrategies.methods
6+
7+
const mixin = {
8+
computed: {
9+
...mapState({
10+
layoutMode: state => state.app.layout,
11+
navTheme: state => state.app.theme,
12+
primaryColor: state => state.app.color,
13+
colorWeak: state => state.app.weak,
14+
fixedHeader: state => state.app.fixedHeader,
15+
fixSiderbar: state => state.app.fixSiderbar,
16+
contentWidth: state => state.app.contentWidth,
17+
autoHideHeader: state => state.app.autoHideHeader,
18+
sidebarOpened: state => state.app.sidebarOpened
19+
})
20+
}
21+
}
22+
23+
const mixinDevice = {
24+
computed: {
25+
...mapState({
26+
device: state => state.app.device,
27+
})
28+
},
29+
methods: {
30+
isMobile () {
31+
return this.device === 'mobile'
32+
},
33+
isDesktop () {
34+
return this.device === 'desktop'
35+
}
36+
}
37+
}
38+
39+
export { mixin, mixinDevice }

src/utils/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export function welcome() {
1313
/**
1414
* 触发 window.resize
1515
*/
16-
export function triggerResize() {
16+
export function triggerWindowResizeEvent() {
1717
let event = document.createEvent('HTMLEvents')
1818
event.initEvent('resize', true, true)
1919
event.eventType = 'message'

0 commit comments

Comments
 (0)