vue3+element-plus+el-image实现点击按钮预览大图

需求:点击某个按钮实现el-image中预览大图的效果

官方文档:以下是官方的写法,并不能达到我们的要求,官方实现的功能是点击图片达到预览大图的效果。如果你的按钮就是图片,也可以达到目前的功能

<template>
  <div class="demo-image__preview">
    <el-image
      style="width: 100px; height: 100px"
      :src="url"
      :preview-src-list="srcList"
      :initial-index="4"
      fit="cover"
    />
  </div>
</template>

<script lang="ts" setup>
const url =
  'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg'
const srcList = [
  'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
  'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
  'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
  'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
  'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
  'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
  'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
]
</script>

<style scoped>
.demo-image__error .image-slot {
  font-size: 30px;
}
.demo-image__error .image-slot .el-icon {
  font-size: 30px;
}
.demo-image__error .el-image {
  width: 100%;
  height: 200px;
}
</style>

1.el-image-viewer

el-image-viewer组件是element官方的组件,只是文档中没有写出来,这个组件就是大图预览的组件,当引用ElImage组件的时候,需要把ElImageViewer也需要引入,就可以直接用这个组件了

<template>
	<div class="upload-single-img">
        <button @click="showImg">预览</button>
        <el-image-viewer v-if="showImageViewer" :url-list="[url]" @close="close" />
    </div>
</template>

<script lang="ts" setup name="UploadSingleImg">
    import { ref, computed, reactive, defineComponent } from 'vue'
    const showImageViewer = ref(false) //组件是否显示
    const url = ref([]) //预览大图的路径集合
    const showImg= () => { //预览大图
        showImageViewer.value = true
    }
    const close = () => { //必须要这个事件 不然点击右上角关闭按钮没有反应
        showImageViewer.value = false
    }
</script>

2.通过ref直接调用el-image的单击事件

以下是vue2的写法,网上搜索的,没有去实现过,我把这种写法改成vue3的写法发现好像不能实现,后面选择了第一种写法

<div class="demo-image__preview">
    <el-image
      style="width: 100px; height: 100px" ref="previewImg"
      :src="url"
      :preview-src-list="srcList">
    </el-image>
</div>
<el-button type="danger" @click="viewBigPicture">点击按钮查看大图</el-button>

import logo from '../../assets/logo.png';
export default {
  name: "vue_project",
  data() {
    return {
      url: logo,
      srcList: [logo]
    }
  },
  methods: {
    viewBigPicture(){
      this.$refs.previewImg.showViewer = true; //vue2写法第一种写法
      this.$refs.previewImg.clickHandler();     //vue2写法第二种写法
    }
  }
}

vue3写法

<div class="demo-image__preview">
    <el-image
      style="width: 100px; height: 100px" ref="previewImg"
      :src="url"
      :preview-src-list="srcList">
    </el-image>
</div>
<el-button type="danger" @click="viewBigPicture">点击按钮查看大图</el-button>

<script lang="ts" setup>
    import { ref, computed, reactive, defineComponent } from 'vue'
    const previewImg = ref(null)
    const viewBigPicture = () =>{
        previewImg.value.clickHandler()
    }

</script>

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,下面是使用 Vue3+Element-plus 编写图片上传的代码及注释: ```html <template> <div> <el-upload class="avatar-uploader" action="/api/upload" :show-file-list="false" :on-success="handleSuccess" :before-upload="beforeAvatarUpload" > <!-- 上传按钮 --> <img v-if="imageUrl" :src="imageUrl" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </div> </template> <script> import { ref } from 'vue' export default { name: 'AvatarUpload', setup() { const imageUrl = ref('') // 上传前的校验 const beforeAvatarUpload = (file) => { const isJPG = file.type === 'image/jpeg' const isPNG = file.type === 'image/png' const isLt2M = file.size / 1024 / 1024 < 2 if (!isJPG && !isPNG) { this.$message.error('上传头像图片只能是 JPG/PNG 格式!') return false } if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!') return false } return true } // 上传成功的回调 const handleSuccess = (res) => { if (res.code === '200') { imageUrl.value = res.data.url this.$message.success('上传成功!') } else { this.$message.error('上传失败,请重试!') } } return { imageUrl, beforeAvatarUpload, handleSuccess } } } </script> <style scoped> .avatar-uploader { display: flex; justify-content: center; align-items: center; width: 120px; height: 120px; border-radius: 50%; border: 1px dashed #ccc; background-color: #f9fafc; cursor: pointer; } .avatar { width: 120px; height: 120px; border-radius: 50%; object-fit: cover; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; } </style> ``` 注释: - `el-upload` 是 Element-plus 中的上传组件,`action` 属性指定上传接口地址,`show-file-list` 属性指定是否显示上传文件列表,`on-success` 属性指定上传成功的回调函数,`before-upload` 属性指定上传前的校验函数; - `img` 标签用于展示上传成功后的图片,属性 `v-if="imageUrl"` 判断 `imageUrl` 是否存在,如果存在则显示图片,否则显示上传按钮; - `i` 标签用于显示上传按钮,属性 `v-else` 表示如果 `imageUrl` 不存在,则显示按钮; - `ref` 是 Vue3 中用于创建响应式数据的方法; - `beforeAvatarUpload` 方法用于上传前的校验,判断文件类型和大小是否符合要求; - `handleSuccess` 方法用于上传成功的回调,在回调中将上传成功的图片地址赋值给 `imageUrl`,并提示上传成功; - `setup` 函数是 Vue3 中的新特性,用于组件的选项设置,返回一个对象,包含组件中需要用到的数据和方法; - `return` 中的数据和方法,会被 Vue3 自动注入到组件的模板中使用; - `style` 标签的 `scoped` 属性表示样式仅作用于当前组件中的元素,不会影响到其他组件的样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值