Vue实现插槽下渲染dom字符串的使用

 更新时间:2023年04月17日 10:12:51   作者:何期骤雨降青霄  
本文主要介绍了Vue实现插槽下渲染dom字符串的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

Vue插槽想必大家都不陌生了,它可以在使用组件的时候决定组件的一部分内容如何渲染。但我最近遇到个需求需要将 dom 字符串插入到插槽下动态渲染插槽的内容,查找了很多资料都没找到相关的内容,后来自己想办法解决了,特此写个文章记录下。

需求

先来简单介绍下需求:这是在开发一个低代码平台的时候所遇到的需求,用户可以自己写一些组件上传到平台,在使用的时候可以对组件的 props slots events 进行配置,这就涉及到了动态插槽内容的实现了。对于代码编辑器的实现使用了 code-mirror,感兴趣的可以去看下,这里就不多说了。这里主要讲如何实现动态插槽内容渲染。

先来大致看下代码的上下文:

<template>
    <Component
        v-bind="componentProps"
    >
        <template
            v-for="item of componentSlots"
            #[item[0]]
        >
            
        </template>
    </Component>
</template>

<script setup lang="ts">
    const Component = defineAsyncComponent({
        // ...
    })
    const componentProps = ref({})
    const componentSlots = ref<[string, string][]>([])
    
    onMounted(async () => {
        componentProps.value = await loadProps()
        componentSlots.value = await loadSlots()
    })
</script>

v-html

说到渲染 dom 字符串,那 v-html 肯定是首要想到的。但是 template 标签上是无法使用 v-html 的,那么只能在 template 下写一个普通元素来塞 dom 字符串,代码如下:

<template
    v-for="item of componentSlots"
    #[item[0]]
>
    <span v-html="item[1]">
    </span>
</template>

这样的确实现了动态渲染插槽内容的需求,但是多出一个标签总是感觉不太妥当;而且也很难保证这个多出的 span 不会对组件的布局产生影响。这让我又陷入的沉思...

v-outerHTML

既然 innerHTML 不完全满足需求,那么使用 outerHTML 不就完美解决这个问题了吗?于是我去查关于 vue 如何使用 outerHTML 相关资料,发现并没有很好的案例,那就自己实现一个吧。

export const vOuterHTML = {
    bind(el, binding) {
        el.outerHTML = binding.value
    },
    update(el, binding) {
        el.outerHTML = binding.value
    },
}
<template
    v-for="item of componentSlots"
    #[item[0]]
>
    <span v-outerHTML="item[1]">
    </span>
</template>

代码保存,页面一刷新,这不完美实现了吗?但是等我去编辑 dom 字符串并保存后发现问题了,组件渲染内容并没有改变,控制台也报错了。

什么原因呢?原来是因为在 update 阶段时,span 已不在页面中,因此无法对他执行 outerHTML 赋值。

那怎么办呢?只需要在 bind 阶段记住 span 的父节点,然后在更新阶段手动再创建一个 spanappend 到父节点下,再进行 outerHTML赋值即可,代码如下:

export const vOuterHTML = (() => {
    let parentNode = null
    
    return {
        bind(el, binding) {
            parentNode = el.parentNode
            el.outerHTML = binding.value
        },
        update(el, binding) {
            if (parentNode) {
                const span = document.createElement('span')
                parentNode.appendChild(span)
                span.outerHTML = binding.value
            }
        },
        unbind() {
            if (parentNode) {
                parentNode = null
            }
        }
    }
})()

到此这篇关于Vue实现插槽下渲染dom字符串的使用的文章就介绍到这了,更多相关Vue 渲染dom字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue表单数据交互提交演示教程

    vue表单数据交互提交演示教程

    今天小编就为大家分享一篇vue表单数据交互提交演示教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 浅谈nuxtjs校验登录中间件和混入(mixin)

    浅谈nuxtjs校验登录中间件和混入(mixin)

    这篇文章主要介绍了浅谈nuxtjs校验登录中间件和混入(mixin),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue3 setup中使用$refs的方法详解

    Vue3 setup中使用$refs的方法详解

    在 Vue 3 中的 Composition API 中,$refs 并不直接可用于 setup 函数,但是实际工作中确实有需求,那么该如何解决呢,本文为大家整理了两个方案,希望对大家有所帮助
    2023-08-08
  • vuex实现简单的购物车功能

    vuex实现简单的购物车功能

    这篇文章主要为大家详细介绍了vuex实现简单的购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Vue监听数据的原理详解

    Vue监听数据的原理详解

    本篇文章主要介绍了Vue监测数据的原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看
    2021-10-10
  • vue3 setup语法糖之组件传参(defineProps、defineEmits、defineExpose)示例详解

    vue3 setup语法糖之组件传参(defineProps、defineEmits、defineExpose)示例详

    defineProps 和 defineEmits 都是只能在 <script setup> 中使用的编译器宏,他们不需要导入,且会随着 <script setup> 的处理过程一同被编译掉,这篇文章主要介绍了vue3 setup语法糖之组件传参(defineProps、defineEmits、defineExpose)示例详解,需要的朋友可以参考下
    2023-01-01
  • vue里的axios如何获取本地json数据

    vue里的axios如何获取本地json数据

    这篇文章主要介绍了vue里的axios如何获取本地json数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 通过实例讲解vue组件之间的传值

    通过实例讲解vue组件之间的传值

    通过Vuex共享数据,官方给出的跨多组件传递数据的解决方案,下面这篇文章主要给大家介绍了关于vue组件之间传值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 详解ESLint在Vue中的使用小结

    详解ESLint在Vue中的使用小结

    ESLint是一个QA工具,这篇文章主要介绍了详解ESLint在Vue中的使用小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • vue解决Not allowed to load local resource问题的全过程

    vue解决Not allowed to load local resource问题的全过程

    这篇文章主要给大家介绍了关于vue解决Not allowed to load local resource问题的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-10-10

最新评论