搞一个vue3的自由模板组件

116 阅读1分钟

最近呀,一直被各种UI样式搞得死去活来,尤其是echarts各种弹窗,还要地图模块上乱七八糟的弹窗,自定义html片段,不仅没有代码提示,修改起来也是抓狂,都没有时间摸鱼了。假设有一个组件,既可以动态渲染数据,又可以实时渲染,那是多好的事情。

开始封装组件

第一步需要定义模板,模板既要放在vue的template标签当中,又要不显示出来,是个难题。无意间想到一个骚操作,利用vue的defineComponent创建一个组件,但是setup不设置返回值,不就是一个空组建了。

const define = defineComponent({
    setup() {

    }
})

用什么接收模板的内容呢,想到了插槽,我们就直接用默认插槽就好了。

// 接收到插槽的内容,先保存起来
const template = shallowRef<Slot | undefined>()

const define = defineComponent({
    setup(_, { slots }) {
        template.value = slots?.default
    }
})

自定义一个renderContainer函数,在使用的时候,动态调用这个模板就好了。

let containter = document.createElement("div")

function renderContainer(data?: any) {
    render(createVNode(resume, { data: data || {} }), containter)
    return containter
}

这个小技巧比较简单,平时不是很容易想到。

我的组件

我这里将它封装成了一个组件,放在了我的组件库里面,仅支持typescript 项目。

howuse.yigechengzi.com/freedom-dia…