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.
- package/README.md +2 -2
- package/dist/favicon.svg +9 -9
- package/dist/src/lib/hooks/useStackTab.d.ts +1 -1
- package/dist/src/lib/hooks/useTabpanel.d.ts +1 -1
- package/dist/vue-stack-tabs.es.js +1045 -1034
- package/dist/vue-stack-tabs.umd.js +3 -3
- package/package.json +1 -1
- package/src/lib/StackTabs.vue +12 -5
- package/src/lib/components/TabHeader/index.vue +1 -1
- package/src/lib/hooks/useTabRouter.ts +2 -2
- package/src/lib/hooks/useTabpanel.tsx +67 -26
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
551
|
-
|
|
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) => {
|