需求是将html的打印模板在vue项目中动态引入
实现过程:
方法1:
第一步: 将html文件放到项目public文件夹下,如图
第二部 定义模板
<div ref="container"></div>
第三步: 通过axios 获取到文本内容, 渲染文本内容
axios.get('/static/pring.html').then(response => {
let htmlString = response.data;
// 将HTML字符串设置到容器中
container.value.innerHTML = htmlString;
// 使用DOMParser来解析HTML并获取其中的脚本
const doc = new DOMParser().parseFromString(htmlString, 'text/html');
const script: any = doc.querySelectorAll('script');
if (script) {
// 如果存在script标签,则使用eval来执行
script.forEach((item) => eval(item.textContent));
}
}).catch(error => {
console.error('There was an error fetching the HTML content:', error);
});
实现效果
方法二
将html文本存储到后端,通过接口查询返回,执行行添加参数
axios.get({ url: '/sys/ext/report/list', params })
.then((res) => {
if (res.records?.length) {
let htmlString = res.records[0]['reportContent'];
// 拼接模板需要使用的 数据data
let data = `
var data = [
{
detailList: [{}],
batchCodeList:[{
detailList: [{}],
}]
},
];
`;
let index = htmlString.indexOf('// 预览模板替换参数位置,勿删除');
htmlString = htmlString.substring(0, index) + data + htmlString.substring(index);
// 拼接模板需要使用的 数据data
// 将HTML字符串设置到容器中
container.value.innerHTML = htmlString;
// 使用DOMParser来解析HTML并获取其中的脚本
const doc = new DOMParser().parseFromString(htmlString, 'text/html');
const script: any = doc.querySelectorAll('script');
if (script) {
// 如果存在script标签,则使用eval来执行
script.forEach((item) => eval(item.textContent));
}
}
})
.finally(() => (loading.value = false));