需求:点击某个按钮实现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>

Logo

前往低代码交流专区

更多推荐