vue3+element plus图片预览点击按钮直接显示图片的预览形式

1 需求

直接上需求:

我想要直接点击下面这个“预览”按钮,然后呈现出预览图片的形式

image-20231120090930791

也就是点击完“预览”按钮,会像下面这样:

image-20231120091054028

ok,需求知道了,下面让我们来看看如何实现吧 ~

2 实现

template部分

<el-button
  type="primary"
  size="small"
  @click="handlePreview(scope.$index, scope.row)"
  >预览</el-button
>
<!-- 图片预览 -->
<el-image-viewer
  v-if="showImagePreview"
  :zoom-rate="1.2"
  @close="closePreview"
  :url-list="imgPreviewList"
/>

script部分

const imgPreviewList = ref<any>([])
const showImagePreview = ref(false)
const currentBase64FileData = reactive({
  base64: '',
  name: ''
})

const handlePreview = async (index: number, row: any) => {
    let res = await handleDownload(index, row, true,)
    currentBase64FileData.base64 = 'data:image/png;base64,' + res?.base64
    currentBase64FileData.name = res?.name
    showImagePreview.value = true
    // 下面数组里可以放一个url,如'https://raw.githubusercontent.com/JACK-ZHANG-coming/map-depot/master/2023image-20231120091054028.png',我这里放的是一个base64数据,也可以用来显示图片
    imgPreviewList.value = [currentBase64FileData.base64]
}

const closePreview = () => {
  imgPreviewList.value = []
  showImagePreview.value = false
}

ok,经过上面简单几句代码,就实现了“点击按钮直接显示图片的预览形式”啦 ~

3 技术小结

技术栈: vue3+ element plus,其中vue3采用的是script setup组合式语法的形式。

这部分功能其实在element plus官方文档中有写,

https://element-plus.org/zh-CN/component/image.html#image-viewer-api

image-20231120100147616

不同的是,这里element plus并没有给出实际样例,只是用文字描述了下,咱就是说,家人们,这坑不坑,我还是看了别人的博客才知道这块的用处>_<

Vue3 + Element Plus 实现图片上传和拍照功能通常会结合Element UI的`el-upload`组件和原生HTML5的`<input type="file" accept="image/*">`以及`navigator.mediaDevices.getUserMedia()`。以下是步骤概览: 1. **设置upload组件**: 使用Element Plus的`el-upload`组件,配置成支持文件和相机选择: ```html <el-upload action="" :auto-upload="false" accept="image/jpeg,image/png" :on-change="handleImageChange" ref="upload" ></el-upload> ``` 2. **添加事件处理器**: - `handleImageChange`处理用户选择的图片: ```javascript async handleImageChange(file) { if (file.type.match('image')) { // 进行预览 this.currentImg = URL.createObjectURL(file); } else { alert('只允许上传图片'); } } ``` - 拍照事件,可以使用`getUserMedia`获取媒体流并显示: ```javascript async takePhoto() { const constraints = { mediaSource: 'camera' }; try { const stream = await navigator.mediaDevices.getUserMedia(constraints); // 将stream转换为File,然后处理同上 // ...将stream.toBlob().then(blob => ...)... } catch (err) { console.error(err); } } ``` 3. **预览效果**: - 可以通过`v-if`或`v-show`来显示或隐藏图片预览区域: ```html <div v-if="currentImg"> <img :src="currentImg" alt="图片预览"/> </div> ``` 4. **提交图片**: 当用户完成编辑或选择满意的照片后,你可以提供一个按钮提交到服务器,比如配合axios发送请求。 ```javascript submit() { if (this.currentImg) { axios.post('/api/upload', { file: this.currentImg, }).then(response => { console.log(response); }); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值