首页 前端知识 Vue element组件el-upload之on-preview图片预览,实战篇之多种预览方式

Vue element组件el-upload之on-preview图片预览,实战篇之多种预览方式

2024-05-12 00:05:32 前端知识 前端哥 673 482 我要收藏

废话不多说,直接上代码:

1、首先,项目需要先引入 element 组件

2、第一种预览方式

1、组件使用
<div style="display: inline-block;width: 10px;width: 84%;">
            <el-upload multiple action="#" list-type="picture-card" :on-preview="handlePictureCardPreview" :on-remove="handleRemove" 
			:on-exceed="(fileList)=>{this.$message({type:'warning' , message : '已选数量超出上传限制,请重新选择'})}" :on-change="handleChange" accept=".png, .jpg, .jpeg" :auto-upload="false" :file-list="fileList" :limit="3" 
			:class="fileList && fileList.length >= 3 ? 'hide' : 'show'">
              <i class="el-icon-plus"></i>
            </el-upload>
            <el-dialog :append-to-body="true" :visible.sync="PreviewVisible" style="width: 60%;margin-left: 20%;">
              <el-image style="width: 500px;height: 500px;" :src="dialogImageUrl" fit='fill' alt=""></el-image>
            </el-dialog>
          </div>



js:

handlePictureCardPreview(file) {
      console.log(file)
      this.PreviewVisible = true;
      this.dialogImageUrl = file.url;
},

第二种预览方案

App.vue

<template>
  <div id="app" :pageName="$route.name">
    <router-view v-if="isRouterFresh"></router-view>
    <!--图片预览-->
    <el-image-viewer v-if="showViewer" :on-close="closeViewer" :url-list="showViewerImages" :initialIndex="initialIndex" />
  </div>
</template>

<script>
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
  name: "app",
  components: { ElImageViewer },
  data() {
    return {
      // 图片预览
      showViewer: false,
      showViewerImages: [], // 预览地址集合['xxx.jpg','xxx.jpg']
      //重新渲染页面
      isRouterFresh: true,
      initialIndex: 0,
    }
  },
  methods: {
    // 预览
    createPreview(arrUrl) {
      this.showViewerImages = arrUrl;
      this.showViewer = true
      //检查播放器
      if (window.oWebControl) {
        window.oWebControl.JS_HideWnd();
      }
    },
    closeViewer() {
      this.showViewer = false;
      this.showViewerImages = [];
      //检查播放器
      if (window.oWebControl) {
        window.oWebControl.JS_ShowWnd();
      }
    },
    isFreshView() {
      this.isRouterFresh = false;
      this.$nextTick(() => {
        this.isRouterFresh = true;
      });
    }
  },
  created() {
    var vue = this;
    //调用方式:window.createPreview(['ddd.jpg', 'ddd.jpg'])
    window.createPreview = function (arrUrl, initialIndex) {
      vue.createPreview(arrUrl)
      vue.initialIndex = initialIndex
    }
    window.isFreshView = function () {
      vue.isFreshView();
    }
    //禁止右键
    // window.oncontextmenu = function(){
    //     return false;
    // }
  }
};
</script>

<style lang="less">
#app {
  height: 100%;
}
</style>

组件的使用

vue文件:

<div style="display: inline-block;width: 10px;width: 84%;">
            <el-upload multiple action="#" list-type="picture-card" :on-preview="handlePictureCardPreview" :on-remove="handleRemove" 
			:on-exceed="(fileList)=>{this.$message({type:'warning' , message : '已选数量超出上传限制,请重新选择'})}" :on-change="handleChange" accept=".png, .jpg, .jpeg" :auto-upload="false" :file-list="fileList" :limit="3" 
			:class="fileList && fileList.length >= 3 ? 'hide' : 'show'">
              <i class="el-icon-plus"></i>
            </el-upload>
          </div>

js 图片预览:
handlePictureCardPreview(file) {
		window.createPreview([file.url]);
	},


遮罩层层级需要设置一下:
.el-image-viewer__wrapper{
  z-index: 99999999999 !important;
}

第三种预览方案viewer.js

1、下载资源包

Viewer.js官网下载地址:Viewer.js

CSDN下载

2、将下载的js引入本地

main.js

