将 Vue 3 组件渲染为 HTML 字符串

2023-12-11

我正在开发一个 vue.js 项目(版本 3)。我遇到了一种情况,我想将组件的渲染 HTML 视图用于当前组件的方法。

我在 Vue 项目中创建了以下 SVG 组件。

CircleWithTextSvg.vue

<template>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" width="20" height="20">
        <g id="UrTavla">
            <circle cx="10" cy="10" r="10" stroke="gray" stroke-width="1" :fill="fill" />
            <text x="50%" y="50%" text-anchor="middle" stroke="black" stroke-width="1px" dy=".3em">{{text}}</text>
        </g>
    </svg>
</template>

<script>
    export default {
        props: {
            text: { 
                type: String, 
                default: "1"
            },
            fill: { 
                type: String, 
                default: "white"
            }
        }
    }
</script>

该组件基本上呈现一个内部有文本的圆圈。 如果我在主组件的模板部分中使用此组件,如下所示,那么它可以正常工作(显然)

主组件.vue

<template>
    <circle-with-text-svg />
</template>

但我想将此 SVG 组件渲染输出作为选项发送给第三方。

真实用例:-实际上,我创建了这个单独的组件以在我的传单地图上显示为标记。现在的问题是我想在 MainComponent 的方法中使用这个 SVG 组件,这样我就可以将它用作 L.divIcon 的选项

当我尝试以下操作时

export default {
    methods: {
        generateMap(element) {
            // ...
            let icon = L.divIcon({ 
                html: <circle-with-text-svg 
                    fill="'#D3D5FF'"
                    text="1" />, 
                iconSize: [10, 10]
            });
            // ...
        }
    }
}

然后它给出了错误

支持实验性语法“JSX 当前未启用”

在react中,我们可以正常地在另一个组件的模板中使用该组件。但是我们如何在 vue.js 中实现这一点

通过查看错误,似乎 JSX 实验未启用。

有人可以告诉我如何实现这一目标吗?


好的,所以在评论中我推荐了问题的答案vuejs中如何获取组件编译后的html内容这实际上是为 Vue 2 实现的

我很好奇这是否适用于 Vue 3,你可以看到下面的结果。以下是需要进行的更改:

  1. 明显的变化是取代new Vue with createApp并使用全局 h()相反,传递到render()
  2. 在Vue 2中,你可以调用$mount()不带参数的主 Vue 实例的函数。这是有效的,因为 Vue 创建了要挂载到内存中的 DOM 元素。 Vue 3 中不是这种情况 - 您需要自己提供元素
  3. 我的示例中未使用一项重大更改but对于某些用例来说非常重要的是,在 Vue 3 组件中,在主应用程序实例中注册为全局组件,使用app.component()无法访问tempApp用于渲染 HTML。所有使用中的组件都必须在适当的实例中注册 - 请参阅迁移指南
// We use component options object with string template
// In the proper Vue app (with Webpack and Vue SFC) this whole block can be replaced with "import CircleWithTextSvg from CircleWithTextSvg.vue"
const CircleWithTextSvg = {
  name: 'CircleWithTextSvg',
  props: {
    text: {
      type: String,
      default: "1"
    },
    fill: {
      type: String,
      default: "white"
    }
  },
  template: `
  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" width="20" height="20">
        <g id="UrTavla">
            <circle cx="10" cy="10" r="10" stroke="gray" stroke-width="1" :fill="fill" />
            <text x="50%" y="50%" text-anchor="middle" stroke="black" stroke-width="1px" dy=".3em">{{text}}</text>
        </g>
    </svg>
  `
}

const app = Vue.createApp({
  mounted() {
    console.log(this.getIconHtml('Hello!'))
  },
  methods: {
    getIconHtml(text, type) {
      const tempApp = Vue.createApp({
        render() {
          return Vue.h(CircleWithTextSvg, {
            text,
            type
          })
        }
      })

      // in Vue 3 we need real element to mount to unlike in Vue 2 where mount() could be called without argument...
      const el = document.createElement('div');
      const mountedApp = tempApp.mount(el)

      return mountedApp.$el.outerHTML
    }
  }
})

app.mount('#app')
<script src="https://unpkg.com/[email protected]/dist/vue.global.js"></script>
<div id='app'>
</div>

注1:上面的代码旨在直接在浏览器中运行import不可用。因此,我们使用 Vue 全局构建并访问 Vue 全局 API,例如Vue.createApp or Vue.h。在常规 Vue 应用程序中,您需要将这些函数导入为import { createApp, h } from 'Vue'

