11<script  setup>
2- const  { tm  } =  useI18n ();
2+ const  { tm ,  locale  } =  useI18n ();
33
4- const  navigationList  =  computed (() =>  {
4+ const  getComp  =  computed (() =>  {
55  const  textValue  =  tm (' BarLeft'  
66  const  linkValue  =  tm (' allUniversalLink'  
77  const  localLink  =  linkValue .local ; 
88
99  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'  
5659  ]; 
5760}); 
5861
62+ const  navigationList  =  computed (() =>  {
63+   return  getComp .value [0 ]; 
64+ }); 
65+ 
66+ const  defaultOpeneds  =  computed (() =>  {
67+   return  getComp .value [1 ]; 
68+ }); 
69+ 
5970const  openMenuList  =  new  Set ();
6071
6172const  menuDivRef  =  useTemplateRef (' menuDiv' 
@@ -67,35 +78,36 @@ const rowHeightpx = `${rowHeight}px`;
6778const  route  =  useRoute ();
6879
6980const  openMenu  =  (MenuOpenEvent ) =>  {
70-   const  result  =  navigationList .value .find ( 
71-     (item ) =>  item .title  ===  MenuOpenEvent 
72-   ); 
7381  let  height =  
74-     result .children .length  *  rowHeight +  
82+     navigationList . value [MenuOpenEvent] .children .length  *  rowHeight +  
7583    chunkPading +  
7684    menuDivRef .value .clientHeight ; 
7785  for  (const  item  of  openMenuList) { 
7886    if  (highlyIsQualified (height)) { 
7987      break ; 
8088    } 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); 
8592    } 
8693  } 
87-   openMenuList .add ([ MenuOpenEvent,  result . children . length ] ); 
94+   openMenuList .add (MenuOpenEvent); 
8895}; 
8996
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 ; 
95102    } 
96103  } 
97104}; 
98105
106+ const  closeMenu  =  (MenuOpenEvent ) =>  {
107+   deleteSetItem (MenuOpenEvent, openMenuList); 
108+   menuRef .value .close (MenuOpenEvent); 
109+ }; 
110+ 
99111const  highlyIsQualified  =  (height ) =>  {
100112  //  在中心内容长度小于window.innerHeight时,回到首页弹窗不可能出来 
101113  //  此时高度比较参照中心内容长度即可,不需要算上弹窗和底栏 
@@ -112,7 +124,9 @@ const highlyIsQualified = (height) => {
112124const  { $mitt  } =  useNuxtApp ();
113125onMounted (() =>  {
114126  $mitt .on (' routeSwitching' =>  { 
115-     retractMenuBar (); 
127+     nextTick (() =>  { 
128+       retractMenuBar (); 
129+     }); 
116130  }); 
117131}); 
118132onBeforeUnmount (() =>  {
@@ -126,15 +140,14 @@ const retractMenuBar = () => {
126140      break ; 
127141    } else  { 
128142      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); 
136146    } 
137147  } 
148+   //  for (const item of openMenuList) { 
149+   //    menuRef.value.open(item); 
150+   //  } 
138151}; 
139152onMounted (() =>  {
140153  //  每次缩放改变的时候,判断有没有栏目需要缩回去,先展开的,优先缩进 
@@ -151,35 +164,30 @@ onMounted(() => {
151164  let  height =  menuDivRef .value .clientHeight ; 
152165  //  初次加载的时候尝试打开当前栏目分类 
153166  //  记一下目前所在分类的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; 
173173      } else  { 
174-         break ; 
174+         openMenuList . add ( String (index)) ; 
175175      } 
176+     } else  { 
177+       openMenuList .add (String (index)); 
176178    } 
177179  } 
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+     } 
181190  } 
182- 
183191  //  判断当前所在位置是否需要回到顶部按钮 
184192  returnFromTop (); 
185193  //  挂载上面监听器 
@@ -223,12 +231,13 @@ const backToTopBtnShow = ref(false);
223231      <el-menu 
224232        ref =" menu" 
225233        class =" my-el-menu" 
234+         :default-openeds =" defaultOpeneds" 
226235        @close =" closeMenu" 
227236        @open =" openMenu" 
228237        <el-sub-menu 
229238          v-for =" (item, index) in navigationList" 
230239          :key =" `barleft-1-link-${index}`" 
231-           :index =" item.title " 
240+           :index =" String(index) " 
232241          <template  #title >
233242            <span >{{ item.title }}</span >
234243          </template >
0 commit comments