作者:。 | 来源:互联网 | 2023-08-11 18:09
本文主要分享【vue中image标签的样式怎么写】,技术文章【dom-to-image将vue中未显示的组件转成图片,并上传】为【一条大河全靠浪】投稿,如果你遇到前端实践相关问题,本文相关知识或能
本文主要分享【vue中image标签的样式怎么写】,技术文章【dom-to-image 将vue中未显示的组件转成图片, 并上传】为【一条大河全靠浪】投稿,如果你遇到前端实践相关问题,本文相关知识或能到你。
vue中image标签的样式怎么写
目录 一、dom-to-image基本使用二、注意点三、生成的图片上传至服务器1、base64 转 File 格式2、blob 转 File 格式3、在页面展示生成的图片4、最终dom转图片函数5、上传图片6、问题未解决 四、vue实现将不显示的组件转成图片,而组件之间出现循环引用
一、dom-to-image基本使用
npm地址
import domtoimage from 'dom-to-image'
export function dom2img(node) {
return domtoimage.toPng(node, {
cacheBust: true })
.then(function(dataUrl) {
var img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
return dataUrl
})
.catch(function(error) {
console.error('oops, dom2img went wrong!', error);
});
}
dom2img(node).then(img => {
}
可以添加参数 , 比如控制大小,修改样式
domtoimage.toJpeg(node, {
width: 330,
height: 155,
cacheBust: true,
style: {
margin: 0,
background: '#fff',
}
})
二、注意点
dom-to-image
将dom转图片有个前提,就是一定要在文档中显示,任何样式导致不显示都导致无法生成图片,比如:visibility:hidden,display: none;
宽高不能是100%,否则也是转换失败
如果是动态引入的组件转换,要保证组件没有需要异步加载的部分,比如一些背景图是请求接口的, 只能在页面显示后,通过$refs来获取dom,动态引入不知道什么时候加载完成的
toPng 要去掉dom样式中的margin,否则切图出来的会有被截断的问题
三、生成的图片上传至服务器
平时上传图片主要是用到
元素, 用户选择的文件最终是File对象,所以,我们将生成的图片转成File对象,然后通过formData上传即可。
这里主要用png格式和blob格式举例
1、base64 转 File 格式
function base64toFile(dataUrl, fileName = 'image') {
let arr = dataUrl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = window.atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${
fileName}.png`, {
type: mime
})
}
2、blob 转 File 格式
File继承自Blob,是特殊类型的 Blob。
function blobtoFile(blob, fileName = 'image') {
const file = new File([blob], fileName, {
type: blob.type
})
return file
}
3、在页面展示生成的图片
function showImg(dataUrl) {
var img = new Image()
img.src = dataUrl
document.body.appendChild(img)
}
4、最终dom转图片函数
import domtoimage from 'dom-to-image'
export function dom2img(node, fnType = 'toPng') {
return domtoimage[fnType](node, {
cacheBust: true
})
.then(function(dataUrl) {
if (fnType === 'toPng') {
showImg(dataUrl)
return base64toFile(dataUrl)
}
if (fnType === 'toBlob') {
const blobUrl = URL.createObjectURL(dataUrl)
showImg(blobUrl)
setTimeout(() => {
URL.revokeObjectURL(blobUrl)
}, 200)
return blobtoFile(dataUrl)
}
return dataUrl
})
.catch(function(error) {
console.error('oops, dom2img went wrong!', error)
})
}
5、上传图片
function uploadImgToBoot(imgFile) {
const formData = new FormData();
formData.append('file', imgFile)
return uploadZhImg(formData).then(res => {
return res
})
}
6、问题未解决
blob转File后,上传图片接口报错, 未找到原因
四、vue实现将不显示的组件转成图片,而组件之间出现循环引用
1、首先在html中放一个占位div,用于渲染dom
// 不能使用visibility:hidden 或者 display:none, 会导致dom转换失败 .show-in-back {
position: absolute;
top: 0;
z-index: -1000;
}
2、这里使用动态引入避免组件死循环:
import Vue from 'vue/dist/vue.esm.js'
const ApplyCard = () => import('@/views/apply/components/ApplyCard.vue')
3、挂载点内容会被vue组件覆盖,所以每次要新建一个挂载点内容,设置id="toImg"
const node = document.getElementById('hideNode')
node.innerHTML = '
'
4、利用vue动态构建组件,并挂载到id="toImg"
上
ApplyCard().then(res => {
const temp = res.default
const Card = Vue.extend(temp)
const vueComponent = new Card({
el: '#toImg',
propsData: {
info: '',
}
})
vueComponent.$nextTick(() => {
const node = vueComponent.$el
dom2img(node).then(img => {
})
})
})
本文《dom-to-image 将vue中未显示的组件转成图片, 并上传》版权归一条大河全靠浪所有,引用dom-to-image 将vue中未显示的组件转成图片, 并上传需遵循CC 4.0 BY-SA版权协议。