vue+vant使用图片预览功能ImagePreview的问题解决


Posted in Javascript onApril 10, 2020

如果您搜到这篇文章的话,那员外估计您遇到跟我一样的问题了,即在打开图片预览功能后,如果不关闭预览的图片,同时改变路由的话,会发现即使路由改变了,预览的图片还在文档的最顶层显示,如图:   

 vue+vant使用图片预览功能ImagePreview的问题解决

着实让员外百思不其解,在调用vant 的 ImagePreview图片预览组件中,没有html,有的只是引入ImagePreview 和js的调用。在这种情况下,员外是想自己添加任何方法都没法实现的,同时想在离开路由时的beforeRouteLeave 钩子中关闭这个 ImagePreview  也实现不了,因为根本就拿他没有一点办法。同时可以看到,这个图片预览的 html 是挂载在 window 上面的,实在是太 难为初学者了。  

vue+vant使用图片预览功能ImagePreview的问题解决 

#第一种解决办法

后来多方请教,终于请到一位大佬,为员外指点迷津。  1. 首先需要定义两个实际变量,instance_before 和 instance_after,之所以是两个是因为在这个页面有两个 tab 里面的图片需要预览; 2. 然后把两个 ImagePreview[] 分别赋值给instance_before 和 instance_after,测试一下图片是否能正常打开关闭,结果当然是可以的; 3. 然后在 beforeRouteLeave 钩子中调用 close() 方法关闭预览遮罩。  其实这个问题主要还是单页只有一个vue实例,然后在调用 ImagePreview[] 的时候页面在返回上一个路由或前进到下一个路由,其产生的DOM节点还存在页面中,所以要做的是在当前路由跳转的时候及时移除或者隐藏这个DOM节点。 

代码:

import {ImagePreview} from 'vant';
export default {
    data() {
      return {
        active_:'',  //切换 tab 所对应的状态数字
        instance_before:'',
        instance_after:'',
      }
    },
    //在路由离开的时候,关闭预览的图片
    beforeRouteLeave(to,from,next){
      if(this.active_ == 0){
        this.instance_before.close();
      }else{
        this.instance_after.close();
      }
      next();
    },
    methods: {
      //查看图片
      show_before_img(){
        this.instance_before = ImagePreview({
          images: [this.warsher_brfore],
        });
      },
      show_after_img(){
        this.instance_after = ImagePreview({
          images: [this.warsher_after],
        });
      },
    }
}

#第二种解决办法 

 这个办法就与 vant 无关了,员外使用的是 viewerjs 插件,这是一款专门针对图片预览打造的插件,功能要比 vant 自带的全得多,而且自带很多钩子功能,如果您需求比较复杂的话,那使用起来真的是太方便了。  ##使用方法: 安装依赖 npm i viewerjs -S  在 main.js中引入并设置好各种参数,当然如果您对效果要求不高,可以不设,许多默认的也够您使用了。里面有许多不用的功能,员外都 false 了。 

import Viewer from 'v-viewer'
import 'viewerjs/dist/viewer.css'

Viewer.setDefaults({
 'inline':false,
 'button':true, //右上角按钮
 "navbar": false, //底部缩略图
 "title": false, //当前图片标题
 "toolbar": false, //底部工具栏
 "tooltip": false, //显示缩放百分比
 "movable": true, //是否可以移动
 "zoomable": true, //是否可以缩放
 "rotatable": true, //是否可旋转
 "scalable": true, //是否可翻转
 "transition": true, //使用 CSS3 过度
 "fullscreen": true, //播放时是否全屏
 "keyboard": false, //是否支持键盘
 "url": "data-source",
 ready: function (e) {
  console.log(e.type,'组件以初始化');
 },
 show: function (e) {
  console.log(e.type,'图片显示开始');
 },
 shown: function (e) {
  console.log(e.type,'图片显示结束');
 },
 hide: function (e) {
  console.log(e.type,'图片隐藏完成');
 },
 hidden: function (e) {
  console.log(e.type,'图片隐藏结束');
 },
 view: function (e) {
  console.log(e.type,'视图开始');
 },
 viewed: function (e) {
  console.log(e.type,'视图结束');
 },
 zoom: function (e) {
  console.log(e.type,'图片缩放开始');
 },
 zoomed: function (e) {
  console.log(e.type,'图片缩放结束');
 }
});

设置好之后即可直接使用了。这里有一个小坑,员外在网上查了挺多 demo的,大多数的教程里面都是教您如何预览多张图片,但是员外的需要是只需要预览一张,所以在使用的时候也是绕了一点弯子的。  在 .vue 组件中使用:  首先员外先介绍一下多图片的使用方法: html中: 

<template>
 <div id="index">
  <ul>
   <li v-for="(item, index) in imgArr" :key="index">
    <img :src="item" />
   </li>
  </ul>
 </div>
</template>
```
js
```
data() {
    return {
      imgArr: [
         "图片地址",
         "图片地址",
         "图片地址",
         "图片地址",
         "图片地址",
      ]
    };
  },
  mounted() {
    //调用就是这么简单,直接 new 一个新 Viewer 对象即可
    const viewer = new Viewer(document.getElementById("index"), {});
  }

单个图片的使用方法其实跟上面的例子几乎一样: //html

<div class="img-box">
  <img :src="warsher_before_img" alt="" id="warsher_before_img">
</div>
//js
mounted() {
 //调用就是这么简单,直接 new 一个新 Viewer 对象即可
 const viewer = new Viewer(document.getElementById('warsher_before_img'))
}

切记,千万不要多事在事件中调用上面 mounted 中的方法,会导致在第一次触发事件的时候,Viewer 实例才刚刚生成,但是不会被调用,然后在第二次触发事件的时候,才会生效。别问我怎么知道的。。。

到此这篇关于vue+vant使用图片预览功能ImagePreview的问题解决的文章就介绍到这了,更多相关vue+vant 图片预览ImagePreview内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
FireFox中textNode分片的问题
Apr 10 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
简单的jQuery入门指引
Jul 28 Javascript
js中对函数设置默认参数值的3种方法
Oct 23 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
Vue中定义全局变量与常量的各种方式详解
Aug 23 Javascript
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
详解vue mixins和extends的巧妙用法
Dec 20 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
Feb 14 Javascript
js实现倒计时器自定义时间和暂停
Feb 25 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
JS实现省市县三级下拉联动
Apr 10 #Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 #Javascript
TypeScript的安装、使用、自动编译的实现
Apr 10 #Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 #Javascript
javascript实现贪吃蛇经典游戏
Apr 10 #Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 #Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
Apr 09 #Javascript
You might like
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
java必学必会之static关键字
2015/12/03 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
AngularJS实现注册表单验证功能
2017/10/16 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
python中解析json格式文件的方法示例
2017/05/03 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
如何启动时不需输入用户名与密码
2014/05/09 面试题
项目资料员岗位职责
2013/12/10 职场文书
二手房购房意向书范本
2014/04/01 职场文书
房产继承公证书
2014/04/09 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle