import { Observable } from '@tanbo/stream'; import { Injector } from '@viewfly/core'; import { Component } from '../model/component'; import { Slot } from '../model/slot'; import { NodeLocation, VElement, VTextNode } from '../model/element'; import { Format } from '../model/format'; import { Decorator } from '../model/decorator'; export interface ViewMount { (host: NativeElement, viewComponent: ViewComponent, injector: Injector): (void | (() => void)); } /** * 视图渲染器抽象接口 */ export interface Renderer { componentRender(component: Component): ViewComponent; vElementToViewElement(vEle: VElement, children: Array): ViewElement; getAndUpdateSlotRootNativeElement(vEle: VElement, update: (nativeElement: NativeElement | null) => void): void; createCompositionNode(compositionState: CompositionState, updateNativeCompositionNode: (nativeNode: NativeElement | null) => void): ViewElement; getChildByIndex(parentElement: NativeElement, index: number): NativeElement | NativeTextNode; getParentNode(node: NativeElement | NativeTextNode): NativeElement | null; getChildNodes(parentElement: NativeElement): Array; isNativeElementNode(node: NativeElement | NativeTextNode): node is NativeElement; } export interface CompositionState { slot: Slot; text: string; offset: number; index: number; } export declare class InputDecorator extends Decorator { } /** * Textbus 渲染适配器 */ export declare abstract class Adapter { private adapter; private mount; composition: CompositionState | null; /** 当视图更新时触发事件的可观察对象,用于通知 Textbus 视图渲染已完成 */ abstract onViewUpdated: Observable; abstract host: NativeElement; protected slotRootVElementCaches: WeakMap>, VElement>; protected slotRootNativeElementCaches: { set: { (key: Slot>, value: NativeElement): void; (key: NativeElement, value: Slot>): void; }; get: { (key: Slot>): NativeElement; (key: NativeElement): Slot>; }; remove: (key: Slot> | NativeElement) => void; }; protected componentRootElementCaches: { set: { (key: Component, value: NativeElement): void; (key: NativeElement, value: Component): void; }; get: { (key: Component): NativeElement; (key: NativeElement): Component; }; remove: (key: Component | NativeElement) => void; }; compositionNode: any; private inputDecorator; protected constructor(adapter: Renderer, mount: ViewMount); /** 根组件渲染方法 */ render(rootComponent: Component, injector: Injector): void | (() => void); componentRender(component: Component): ViewComponent; slotRender(slot: Slot, slotHostRender: (children: Array) => VElement, renderEnv?: any): ViewElement; slotRender(slot: Slot, customFormat: Format, slotHostRender: (children: Array) => VElement, renderEnv?: any): ViewElement; /** * 根据组件获取组件的根 DOM 节点 * @param component */ getNativeNodeByComponent(component: Component): NativeElement | null; /** * 根据 DOM 节点,获对对应的组件根节点,如传入的 DOM 节点不为组件的根节点,则返回 null * @param node */ getComponentByNativeNode(node: NativeElement): Component | null; /** * 根据插槽获取插槽的根 DOM 节点 * @param slot */ getNativeNodeBySlot(slot: Slot): NativeElement | null; /** * 根据 DOM 节点,获对对应的插槽根节点,如传入的 DOM 节点不为插槽的根节点,则返回 null * @param node */ getSlotByNativeNode(node: NativeElement): Slot | null; /** * 获取插槽内容节点集合 * @param slot */ getNodesBySlot(slot: Slot): (NativeElement | NativeTextNode)[]; /** * 获取原生节点的原始数据在文档中的位置 * @param node */ getLocationByNativeNode(node: NativeElement | NativeTextNode): NodeLocation | null; private getNodes; private getLocation; /** 当前平台的复制能力 */ abstract copy(): void; /** 将虚拟树节点转换为视图树节点 */ vElementToViewElement(vNode: VElement, slot?: Slot): ViewElement; }