VUE-使用element实现图片预览功能

  • 业务逻辑描述:
  1. 获取图片成功时,图片展示,可点击进行预览;获取失败时,图片显示默认的,不可点击不能预览;
  2. 点击哪张图片,预览时这张图片显示在第一个,点击左右键可滑动查看图片;

 

成功时:      失败时:

预览时:

  • 预览图片组件 showPreview.vue 实现技术点:
  1. 图片的高度固定是82px,宽度需要根据实际情况决定,这时候可以写一个v-width指令,用来设置图片的宽度,可以是px也可以是%
  2. 预览图片时,每次都把当前点击的图片作为第一个,需要定义一个新的数组 imagesPreview 根据点击图片的index来重组数据
<template>
    <div class="hi-upload-file">
        <template v-if="arrFileData && arrFileData.length > 0">
            <!-- 1、图片展示 -->
            <div class="file-icon img" v-for="(file,index) in arrFileData" :key="index" @click="showImage(index)"  v-width="widthData">
                 <el-image :src="file.url" @error="loadError">
                    <div slot="error" class="image-error"></div>
                </el-image>
                 <!-- 下载图标展示与否操作 -->
                <span class="el-upload-actions" v-if="downLoadFlag">
                    <!-- 技术点:注意事件冒泡,使用stop阻止一下 -->
                    <span class="save" @click.stop="doSave(file)"></span>
                </span>
            </div>
             <!-- 2、图片预览 -->
            <el-dialog :visible.sync="dialogVisible" :modal-append-to-body='false' >
                <!-- 技术点:一定使用v-if="dialogVisible" 不能使用v-show,否则图片展示时(假设点击的是第3张),前两张会快速的滑过-->
                <div class="block" v-if="dialogVisible">
                    <el-carousel trigger="click" class="imgbox" :autoplay="false" arrow="always" indicator-position="outside">
                        <el-carousel-item v-for="(item,index) in imagesPreview" :key="index">
                            <img :src="item.url" height="100%">
                        </el-carousel-item>
                    </el-carousel>
                </div>
            </el-dialog>
        </template>
        <template v-else>
            <span>无</span>
        </template>
    </div>
</template>

<script>
    import Vue from 'vue'
    export default {
        props:{
            /** 显示图片数组,格式如下
             * [{
             *  url:"图片url",
             *  name:"图片名"
             * },
             * ...
             * ]
             */
            arrFileData:{
                type:Array,
                default:function(){
                    return [];
                }
            },
            // 图片宽度,默认82px,也可以传百分比,如30%
            widthData:{
                type:String,
                default:'82px'
            },
        },
        directives: { //自定义宽度指令
            'width':{
                bind(el,binding) {
                    el.style.width=binding.value
                },
            }
        },
        data() {
            return {
                dialogVisible: false,//预览窗口是否展示,默认不展示
                downLoadFlag:true,//下载图标展示与否,默认展示
                imagesPreview:[],//预览时根据点击的index重组的数据
            };
        },
        methods: {
            /** 图片加载失败调用 */
            loadError(event){
                this.downLoadFlag=false;//下载图标不显示
            },
            /** 图片预览 */
            showImage(index){
                if(!this.downLoadFlag){
                    return false;
                }
                this.imagesPreview=[];
                this.dialogVisible=true;
                let imgArr=this.arrFileData;
                let before = imgArr.slice(0, index)
                let after=imgArr.slice(index);
                this.imagesPreview=after.concat(before);
            },
            doSave(file){
                .....
            },
            /** 获取文件下载地址 */
            getFileDownUrl(file){   
               ......
            },
        }
  }
</script>
<style lang="stylus" scoped>
    @import "~assets/stylus/upload"
</style>
  •  父组件引用预览组件,需要传递 图片数据和宽度
<!-- 1、使用默认值 -->
<show-preview  :arrFileData="imageDate"></show-preview>
<!-- 2、百分比 -->
<show-preview  :arrFileData="imageDate" :widthData="'30%'"></show-preview>
<!-- 3、像素 -->
<show-preview  :arrFileData="imageDate" :widthData="'80px'"></show-preview>


imageDate:[
    {url:***,name:***},
    {url:***,name:***},
    {url:***,name:***},
]

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
您好,关于您的问题,可以通过以下步骤实现图片预览: 1. 首先,需要安装并引入 element-ui 组件库和 vue-preview 插件。 2. 在需要实现图片预览的页面中,使用 <el-upload> 组件上传图片,并设置相关属性,如 action、before-upload、list-type 等。 3. 在 <el-upload> 组件的 slot 属性中添加自定义内容,这里可以使用 vue-preview 插件来实现图片预览。具体实现方法如下: ``` <el-upload action="your_upload_url" :before-upload="checkImage" list-type="picture-card"> <i slot="default" class="el-icon-plus"></i> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> // 添加自定义内容 <vue-preview :slides="slides"></vue-preview> </el-upload> ``` 4. 在 data 中定义 slides 数组,并在 checkImage 方法中动态生成 slides 数组的内容,用于传递给 vue-preview 组件进行图片预览。具体实现方法如下: ``` data() { return { slides: [] } }, methods: { checkImage(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG || !isLt2M) { this.$message.error('上传图片只能是 JPG/PNG 格式,且不超过 2MB'); return false; } // 生成 slides 数组,并使用 vue-preview 进行图片预览 const reader = new FileReader(); reader.readAsDataURL(file.raw); reader.onload = () => { this.slides.push({ src: reader.result }); this.$nextTick(() => { this.$refs.preview.open(); }); }; } } ``` 以上就是使用 vue 结合 element-ui 实现图片预览的方法了,希望能对您有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛佛ง

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值