import type { VNode } from 'vue';
import { h, render } from 'vue';
const COMPONENT_CONTAINER_SYMBOL = Symbol('dev_component_container');
type IMargeVNode = {
[COMPONENT_CONTAINER_SYMBOL]?: HTMLDivElement;
} & VNode;
* 创建组件实例对象
* 返回的实例和调用 getCurrentComponent() 返回的一致
* @param {*} Component
*/
export function createComponent(component: any, props: any, children: any = null): VNode['component'] {
const vnode: IMargeVNode = h(component, { ...props }, children);
const container = document.createElement('div');
vnode[COMPONENT_CONTAINER_SYMBOL] = container;
render(vnode, container);
return vnode.component;
}
* 销毁组件实例对象
* @param {*} ComponnetInstance 通过createComponent方法得到的组件实例对象
*/
export function unmountComponent(ComponnetInstance: any): void {
render(null, ComponnetInstance?.vnode[COMPONENT_CONTAINER_SYMBOL]);
}