1
1
<script setup>
2
- const { tm } = useI18n ();
2
+ const { tm , locale } = useI18n ();
3
3
4
- const navigationList = computed (() => {
4
+ const getComp = computed (() => {
5
5
const textValue = tm (' BarLeft' );
6
6
const linkValue = tm (' allUniversalLink' );
7
7
const localLink = linkValue .local ;
8
8
9
9
return [
10
- {
11
- title: textValue .title1 ,
12
- children: [
13
- localLink .aoscOs ,
14
- localLink .afterglow ,
15
- localLink .liblol ,
16
- localLink .oma ,
17
- localLink .l10n
18
- ],
19
- show: true
20
- },
21
- {
22
- title: textValue .title2 ,
23
- children: [
24
- localLink .news ,
25
- localLink .gallery ,
26
- useTIndex (localLink .contact , 1 ),
27
- useTIndex (linkValue .AOSCWiki , 1 )
28
- ],
29
- show: true
30
- },
31
- {
32
- title: textValue .title3 ,
33
- children: [
34
- localLink .about ,
35
- localLink .events ,
36
- localLink .internship ,
37
- localLink .sponsors ,
38
- localLink .crowdsourcing ,
39
- localLink .guidelines ,
40
- localLink .mascot
41
- ],
42
- show: true
43
- },
44
- {
45
- title: textValue .title4 ,
46
- children: [
47
- localLink .paste ,
48
- linkValue .forum ,
49
- useTIndex (linkValue .GitHub , 1 ),
50
- linkValue .mail20 ,
51
- linkValue .buildbots ,
52
- linkValue .buildit
53
- ],
54
- show: true
55
- }
10
+ [
11
+ {
12
+ title: textValue .title1 ,
13
+ children: [
14
+ localLink .aoscOs ,
15
+ localLink .afterglow ,
16
+ localLink .liblol ,
17
+ localLink .oma ,
18
+ localLink .l10n
19
+ ],
20
+ show: true
21
+ },
22
+ {
23
+ title: textValue .title2 ,
24
+ children: [
25
+ localLink .news ,
26
+ localLink .gallery ,
27
+ useTIndex (localLink .contact , 1 ),
28
+ useTIndex (linkValue .AOSCWiki , 1 )
29
+ ],
30
+ show: true
31
+ },
32
+ {
33
+ title: textValue .title3 ,
34
+ children: [
35
+ localLink .about ,
36
+ localLink .events ,
37
+ localLink .internship ,
38
+ localLink .sponsors ,
39
+ localLink .crowdsourcing ,
40
+ localLink .guidelines ,
41
+ localLink .mascot
42
+ ],
43
+ show: true
44
+ },
45
+ {
46
+ title: textValue .title4 ,
47
+ children: [
48
+ localLink .paste ,
49
+ linkValue .forum ,
50
+ useTIndex (linkValue .GitHub , 1 ),
51
+ linkValue .mail20 ,
52
+ linkValue .buildbots ,
53
+ linkValue .buildit
54
+ ],
55
+ show: true
56
+ }
57
+ ],
58
+ [' 0' , ' 1' , ' 2' , ' 3' ]
56
59
];
57
60
});
58
61
62
+ const navigationList = computed (() => {
63
+ return getComp .value [0 ];
64
+ });
65
+
66
+ const defaultOpeneds = computed (() => {
67
+ return getComp .value [1 ];
68
+ });
69
+
59
70
const openMenuList = new Set ();
60
71
61
72
const menuDivRef = useTemplateRef (' menuDiv' );
@@ -67,35 +78,36 @@ const rowHeightpx = `${rowHeight}px`;
67
78
const route = useRoute ();
68
79
69
80
const openMenu = (MenuOpenEvent ) => {
70
- const result = navigationList .value .find (
71
- (item ) => item .title === MenuOpenEvent
72
- );
73
81
let height =
74
- result .children .length * rowHeight +
82
+ navigationList . value [MenuOpenEvent] .children .length * rowHeight +
75
83
chunkPading +
76
84
menuDivRef .value .clientHeight ;
77
85
for (const item of openMenuList) {
78
86
if (highlyIsQualified (height)) {
79
87
break ;
80
88
} else {
81
- height = height - item[1 ] * rowHeight - chunkPading;
82
- openMenuList .delete (item);
83
- console .log (item[0 ]);
84
- menuRef .value .close (item[0 ]);
89
+ height -=
90
+ navigationList .value [item].children .length * rowHeight - chunkPading;
91
+ closeMenu (item);
85
92
}
86
93
}
87
- openMenuList .add ([ MenuOpenEvent, result . children . length ] );
94
+ openMenuList .add (MenuOpenEvent);
88
95
};
89
96
90
- const closeMenu = (MenuOpenEvent ) => {
91
- for (const arr of openMenuList ) {
92
- if (arr[ 0 ] === MenuOpenEvent ) {
93
- openMenuList .delete (arr );
94
- break ; // 删除后跳出循环,因为我们只删除第一个
97
+ const deleteSetItem = (target , setList ) => {
98
+ for (const item of setList ) {
99
+ if (item === target ) {
100
+ setList .delete (item );
101
+ break ;
95
102
}
96
103
}
97
104
};
98
105
106
+ const closeMenu = (MenuOpenEvent ) => {
107
+ deleteSetItem (MenuOpenEvent, openMenuList);
108
+ menuRef .value .close (MenuOpenEvent);
109
+ };
110
+
99
111
const highlyIsQualified = (height ) => {
100
112
// 在中心内容长度小于window.innerHeight时,回到首页弹窗不可能出来
101
113
// 此时高度比较参照中心内容长度即可,不需要算上弹窗和底栏
@@ -112,7 +124,9 @@ const highlyIsQualified = (height) => {
112
124
const { $mitt } = useNuxtApp ();
113
125
onMounted (() => {
114
126
$mitt .on (' routeSwitching' , () => {
115
- retractMenuBar ();
127
+ nextTick (() => {
128
+ retractMenuBar ();
129
+ });
116
130
});
117
131
});
118
132
onBeforeUnmount (() => {
@@ -126,15 +140,14 @@ const retractMenuBar = () => {
126
140
break ;
127
141
} else {
128
142
if (openMenuList .size === 1 ) break ;
129
- height =
130
- height -
131
- navigationList .value .find ((item1 ) => item1 .title === item).children
132
- .length *
133
- rowHeight;
134
- openMenuList .delete (item);
135
- menuRef .value .close (item);
143
+ height -=
144
+ navigationList .value [item].children .length * rowHeight - chunkPading;
145
+ closeMenu (item);
136
146
}
137
147
}
148
+ // for (const item of openMenuList) {
149
+ // menuRef.value.open(item);
150
+ // }
138
151
};
139
152
onMounted (() => {
140
153
// 每次缩放改变的时候,判断有没有栏目需要缩回去,先展开的,优先缩进
@@ -151,35 +164,30 @@ onMounted(() => {
151
164
let height = menuDivRef .value .clientHeight ;
152
165
// 初次加载的时候尝试打开当前栏目分类
153
166
// 记一下目前所在分类的title
154
- let thisTitle = null ;
155
- for (const item of navigationList .value .values ()) {
156
- const resule = item .children .find ((item1 ) =>
157
- route .path .includes (item1 .url )
158
- );
159
- if (resule) {
160
- height = height + item .children .length * rowHeight;
161
- // 展开但不进入队列,因为要给这个放到队列尾
162
- thisTitle = item .title ;
163
- break ;
164
- }
165
- }
166
- // 然后在剩余空间里按顺序遍历栏目,能展开尽量展开
167
- for (const item of navigationList .value ) {
168
- if (thisTitle !== item .title ) {
169
- const cache_h = height + item .children .length * rowHeight + chunkPading;
170
- if (highlyIsQualified (cache_h)) {
171
- height = cache_h;
172
- menuRef .value .open (item .title );
167
+ let thisElSubEnum = null ;
168
+ for (const [index , item ] of navigationList .value .entries ()) {
169
+ if (thisElSubEnum === null ) {
170
+ if (item .children .find ((item1 ) => route .path .includes (item1 .url ))) {
171
+ // 当前所在不入列尾
172
+ thisElSubEnum = index;
173
173
} else {
174
- break ;
174
+ openMenuList . add ( String (index)) ;
175
175
}
176
+ } else {
177
+ openMenuList .add (String (index));
176
178
}
177
179
}
178
- // 剩余栏目展开完毕,展开当前所在栏目,此时屏幕缩小优先关闭其他栏目
179
- if (thisTitle !== null ) {
180
- menuRef .value .open (thisTitle);
180
+ // 然后在剩余空间里按顺序遍历栏目,能展开尽量展开
181
+ // 默认全部展开,根据空间从下向上依次关闭,跳过当前栏目
182
+ for (const [index , item ] of reverseIterator (navigationList .value )) {
183
+ if (highlyIsQualified (height)) {
184
+ break ;
185
+ }
186
+ if (thisElSubEnum !== index) {
187
+ height = height - (item .children .length * rowHeight + chunkPading);
188
+ closeMenu (String (index));
189
+ }
181
190
}
182
-
183
191
// 判断当前所在位置是否需要回到顶部按钮
184
192
returnFromTop ();
185
193
// 挂载上面监听器
@@ -223,12 +231,13 @@ const backToTopBtnShow = ref(false);
223
231
<el-menu
224
232
ref =" menu"
225
233
class =" my-el-menu"
234
+ :default-openeds =" defaultOpeneds"
226
235
@close =" closeMenu"
227
236
@open =" openMenu" >
228
237
<el-sub-menu
229
238
v-for =" (item, index) in navigationList"
230
239
:key =" `barleft-1-link-${index}`"
231
- :index =" item.title " >
240
+ :index =" String(index) " >
232
241
<template #title >
233
242
<span >{{ item.title }}</span >
234
243
</template >
0 commit comments