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

其他教程   发布日期:2025年02月26日   浏览次数:159

本篇内容介绍了“Vue如何实现插槽下渲染dom字符串使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

需求

先来简单介绍下需求:这是在开发一个低代码平台的时候所遇到的需求,用户可以自己写一些组件上传到平台,在使用的时候可以对组件的

  1. props
  1. slots
  1. events
进行配置,这就涉及到了动态插槽内容的实现了。对于代码编辑器的实现使用了 code-mirror,感兴趣的可以去看下,这里就不多说了。这里主要讲如何实现动态插槽内容渲染。

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

  1. <template>
  2. <Component
  3. v-bind="componentProps"
  4. >
  5. <template
  6. v-for="item of componentSlots"
  7. #[item[0]]
  8. >
  9. </template>
  10. </Component>
  11. </template>
  12. <script setup lang="ts">
  13. const Component = defineAsyncComponent({
  14. // ...
  15. })
  16. const componentProps = ref({})
  17. const componentSlots = ref<[string, string][]>([])
  18. onMounted(async () => {
  19. componentProps.value = await loadProps()
  20. componentSlots.value = await loadSlots()
  21. })
  22. </script>

v-html

说到渲染

  1. dom
字符串,那
  1. v-html
肯定是首要想到的。但是
  1. template
标签上是无法使用
  1. v-html
的,那么只能在
  1. template
下写一个普通元素来塞
  1. dom
字符串,代码如下:
  1. <template
  2. v-for="item of componentSlots"
  3. #[item[0]]
  4. >
  5. <span v-html="item[1]">
  6. </span>
  7. </template>

这样的确实现了动态渲染插槽内容的需求,但是多出一个标签总是感觉不太妥当;而且也很难保证这个多出的

  1. span
不会对组件的布局产生影响。这让我又陷入的沉思...

v-outerHTML

既然

  1. innerHTML
不完全满足需求,那么使用
  1. outerHTML
不就完美解决这个问题了吗?于是我去查关于
  1. vue
如何使用
  1. outerHTML
相关资料,发现并没有很好的案例,那就自己实现一个吧。
  1. export const vOuterHTML = {
  2. bind(el, binding) {
  3. el.outerHTML = binding.value
  4. },
  5. update(el, binding) {
  6. el.outerHTML = binding.value
  7. },
  8. }
  1. <template
  2. v-for="item of componentSlots"
  3. #[item[0]]
  4. >
  5. <span v-outerHTML="item[1]">
  6. </span>
  7. </template>

代码保存,页面一刷新,这不完美实现了吗?但是等我去编辑

  1. dom
字符串并保存后发现问题了,组件渲染内容并没有改变,控制台也报错了。

什么原因呢?原来是因为在

  1. update
阶段时,
  1. span
已不在页面中,因此无法对他执行
  1. outerHTML
赋值。

那怎么办呢?只需要在

  1. bind
阶段记住
  1. span
的父节点,然后在更新阶段手动再创建一个
  1. span
  1. append
到父节点下,再进行 outerHTML赋值即可,代码如下:
  1. export const vOuterHTML = (() => {
  2. let parentNode = null
  3. return {
  4. bind(el, binding) {
  5. parentNode = el.parentNode
  6. el.outerHTML = binding.value
  7. },
  8. update(el, binding) {
  9. if (parentNode) {
  10. const span = document.createElement('span')
  11. parentNode.appendChild(span)
  12. span.outerHTML = binding.value
  13. }
  14. },
  15. unbind() {
  16. if (parentNode) {
  17. parentNode = null
  18. }
  19. }
  20. }
  21. })()

以上就是Vue如何实现插槽下渲染dom字符串使用的详细内容,更多关于Vue如何实现插槽下渲染dom字符串使用的资料请关注九品源码其它相关文章!