//图片预览
import '@/assets/viewer/viewer.css'
import VueViewer from '@/assets/viewer/index.mjs'


app.use(VueViewer, {
    defaultOptions: {
        zIndex: 9999, //图片查看器的modal模式时的z-index
        title : false, //显示当前图片标题
        navbar: false, //缩略图导航
        BUTTONS : ['prev', 'next' ,'zoom-in', 'zoom-out', 'one-to-one', 'rotate-right']
    }
})

App.vue

 previewImages(urls ,index = 0){
            this.$viewerApi({
                images : urls,
                options : {
                    initialViewIndex : index
                }
            })
        },

操作图片的vue

<el-form-item label="附件" prop="att_info" online>
                    <div style="display:flex; flex-wrap: wrap;">
                        <el-upload ref="upload" action="#" multiple :limit="9 - dialogData.att_info.length" accept=".jpg,.jpeg,.png,.bmp,.pdf,.xls,.xlsx,.doc,.docx" :show-file-list="false" :on-exceed="(fileList)=>{this.$message({type:'warning' , message : '已选数量超出上传限制,请重新选择'})}" :on-change="uploadChange" :auto-upload="false" style="display:none;" v-if="uploadFresh" />
                        <div class="avatar avatar-animate" v-for="(item ,index) in dialogData.att_info" :key="index" style="margin-right:10px;">
                            <div class="img-box" v-if="item.file_url">
                                <img v-if="item.mime_type == 'image/png' || item.mime_type == 'image/jpg' || item.mime_type == 'image/jpeg' || item.mime_type == 'image/bmp'" :src="item.file_url" />
                                <img v-if="item.mime_type == 'application/pdf'" src="/static/images/pdf.png" />
                                <img v-if="item.mime_type == 'application/msword' || item.mime_type ==  'application/vnd.openxmlformats-officedocument.wordprocessingml.document'" src="/static/images/word.png" />
                                <img v-if="item.mime_type == 'application/vnd.ms-excel' || item.mime_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'" src="/static/images/excle.png" />
                            
                                <span>
                                    <i-zoom-in @click.stop="previewImages(index)" />
                                    <i-delete @click.stop="deleteImages(index)" />
                                </span>
                            </div>
                        </div>
                        <div class="d-upload" @click="uploadClick" v-if="dialogData.att_info.length < 9"><i-plus /></div>
                        <p style="color:#999; display:block; width:100%; padding:5px 0 0; line-height:20px; font-size:12px;">附件支持png、jpg、bmp、pdf、word、xls且最多可上传9个,单附件不能超过10M,请压缩后再上传</p>
                    </div>
                </el-form-item>





previewImages(index) {
			switch(this.dialogData.att_info[index].mime_type){
				case 'image/png':
				case 'image/jpg':
				case 'image/jpeg':
				case 'image/bmp':
                    //标记
                    var imgItems = JSON.parse(JSON.stringify(this.dialogData.att_info))
                    imgItems[index].indexNow = true
                    imgItems = imgItems.filter(c=>c.mime_type == 'image/png' || c.mime_type == 'image/jpg' || c.mime_type == 'image/jpeg' || c.mime_type == 'image/bmp')
					window.$previewImages(imgItems.map(c=>c.file_url) , imgItems.findIndex(c=>c.indexNow))
					break;
				default:
					window.open(this.dialogData.att_info[index].file_url)
					break;
			}
		},

第四种预览方案

<div class="demo-image__preview" style="height: 0;">
      <el-image style="height: 0;" ref="previewImg" :preview-src-list="imageUrlListYl" :src="imageUrlYl"></el-image>
    </div>


imageUrlYl:'',
imageUrlListYl:[],


handlePictureCardPreview(file) {
		this.imageUrlYl = file.url
		this.fileList.forEach(item => {
		  this.imageUrlListYl.push(item.url)
		})
		this.$refs.previewImg.showViewer = true
	},

   附送250套精选项目源码

源码截图

源码获取:关注公众号「码农园区」,回复 【源码】,即可获取全套源码下载链接

转载请注明出处或者链接地址:https://www.qianduange.cn//article/8258.html
标签
评论
发布的文章

JSON三种数据解析方法

2024-05-22 09:05:13

使用nvm管理(切换)node版本

2024-05-22 09:05:48

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!