【发布时间】:2021-11-19 16:58:20
【问题描述】:
这是关于 Vite 的 Vue 3 应用程序,而不是 webpack。
目前,正如您在this issue on vite's issue page 中看到的那样,vite 没有一种方便的方法来内联 SVG,而无需使用外部插件。然而,Vite 确实如此,support importing files as raw text strings。因此,我有一个想法来使用此功能并通过将原始 SVG 字符串传递到元素的 v-html 来内联 SVG。
实际上效果很好,SVG 可以按预期显示在页面上,并且我可以进行通常的 CSS 转换(像这样内联它们的全部目的),但它并不完美。就目前而言,接收v-html 指令的元素只是将提供的 HTML 嵌套为子元素。例如,如果我执行<span v-html="svgRaw" />,最终的 HTML 会是这样的
<span>
<svg>
<!-- SVG attributes go here -->
</svg>
</span>
我有什么办法可以将声明v-html 的父元素替换为传递给它的顶级元素吗?在上面的例子中,这意味着<span> 只是变成了<svg>
编辑:
感谢 tony19 提到自定义指令。
我的最终结果是这样的:
// main.ts
import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);
app.directive("inline", (element) => {
element.replaceWith(...element.children);
});
app.mount("#app");
然后,在组件中,我只需使用指令<svg v-html="svgRaw" v-inline />,效果很好!
【问题讨论】: