UNPKG

@chamn/engine

Version:
109 lines (108 loc) 3.9 kB
type SetStateInternal<T> = { _(partial: T | Partial<T> | { _(state: T): T | Partial<T>; }['_'], replace?: boolean | undefined): void; }['_']; export interface StoreApi<T> { setState: SetStateInternal<T>; getState: () => T; subscribe: (listener: (state: T, prevState: T) => void) => () => void; /** * @deprecated Use `unsubscribe` returned by `subscribe` */ destroy: () => void; } type PageState = any; type NodeId = keyof PageState; type MethodsManager = any; type GlobalState = any; type CurrentNodeState = any; type PageStateManager<K extends keyof PageState> = { state: PageState[K]; updateState: (newState: Partial<PageState[K]>) => void; }; type PageStateManagerMap = { [K in keyof PageState]: PageStateManager<K>; }; type ContextType = { /** 渲染函数的入口参数 */ params?: Record<any, any>; /** 全局状态 */ globalState?: GlobalState; /** 更新全局状态 */ updateGlobalState?: (newState: Partial<GlobalState>) => void; /** 存储当前节点的数据,不具有响应性, 可能不是最新的值, 可以直接赋值 **/ staticVar?: Record<string | number, any>; methods?: Record<string, (...arg: any) => any>; /** 当前节点状态 **/ state?: CurrentNodeState; /** 更新当前节点状态 */ updateState?: (newState: Partial<CurrentNodeState>) => void; /** 获取当前节点状态最新 */ /** 用于访访问和管理页面被注册为全局的局部 state 快照,在闭包中使用会存在值不是最新的情况 */ stateManager: PageStateManagerMap; /** 循环数据 */ loopData?: { item: any; index: number; }; /** 组件节点的 Ref, 可以通过 current 直接调用节点提供的方法,需要判断是否在存在 */ nodeRefs?: { get: (/** 节点 id */ nodeId: NodeId) => { current?: any; }; }; /** 运行时全局的 store 管理 */ storeManager?: StoreManager<NodeId>; /** 第三方辅助库 */ thirdLibs?: Record<string, any>; }; declare class StoreManager<T extends NodeId> { storeMap: Map<T, StoreApi<PageState[T]>>; getStore(storeName: T): StoreApi<PageState[T]> | undefined; getState(nodeId: T): any; getStateObj(nodeId: T): { state: PageState[T]; updateState: (newState: Partial<PageState[T]>) => void; }; setState(nodeId: NodeId, newState: Partial<PageState[T]>): void | undefined; connect<T extends NodeId>(name: string, cb: (newState: PageState[T]) => void): () => void; getStateSnapshot(): PageState; destroy(): void; } type UpdaterMap = { [K in NodeId /** 更新对应 nodeId 的数据 **/]: (newState: Partial<PageState[K]>) => void; }; declare global { /** 运行时上下文 */ const $CTX: ContextType; /** 当前节点的 state */ const $STATE: CurrentNodeState; /** global state */ const $G_STATE: GlobalState; /** 当前页面所有节点的 state */ const $ALL_STATE: PageState; /** 状态更新函数 */ const $U_STATE: UpdaterMap; /** 节点方法调用 */ const $M: MethodsManager; /** 当前节点 ID */ const $N_ID: string; /** 存储所有节点的 id */ const $IDS: Record<NodeId, NodeId>; /** 上一个 API 返回的数据,可能不存在 */ const $RESPONSE: any; /** 循环数据,如果存在 */ const $LOOP_DATA: ContextType['loopData']; /** 函数在配置面板传入的参数 */ const $PARAMS: ContextType['params']; /** 事件传入的第一个参数,如果需要获取第二个参数,请使用 $ARGS 数组获取*/ const $EVENT_PARAMS: any; /** 事件对象 */ const $EVENT: MouseEvent; /** 函数执行时传入的入参 */ const $ARGS: any[]; /** action flow 中的局部变量 */ const $ACTION_VAR_SPACE: any; } export {};