From 6ba0b4a762d7b53390cfe359b14bcf7b68334b37 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Wed, 19 Feb 2025 23:04:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20UIContainer=20=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=20VNode=20=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/system/ui/container.tsx | 53 +++++++++----------------------- src/core/system/ui/controller.ts | 11 +++---- src/core/system/ui/shared.ts | 19 +----------- src/module/render/index.tsx | 8 +++-- 4 files changed, 24 insertions(+), 67 deletions(-) diff --git a/src/core/system/ui/container.tsx b/src/core/system/ui/container.tsx index 7768842..41cf988 100644 --- a/src/core/system/ui/container.tsx +++ b/src/core/system/ui/container.tsx @@ -1,7 +1,6 @@ -import { computed, defineComponent } from 'vue'; -import { IUIMountable, UIBaseElementSlots, UIComponent } from './shared'; +import { computed, defineComponent, VNode } from 'vue'; +import { IUIMountable, UIComponent } from './shared'; import { SetupComponentOptions } from '@/module'; -import { ContainerProps } from '@/core/render'; export interface UIContainerProps { controller: IUIMountable; @@ -15,42 +14,18 @@ export const UIContainer = defineComponent(props => { const data = props.controller; const back = data.backIns; const show = computed(() => data.stack.filter(v => !v.hidden)); - return () => { - return ( - - {(() => { - const b = back.value; - if (!b || !data.showBack.value || b.hidden) return; - return ( - - ); - })()} - {show.value.map(v => ( - - ))} - + return (): VNode[] => { + const elements: VNode[] = []; + const b = back.value; + if (b && data.showBack.value && !b.hidden) { + elements.push( + + ); + } + return elements.concat( + show.value.map(v => ( + + )) ); }; }, containerConfig); - -export const UIRenderBase = defineComponent< - ContainerProps, - {}, - string, - UIBaseElementSlots ->((_props, { slots }) => { - return () => { - return {slots.defaults()}; - }; -}); - -export const UIDomBase = defineComponent<{}, {}, string, UIBaseElementSlots>( - (_props, { slots }) => { - return () => { - return
{slots.defaults()}
; - }; - } -); diff --git a/src/core/system/ui/controller.ts b/src/core/system/ui/controller.ts index 8fdb146..e4a5c1c 100644 --- a/src/core/system/ui/controller.ts +++ b/src/core/system/ui/controller.ts @@ -5,7 +5,6 @@ import { IKeepController, IUIInstance, IUIMountable, - UIBaseElement, UIComponent } from './shared'; import { Props } from '@/core/render'; @@ -18,7 +17,8 @@ import { ref, Ref, shallowRef, - ShallowRef + ShallowRef, + VNode } from 'vue'; import { UIContainer } from './container'; @@ -109,10 +109,7 @@ export class UIController * 创建一个 ui 控制器 * @param id 这个控制器的唯一标识符 */ - constructor( - public readonly id: string, - public readonly baseElement: UIBaseElement - ) { + constructor(public readonly id: string) { super(); if (UIController.controllers.has(id)) { logger.warn(57, id); @@ -124,7 +121,7 @@ export class UIController /** * 渲染这个 UI */ - render() { + render(): VNode { return h(UIContainer, { controller: this }); } diff --git a/src/core/system/ui/shared.ts b/src/core/system/ui/shared.ts index dbbb602..d91ec67 100644 --- a/src/core/system/ui/shared.ts +++ b/src/core/system/ui/shared.ts @@ -1,12 +1,5 @@ import { Props } from '@/core/render'; -import { - DefineComponent, - DefineSetupFnComponent, - Ref, - ShallowRef, - SlotsType, - VNode -} from 'vue'; +import { DefineComponent, DefineSetupFnComponent, Ref, ShallowRef } from 'vue'; export type UIComponent = DefineSetupFnComponent | DefineComponent; @@ -29,14 +22,6 @@ export interface IKeepController { unload(): void; } -export type UIBaseElementSlots = SlotsType<{ - defaults: () => VNode[]; -}>; - -export type UIBaseElement = - | DefineComponent<{}, {}, string, UIBaseElementSlots> - | DefineSetupFnComponent<{}, {}, UIBaseElementSlots>; - export interface IUIMountable { /** 当前的 UI 栈 */ readonly stack: IUIInstance[]; @@ -44,8 +29,6 @@ export interface IUIMountable { readonly backIns: ShallowRef | null>; /** 当前是否显示背景 UI */ readonly showBack: Ref; - /** UI 控制器的根元素 */ - readonly baseElement: UIBaseElement; /** * 隐藏一个 UI diff --git a/src/module/render/index.tsx b/src/module/render/index.tsx index bdd04ae..7b399a6 100644 --- a/src/module/render/index.tsx +++ b/src/module/render/index.tsx @@ -17,7 +17,7 @@ import { Textbox } from './components'; import { ILayerGroupRenderExtends, ILayerRenderExtends } from '@/core/render'; import { Props } from '@/core/render'; import { WeatherController } from '../weather'; -import { UIController, UIRenderBase } from '@/core/system'; +import { UIController } from '@/core/system'; export function create() { const main = new MotaRenderer(); @@ -64,11 +64,13 @@ export function create() { weather.bind(map.value); }); - const ui = new UIController('main-ui', UIRenderBase); + const ui = new UIController('main-ui'); return () => ( - {ui.render()} + + {ui.render()} +