我不完全确定我是否正确理解了您的问题,但考虑到您有这样的 HTML 字符串:
<p> kjfdkf </p>
<img src="PATH" />
<p> kfdfk </p>
<img src="PATH" />
<div> kdfjdkf </div>
...内部带有随机图像元素,您可能可以解析 HTML 以将图像元素的源更改为它们的原始数据,而不是当前的相对路径。
DOMParser
似乎是解析 HTML 最简单的选项,因为您可以在一行中解析它:
let el = new DOMParser().parseFromString(this.html, "text/html");
然后只需找到所有图像元素:
let imgs = el.getElementsByTagName("img");
...将它们的来源更改为原始形式:
imgs.forEach((img) => (img.src = require(img.src)));
...选择正文el
(因为那是您的 HTML 所在的位置):
let body = el.body;
...并返回其innerHTML:
return body.innerHTML;
您可以将这一切包装在一个计算属性中:
computed: {
processedHtml() {
let el = new DOMParser().parseFromString(this.html, "text/html"),
imgs = el.getElementsByTagName("img");
imgs.forEach((img) => (img.src = require(img.src)));
let body = el.body;
return body.innerHTML;
},
}
这是完整的代码:
<template>
<div id="app">
<div v-html="processedHtml"></div>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
html: `<p> kjfdkf </p><img src="PATH" /> <p> kfdfk </p> <img src="PATH" /> <div> kdfjdkf </div>`,
};
},
computed: {
processedHtml() {
let el = new DOMParser().parseFromString(this.html, "text/html"),
imgs = el.getElementsByTagName("img");
imgs.forEach((img) => (img.src = require(img.src)));
let body = el.body;
return body.innerHTML;
},
},
};
</script>
或者,如果您将图像移动到您的public
目录,它们的名称将不会被 webpack 修改,因此您可以避免所有这些。