UNPKG

@vue-cmd/core

Version:

Vue3命令式组件核心库 - 简化弹窗、对话框等组件的调用方式,告别繁琐的状态管理

133 lines (132 loc) 4.13 kB
import { Ref, VNode } from 'vue'; export declare enum EVENT_NAME { destroy = "destroy" } /** * 类似于vue-router中的meta数据,保存到consumer的meta属性中供消费 */ export type Meta = { /** 弹窗别名 */ name?: string; /** 扩展数据 */ [key: string]: unknown; }; export type IUseConfig<T = Record<string | symbol | number, unknown>> = { /** 元数据 */ meta?: Meta; /** 挂载点 */ appendTo?: string | HTMLElement; /** 自定义类名 */ customClassName?: string; /** 是否立即渲染 */ immediate?: boolean; /** 默认false,将为你的组件创建一个容器;如果为true将直接渲染到挂载点 */ fragment?: boolean; } & T; export type IUseConfigOrGetter = ValueOrGetter<IUseConfig>; export interface ICommandConfig<ATTRS = Record<string | symbol | number, any>> extends IUseConfig { /** 私有域成员注入 */ provideProps?: Record<string | symbol, unknown>; /** 组件插槽 */ slots?: Record<string, () => VNode | VNode[]>; /** 组件原生属性 */ attrs?: ATTRS & { [key: string | symbol | number]: any; }; } export type ICoreConfig = ICommandConfig & { visible: Ref<boolean>; }; export interface IConsumer { /** 组件实例的元数据 */ meta?: Meta; /** 是否可见响应式变量,虽然已经提供了hide以及show方法不需要通过该属性来控制弹窗的显示与隐藏,但是为了方便一些特殊场景,还是提供了该属性,比如你需要watch这个属性来做一些事情 */ visible: Ref<boolean>; /** 隐藏 */ hide: () => void; /** 显示 */ show: () => void; /** 销毁,但是不继续推进promise的状态改变 */ destroy: (external?: boolean) => void; /** promise */ promise: Promise<unknown>; /** promise执行器参数resolve */ resolve: (val?: unknown) => void; /** promise执行器参数reject */ reject: (reason?: unknown) => void; /** 销毁,并解决promise */ destroyWithResolve: (val?: unknown) => void; /** 销毁,并拒绝promise */ destroyWithReject: (reason?: unknown) => void; /** 订阅取消 */ off: (name: string | symbol, callback: (...args: unknown[]) => void) => void; /** 订阅 */ on: (name: string | symbol, callback: (...args: unknown[]) => void, config?: IOnConfig) => void; /** 单次订阅 */ once: (name: string | symbol, callback: (...args: unknown[]) => void, config?: IOnConfig) => void; /** 发布 */ emit: (name: string | symbol, ...args: unknown[]) => void; /** UI库的组件实例引用 */ componentRef?: Ref<any>; /** 组件挂载的html元素 */ container: HTMLDivElement; /** 组件嵌套堆栈 */ stack: IConsumer[]; /** 当前在组件嵌套堆栈中的索引 */ stackIndex: number; /** 已挂载 */ mounted: boolean; /** 已销毁 */ destroyed: boolean; } export interface IOnConfig { once?: boolean; callImmediatelyAfterDelay?: number; } /** * 适配器渲染组件的选项接口 */ export interface IRenderComponentOptions<Config> { /** 组件引用 */ componentRef: Ref; /** 是否可见 */ visible: Ref<boolean>; /** 挂载回调 */ onMounted: () => void; /** 组件配置 */ config: Ref<Config>; /** 消费者实例 */ consumer: { value: IConsumer; }; } /** * 事件总线回调函数类型 */ export type EventCallback = (...args: unknown[]) => void; /** * 事件回调集合类型 */ export type EventCallbackSet = Set<EventCallback>; /** * 事件映射类型 */ export type EventMap = Map<string | symbol, EventCallbackSet>; /** * 事件总线映射类型 */ export type EventBusMap = WeakMap<IConsumer, EventMap>; /** * Promise处理器返回类型 */ export interface IPromiseWithResolvers<T = unknown> { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: unknown) => void; } /** * 返回泛型的函数类型,或者直接返回泛型 * @template T 输入类型 * @template R 返回类型 */ export type ValueOrGetter<T> = (() => T) | T;