注 2:可以说,如果与 Leaflet 组件一起使用的 HTML 片段像您的那样简单CircleWithTextSvg组件,更简单和更高效的方法是将它们定义为 Vue 组件而不是模板文字

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Vue 3 组件渲染为 HTML 字符串 的相关文章

  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 将 SVG 文件转换为多个不同大小的 PNG 文件

    我有一个 SVG 格式的徽标图像 我想知道是否有办法生成多个不同大小的 png 文件 例如 我设置了 20 个不同的宽度和高度 它会生成 20 个 PNG 文件 如果我必须一次处理 5 张图像也没关系 我已经安装了 illustrator
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • 在负载平衡环境中获取 IIS 服务器变量的客户端值

    我有一个intranetASP NET Web 应用程序 我需要在其中获取客户端计算机的 IP 我通过以下代码执行此操作 HttpContext Current Request ServerVariables Item REMOTE HOS
  • 快照视图和动态视图有什么区别?

    我在 ClearCase 中看到有一个快照视图和一个动态视图 这些类型的视图之间有什么区别 我假设只有两种类型的视图 以及什么时候使用它们合适 快照视图基于本地文件系统 就像 Subversion 中的工作空间 您可以将文件加载到硬盘上的任
  • 为什么对派生类中的影子非虚拟成员函数的调用不调用基类成员函数?

    让我们在 Visual C 2010 中假设这个场景 include
  • 如果循环后没有匹配项,如何只得到一个答案

    我的代码在数组中有一个 for 循环 并且有 if 语句 如果没有匹配项 我只想得到一个答案 for int i 0 i lt arr Length i if arr i GetSomeValue gt 1 i GetSomeValue l
  • 如何检查 numpy 数组是否为空?

    如何检查 numpy 数组是否为空 我使用了以下代码 但如果数组包含零 则会失败 if not self Definition all 这是解决方案吗 if self Definition array 您可以随时查看 size属性 这是定义
  • 使用 2016 Facebook SDK 使页面访问令牌永不过期?

    我们正在构建的应用程序是一款 iOS 和 Android 移动应用程序 它将高中生与非营利组织配对 以帮助管理他们的 Facebook 页面 我们将每个学生分配到一个非营利组织 让他们成为 Facebook 页面的管理员 并允许他们代表该组
  • 如何在 Firestore (SWIFT) 中使用 FieldValue 减少值?

    阅读博客post和文档 我发现我们可以使用增加一个值FieldValue但我找不到减量函数 document fitness teams Team 1 updateData step counter FieldValue decrement
  • 查找当前流是否包含 ClearCase 中的基线

    假设我有一个名为 A1 的基线 然后我想看看是否有任何方法可以让我在同一个项目的任何地方进入另一个流 看看我的流中是否有 A1 IE 我的流中是否有 A1 中所做的代码更改 有什么快速的方法可以做到这一点吗 先感谢您 ClearCase 基
  • VBScript循环遍历文件夹中的所有文件

    我有在单个文件上执行该过程的代码 任何人都可以更改此脚本 以便它循环遍历目录 H Letter Display Letters 中文件类型为 的所有文件 LTR 并保存它们全部 Const ForReading 1 Const ForWri
  • $_GET 变量的编码混乱

    我在网站编码方面遇到了很多麻烦 这是我现在的问题 如果我去analize php dialog rbol哪个代码是
  • 使用 for 循环删除列表中的项目

    我有一个包含主题的数组 每个主题都有相关的时间 我想比较列表中的每个主题 如果有两个相同的科目 我想添加两个科目的时间 并且还想删除第二个科目信息 科目名称和时间 但是如果我删除该项目 列表就会变短 并且会出现超出范围的错误 我尝试使用 s
  • 使用 GhostScript 将 PDF 转换为服务器上的图像集合

    这些是我试图实现的步骤 在服务器上上传 PDF 文档 使用 GhostScript 将 PDF 文档转换为一组图像 每个页面都转换为图像 将图像集合发送回客户端 到目前为止 我感兴趣的是 2 首先 我下载了两个gswin32c exe an
  • Mahout row相似度

    我正在尝试计算维基百科文档之间的行相似度 我有 tf idf 向量的格式Key class class org apache hadoop io Text Value Class class org apache mahout math V
  • 如何读取Oracle集合类型的元素类型?

    我将 Oracle 集合类型定义为 type tab foo as table of obj foo Where obj foo定义为 type obj foo as object 通过致电 select from sys all type
  • ModuleNotFoundError:没有名为“pandas._libs.tslibs.timedeltas”的模块

    我是Python的学习者 执行我的脚本时出现问题 表明failed to execute script在通过 Pyinstaller 打包时 由于 ModuleNotFoundError 没有名为 pandas libs tslibs ti
  • 如何中止映射器(或减速器)内的 MR 作业

    我尝试在map方法中抛出IOExceptions 但MR作业没有停止 抛出大量 IOException 后作业将停止 有没有什么方法可以通过抛出异常或一些简单的调用来停止整个工作 谢谢 这不是 Hadoop 的理想用例 也不是一个好的实践
  • libusb-win32:自动安装驱动程序过滤器

    我在使用基于 libusb w32 的程序来检测设备时遇到了问题 该程序必须检测数码相机 我需要自动安装驱动程序过滤器 以便检测到任何新相机 而无需任何手动操作 我使用过 install filter i class 6BDD1FC6 81
  • 使用十进制数字生成可变颜色

    我创建了一个文件 其中第一列是十进制颜色线 第二列是 y 轴 x 轴是行号 0 0 1 1 2 2 然后我运行这个命令 plot test dat u 0 2 1 pt 7 ps 1 lc rgb variable 正如您在图片中看到的 输
  • 一个java文件如何调用另一个java文件的方法? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 如何在java中调用不同类 文件 的方法 是否需要对象 或者有第三种方法来合并java文档吗 我们可以使用简单的方法调用吗 有没有正确的方法来调用新方法 我不清楚你的问题 据我了解你想
  • 将 Vue 3 组件渲染为 HTML 字符串

    我正在开发一个 vue js 项目 版本 3 我遇到了一种情况 我想将组件的渲染 HTML 视图用于当前组件的方法 我在 Vue 项目中创建了以下 SVG 组件 CircleWithTextSvg vue