import { watchEffect, defineComponent, PropType } from 'vue' import { Event, SketchElement, SketchRoot, StyleSheetDeclaration } from '@sketchjs/runtime' import { useSketchElement } from '@/common/hooks' export const InternalSketchRoot = defineComponent({ name: 'SketchRoot', props: { /** * 是否自动渲染 */ autoRender: Boolean, /** * sketch 实例 */ sketch: Object as PropType, /** * 样式 */ style: Object as PropType }, emits: { /** * 初始化完成事件回调 * @param event */ ready: (event: Event) => event instanceof Event, /** * 元素更新事件回调 * @param event */ update: (event: Event) => event instanceof Event }, setup: (props, { slots, emit }) => { const handleSketchInitialized = (event: Event) => { if (props.autoRender) props.sketch?.render() emit('ready', event) } const handleSketchElementUpdate = (event: Event) => { if (!props.sketch?._root.isMounted) return if (props.autoRender) props.sketch?.render() emit('update', event) } watchEffect((onCleanup) => { if (!props.sketch) return props.sketch.addEventListener('initialized', handleSketchInitialized) props.sketch.addEventListener('elementUpdate', handleSketchElementUpdate) // 组件卸载时清理 onCleanup(() => { props.sketch?.removeEventListener('initialized', handleSketchInitialized) props.sketch?.removeEventListener('elementUpdate', handleSketchElementUpdate) }) }) watchEffect(() => { if (!props.sketch) return props.sketch.setStyle(props.style) }) useSketchElement({ self: props.sketch }) return () => ( ) } })