vue-stack-tabs 0.1.27 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import type { ITabData, ITabItem, ITabPage } from '../model/TabModel'
2
2
  import {
3
3
  defineComponent,
4
+ nextTick,
4
5
  onActivated,
5
6
  onDeactivated,
6
7
  onMounted,
@@ -25,6 +26,7 @@ const caches = ref<string[]>([])
25
26
  // Dynamic components
26
27
  const components = new Map<string, any>()
27
28
  const deletableCache = new Set<String>()
29
+ const deletableTab = new Set<String>()
28
30
  const pageShown = ref<boolean>(true)
29
31
  const SESSION_TAB_NAME = 'stacktab-active-tab'
30
32
  const pageScroller = new Map<string, Map<string, any>>()
@@ -37,6 +39,7 @@ export default () => {
37
39
  const size = (): number => {
38
40
  return tabs.value.length
39
41
  }
42
+
40
43
  /**
41
44
  * Init the Tab list
42
45
  */
@@ -45,6 +48,7 @@ export default () => {
45
48
  defaultTabs.splice(0)
46
49
  caches.value.splice(0)
47
50
  deletableCache.clear()
51
+ deletableTab.clear()
48
52
  components.clear()
49
53
  for (const item of staticTabs) {
50
54
  // const id = ulid()
@@ -76,7 +80,7 @@ export default () => {
76
80
  }
77
81
 
78
82
  defaultTabs.push(tab)
79
- tabs.value.push(tab)
83
+ tabs.value.push({ ...tab })
80
84
  caches.value.push(cacheName)
81
85
  }
82
86
 
@@ -133,7 +137,18 @@ export default () => {
133
137
  const addPage = (route: RouteLocationNormalizedLoaded, component: VNode): DefineComponent => {
134
138
  let cacheComponent: DefineComponent
135
139
  const tabInfo = decodeTabInfo(route.query.__tab as string)
136
- const cacheName = createPageId(tabInfo.id!, route.path, route.query.valueOf())
140
+ if (deletableTab.has(tabInfo.id!)) {
141
+ return
142
+ }
143
+ const matchPath = route.matched[route.matched.length - 1].path
144
+ const tmpPath = route.path.endsWith('/')
145
+ ? route.path.substring(0, route.path.length - 1)
146
+ : route.path
147
+ const cacheName = createPageId(
148
+ tabInfo.id!,
149
+ matchPath === tmpPath ? tmpPath : route.path,
150
+ route.query.valueOf()
151
+ )
137
152
  const src = route.query.__src
138
153
  // 增加tab
139
154
  let activeTab: ITabItem | null = null
@@ -199,6 +214,7 @@ export default () => {
199
214
  restoreScroller(cacheName)
200
215
  console.log(pageScroller.get(cacheName))
201
216
  removeDeletableCache()
217
+ deletableTab.clear()
202
218
  component.props = null
203
219
  })
204
220
  onUnmounted(() => {
@@ -292,6 +308,7 @@ export default () => {
292
308
  for (const item of unref(tabs)[i].pages.list()) {
293
309
  removeComponent(item.id)
294
310
  markDeletableCache(item.id)
311
+ deletableTab.add(unref(tabs)[i].id)
295
312
  }
296
313
  unref(tabs)[i].pages.clear()
297
314
  if (tabs.value.length > 1 && unref(tabs)[i].active) {
@@ -306,12 +323,17 @@ export default () => {
306
323
  break
307
324
  }
308
325
  }
326
+
309
327
  if (activeTabId !== '') {
310
328
  emitter.emit(MittType.TAB_ACTIVE, { id: activeTabId })
311
329
  // active(activeTabId)
312
330
  }
313
331
  // if remove inactive tab,then we need remove the cache manually.
314
- removeDeletableCache()
332
+ const currentTab = getTab(id)
333
+ if (!currentTab?.active) {
334
+ removeDeletableCache()
335
+ }
336
+
315
337
  return activeTabId
316
338
  }
317
339
 
@@ -322,8 +344,10 @@ export default () => {
322
344
  for (const item of uTabs[i].pages.list()) {
323
345
  removeComponent(item.id)
324
346
  markDeletableCache(item.id)
347
+ deletableTab.add(uTabs[i].id)
325
348
  }
326
349
  unref(tabs)[i].pages.clear()
350
+
327
351
  unref(tabs).splice(i, 1)
328
352
  }
329
353
  }
@@ -347,6 +371,7 @@ export default () => {
347
371
  for (const item of uTabs[i].pages.list()) {
348
372
  removeComponent(item.id)
349
373
  markDeletableCache(item.id)
374
+ deletableTab.add(uTabs[i].id)
350
375
  }
351
376
  unref(tabs)[i].pages.clear()
352
377
  unref(tabs).splice(i, 1)
@@ -377,6 +402,7 @@ export default () => {
377
402
  for (const item of uTabs[i].pages.list()) {
378
403
  removeComponent(item.id)
379
404
  markDeletableCache(item.id)
405
+ deletableTab.add(uTabs[i].id)
380
406
  }
381
407
  unref(tabs)[i].pages.clear()
382
408
  unref(tabs).splice(i, 1)
@@ -411,6 +437,7 @@ export default () => {
411
437
  for (const item of uTabs[i].pages.list()) {
412
438
  removeComponent(item.id)
413
439
  markDeletableCache(item.id)
440
+ deletableTab.add(uTabs[i].id)
414
441
  }
415
442
  unref(tabs)[i].pages.clear()
416
443
  unref(tabs).splice(i, 1)
@@ -441,6 +468,9 @@ export default () => {
441
468
  // 如果要刷新的是显示的TAB
442
469
  if (uTabs.active) {
443
470
  pageShown.value = false
471
+ nextTick(() => {
472
+ pageShown.value = true
473
+ })
444
474
  }
445
475
  break
446
476
  }
@@ -464,6 +494,9 @@ export default () => {
464
494
  }
465
495
  }
466
496
  pageShown.value = false
497
+ nextTick(() => {
498
+ pageShown.value = true
499
+ })
467
500
  }
468
501
 
469
502
  const addComponent = (id: string, comp: DefineComponent) => {
@@ -512,30 +545,30 @@ export default () => {
512
545
  * @return true if already actived
513
546
  */
514
547
  const active = (id: string, route = true) => {
515
- return new Promise((resolve) => {
516
- for (let i = tabs.value.length - 1; i >= 0; i--) {
517
- const tab = tabs.value[i] as ITabItem
518
- if (tab.id === id) {
519
- if (tab.active) {
520
- break
521
- } else {
522
- tab.active = true
523
- pageShown.value = false
524
- updateSession(tab)
525
- if (route) {
526
- const top = tab.pages.peek()
527
- router.push({
528
- path: top!.path,
529
- query: top!.query
530
- })
531
- }
532
- }
548
+ // return new Promise((resolve)=>{
549
+ for (let i = tabs.value.length - 1; i >= 0; i--) {
550
+ const tab = tabs.value[i] as ITabItem
551
+ if (tab.id === id) {
552
+ if (tab.active) {
553
+ break
533
554
  } else {
534
- tabs.value[i].active = false
555
+ tab.active = true
556
+ // pageShown.value = false
557
+ updateSession(tab)
558
+ if (route) {
559
+ const top = tab.pages.peek()
560
+ router.push({
561
+ path: top!.path,
562
+ query: top!.query
563
+ })
564
+ }
535
565
  }
566
+ } else {
567
+ tabs.value[i].active = false
536
568
  }
537
- resolve(true)
538
- })
569
+ }
570
+ // resolve(true)
571
+ // })
539
572
  }
540
573
  /**
541
574
  * save current tab info into Browser's session
@@ -546,15 +579,23 @@ export default () => {
546
579
  window.sessionStorage.setItem(SESSION_TAB_NAME, JSON.stringify(tab))
547
580
  }
548
581
  const reset = () => {
582
+ pageShown.value = false
549
583
  destroy()
550
- unref(tabs).push(...defaultTabs)
551
- emitter.emit(MittType.TAB_ACTIVE, { id: defaultTabs[0].id! })
584
+ nextTick(() => {
585
+ unref(tabs).push(...defaultTabs)
586
+ emitter.emit(MittType.TAB_ACTIVE, { id: defaultTabs[0].id! })
587
+ // pageShown.value = false
588
+ nextTick(() => {
589
+ pageShown.value = true
590
+ })
591
+ })
552
592
  // active(defaultTabs[0].id)
553
593
  }
554
594
  const destroy = () => {
555
595
  unref(tabs).splice(0)
556
596
  components.clear()
557
597
  deletableCache.clear()
598
+ deletableTab.clear()
558
599
  unref(caches).splice(0)
559
600
  }
560
601
  const setMaxSize = (size: number) => {