UNPKG

vue-app-sdk

Version:
325 lines (324 loc) 9.54 kB
import { Awaitable, MaybeNullish } from '@rhao/types-base'; import { MaybeRefOrGetter } from 'vue'; import { AppSDKInternalInstance, Plugin, PluginID, StorageOptions } from '../..'; import { RouteLocationNormalized } from 'vue-router'; import { PageMetadata } from '../Page'; import { TabPage } from './interface'; export type TabsRawPage = PageMetadata; export declare enum TabsReplaceResult { /** * 替换旧标签页为新标签页 */ replace = "replace", /** * 打开新标签页 */ open = "open", /** * 取消操作 */ cancel = "cancel" } export interface TabsOptions extends StorageOptions { /** * 相同路由不同参数时处理标签页的模式 * - `normal`: 普通模式,会打开相同路由不同参数的标签页 * - `replace`: 替换模式,会先替换旧标签页为新标签页并激活 * @default 'normal' */ mode?: 'normal' | 'replace'; /** * 是否缓存标签页,可单独设置 `PageMetadata.isKeepAlive` 缓存指定页面 * * ***注意:该功能依赖 `KeepAlive` 插件实现!*** * * @default true */ keepAlive?: boolean; /** * 是否在路由导航时自动收集标签页,设为 `true` 时将使用内置收集器进行收集 * @default true */ autoCollect?: MaybeRefOrGetter<boolean>; /** * 页面元数据转为标签页属性 * @param data 页面元数据 */ rawPageToTabPage?: (data: TabsRawPage) => Omit<TabPage, 'id' | 'fullPath' | 'componentName'>; /** * 是否为有效的页面元数据,指可以被转为标签页的元数据 * @param data 页面元数据 * @example * ```ts * const page: PageMetadata = { * // ... * isFull: true, // 全屏页面,不应被添加到标签页列表 * } * * createTabs({ * // 排除全屏页面元数据 * isValidRawPage: (data) => !data.isFull * }) * ``` */ isValidRawPage?: (data: TabsRawPage) => boolean; /** * 根据页面元数据添加标签页前的回调处理,若返回假值则取消添加 */ beforeAdd?: (page: TabsRawPage) => Awaitable<void | boolean>; /** * `mode` 设为 `replace` 时,替换标签页前的回调处理,根据返回结果进行处理 */ beforeReplace?: (newTabPage: TabPage, oldTabPage: TabPage) => Awaitable<TabsReplaceResult>; /** * 移除标签页前的回调处理,若返回假值则取消移除 */ beforeRemove?: (tabPage: TabPage) => Awaitable<void | boolean>; /** * 处理激活标签页为空的情况 */ processEmptyActive?: () => void; } export type RouteForGenerableID = Pick<RouteLocationNormalized, 'fullPath' | 'meta'>; export type TabPageForGenerableID = Pick<TabPage, 'pageId' | 'fullPath' | 'isUniq'>; export type ResolvableIdType = MaybeNullish<string | number | TabPage | RouteForGenerableID>; /** * 标签栏方向侧 */ export type TabsSideType = 'left' | 'right'; /** * Tabs Plugin ID */ export declare const TABS_ID: PluginID<Tabs>; declare const unsafeUpdatableTabPageProps: readonly ["isAffix", "isUniq", "isKeepAlive", "title", "icon", "fullPath", "fullPath"]; /** * 标签页管理插件,依赖于 `Page` 和 `KeepAlive` 插件 * * ***注意:配合 `KeepAlive` 时会接管对缓存的处理并强制禁用自动模式!*** */ export declare class Tabs implements Plugin { /** * 配置项 */ options: TabsOptions; constructor( /** * 配置项 */ options?: TabsOptions); id: PluginID<Tabs>; /** * AppSDK 实例 */ private _sdk; /** * 页面元数据转为标签页属性 * @readonly */ get rawPageToTabPage(): (data: TabsRawPage) => Omit<TabPage, "id" | "fullPath" | "componentName">; /** * 是否为有效的页面元数据 * @readonly */ get isValidRawPage(): (data: TabsRawPage) => boolean; /** * 持久化的状态 */ private _state; /** * 设置标签页列表 */ set pages(value: TabPage[]); /** * 标签页列表 */ get pages(): TabPage[]; /** * 设置激活的标签页 ID */ set active(value: string); /** * 激活的标签页 ID */ get active(): string; /** * 激活的标签页 * @readonly */ get activeTabPage(): TabPage | undefined; /** * 是否自动模式 */ private _isAuto; /** * 是否自动模式 * @readonly */ get isAuto(): boolean; /** * KeepAlive 插件 */ private get _keepAlive(); /** * 路由列表 */ private get _routes(); /** * 判断是否需要缓存标签页 */ isKeepAlive(tagPage: { isKeepAlive?: boolean; }): boolean; /** * 生成标签页 ID */ generateID(data: RouteForGenerableID | TabPageForGenerableID): string; /** * 切换自动模式 * @param value 状态值 */ toggleAuto: (value?: boolean) => boolean; /** * 启用自动模式 */ enableAuto: () => boolean; /** * 禁用自动模式 */ disableAuto: () => boolean; /** * 更新 KeepAlive 缓存 */ updateKeepAlive: () => Promise<void>; /** * 设置标签页列表 * @param pages 标签页列表 */ setTabPages: (pages: TabPage[]) => void; /** * 根据页面元数据获取 `fullPath` */ private _resolveFullPath; /** * 根据页面元数据列表设置固定标签页列表 * @param data 页面元数据列表 */ setAffixTabPagesByRawPages: (data: TabsRawPage[]) => void; /** * 更新标签页 * @param target 可获取标签页 ID 的值 * @param data 标签页属性 */ updateTabPage: (target: ResolvableIdType, data: Partial<Pick<TabPage, (typeof unsafeUpdatableTabPageProps)[number]>>) => void; /** * 更新标签页的 `fullPath` 属性 * @param data 路由数据 * @param data.query `route.query` * @param data.params `route.params` * @param source 可获取标签页 ID 的值 */ updateFullPath: (data?: { query?: Record<string, any>; params?: Record<string, any>; }, source?: ResolvableIdType) => void; /** * 根据页面元数据更新标签页列表 * @param data 页面元数据列表或映射 */ updateTabPagesByRawPages: (data: TabsRawPage[] | Record<string, TabsRawPage | undefined>) => void; /** * 获取标签页 ID * @param value 可获取标签页 ID 的值 * @returns 标签页 ID */ resolveId: (value: ResolvableIdType) => string; /** * 仅设置当前激活的标签页 ID * @param value 可获取标签页 ID 的值 */ private _setActive; /** * 设置当前激活的标签页 ID * @param value 可获取标签页 ID 的值 */ setActive: (value: ResolvableIdType) => void; /** * 根据路由创建标签页 * @param route 路由 * @returns 标签页 */ createTabPage: (route: RouteForGenerableID) => TabPage; /** * 是否可以移除指定标签页 * @param source 可获取标签页 ID 的值 */ canRemove: (source?: ResolvableIdType) => boolean; /** * 是否可以移除非指定的其他非固定标签页 * @param source 可获取标签页 ID 的值 */ canRemoveOther: (source?: ResolvableIdType) => boolean; /** * 是否可以移除指定标签页的指定方向侧非固定标签页 * @param side 方向侧 * @param source 可获取标签页 ID 的值 */ canRemoveSide: (side: TabsSideType, source?: ResolvableIdType) => boolean; /** * 是否可以移除全部非固定标签页 */ canRemoveAll: () => boolean; /** * 尝试移除标签页列表 * @param pages 标签页列表 */ tryRemoveTabPages: (pages: TabPage[]) => Promise<boolean>; /** * 移除激活的标签页 */ removeActive: () => Promise<boolean>; /** * 移除指定标签页 * @param value 可获取标签页 ID 的值 */ removeOne: (value: ResolvableIdType) => Promise<boolean>; /** * 移除指定标签页的指定方向侧非固定标签页 * @param side 指定方向侧 * @param source 可获取标签页 ID 的值 */ removeSide: (side: TabsSideType, source?: ResolvableIdType) => Promise<void>; /** * 移除非指定的其他非固定标签页 * @param source 可获取标签页 ID 的值 */ removeOther: (source?: ResolvableIdType) => Promise<void>; /** * 移除全部非固定标签页 * @param force 是否强制移除,将不会触发 `beforeRemove` 回调 */ removeAll: (force?: boolean) => Promise<void>; /** * 匹配相同标签页 * @param tabPage 标签页 */ matchSameTabPage: (tabPage: TabPage) => { /** * 模糊匹配结果(同 `pageId`) */ fuzzy: TabPage[]; /** * 精确匹配(同 `pageId`、`fullPath`) */ exact: TabPage | undefined; }; /** * 根据路由添加标签页 * @param route 路由 */ addOne: (route: RouteForGenerableID & { matched?: RouteLocationNormalized["matched"]; }) => Promise<void>; install: (sdk: AppSDKInternalInstance) => () => void; } export {};