位置: IT常识 - 正文

解读vant的Uploader上传问题(vant ui)

编辑:rootadmin
这篇文章主要介绍了解读vant的Uploader上传问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 目录

推荐整理分享解读vant的Uploader上传问题(vant ui),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vant-area,vant-area,vant-cli,vant rules,vant ui,vant uploader,vant-cli,vant ui,内容如对您有帮助,希望把文章链接给更多的朋友!

vant的Uploader上传主要的步骤如下vant文件上传Uploader图片压缩为什么要对图片进行压缩?Uploader组件封装APIvant的Uploader上传

vant的uploader组件的交互是点击上传之后才会触发一系列回调函数,如果想要实现点击uploader的时候先出现弹框提示,选择了确定之后才进行文件上传这该怎么做到呢?

大致是,给uploader组件外面包裹一层元素,然后给组件设为禁用模式,当外层的元素状态改变时,就改变组件的disabled值,再使用vant提供的chooseFile通过 ref 可以获取到 Uploader 实例并调用实例的方法重新调起文件选择。

主要的步骤如下

首先,我们可以在uploader组件外面包裹一层div

    <span      @click="handleClick"      v-if="isconfirm"      class="message"    ></span>    <van-uploader      v-model="fileList"      :after-read="afterRead"      :disabled="isconfirm"      ref="uploadImg"    />

然后在data以及methods中进行定义

data() {    return {      fileList: [],      isconfirm: true };  methods: {    handleClick() {      this.$dialog        .confirm({          message: "test,test,test"        })        .then(() => {          this.isconfirm = false;          this.$refs.uploadImg.chooseFile();        })        .catch(() => {          this.isconfirm = true;        });    },  }

看到这里要注意chooseFile这个方法支持的版本是v2.5.6以上的,如果出现了没有效果的话,先检查一下自己安装的版本是否是符合要求的。

检查之后,版本也符合要求,但是this.$refs.uploadImg.chooseFile()就是没有效果,这是怎么一回事呢?

原来跟浏览器执行机制event loop有关,每当执行到choosefile的时候,组件仍为禁用模式,无法调起,其实isconfirm状态还没有进行改变,所以调起文件选择看不见效果,可以使用一个setTimeout或者是vue中的this.$nextTick()进行解决。

setTimeout(() => {    this.$refs.uploadImg.chooseFile(); }, 0); this.$nextTick(() => {     this.$refs.uploadImg.chooseFile();});vant文件上传Uploader图片压缩为什么要对图片进行压缩?解读vant的Uploader上传问题(vant ui)

随着科技的发展,手机像素越来越好,拍摄的图片也越来越清晰。图片越清晰,体积也就越大。当移动端上传大图时就会发生卡顿,请求超时的情况。

当图片过大时,图片预览也会非常慢,所以需要在图片上传时对图片进行压缩。

vant中文件上传组件Uploader并不支持图片压缩,因为业务场景中有多个地方需要上传图片时对图片进行压缩,所以我基于Uploader封装了一个新的组件。

Uploader组件封装

此组件封装 基于vant文件上传Uploader

API属性名属性说明默认值

quality

压缩质量【0-1】0.5

compressSwitch

是否开启压缩false

threshold

达到此大小开始压缩【500k】500

Vant 文件上传Uploader属性请参照 vant官网

模板部分

<template>    <van-uploader :fileList="$attrs.value" :before-read="beforeReadFn" v-bind="$attrs" v-on="$listeners"/></template>

Javascript部分

export default {  name: 'van-small-upload',  props: {    quality:{      type:Number,      default:0.1    },    compressSwitch:{      type:Boolean,      default:false    },    threshold:{      type:Number,      default:500    },    beforeRead:{      type: Function,      default:()=>true    }  },  data() {    return {     }  },  methods: {    // 处理图片    imgPreview(file,index) {      console.log('处理图片Fn...');      let self = this      // 看支持不支持FileReader      if (!file || !window.FileReader) return;      const size = file.size/1024      console.log(`图片大小 ===> ${file.size/1024}k`);      console.log('图片压缩:',this.compressSwitch?'开':'关');      console.log('图片压缩阈值:',this.threshold+'k');      console.log('图片压缩降帧值:',this.quality);      if (/^image/.test(file.type) && size >= this.threshold && this.compressSwitch) {        // 创建一个reader        let reader = new FileReader()        // 将图片2将转成 base64 格式        reader.readAsDataURL(file)        // 读取成功后的回调        reader.onloadend = function() {          let result = this.result          let img = new Image()          img.src = result          img.onload = function() {            // 压缩            let data = self.compress(img,file.name,file.type)            console.log(`压缩后 ===>${data.fileData.size/1024}k`);            self.$attrs.value[index].content = data.base64Data            self.$attrs.value[index].file = data.fileData          }        }      }    },    // 压缩图片    compress(img, name, type) {      let canvas = document.createElement('canvas')      let ctx = canvas.getContext('2d')      //瓦片canvas      let tCanvas = document.createElement('canvas')      let tctx = tCanvas.getContext('2d')      // let initSize = img.src.length;      let width = img.width      let height = img.height      //如果图片大于四百万像素,计算压缩比并将大小压至400万以下      let ratio      if ((ratio = (width * height) / 4000000) > 1) {        // console.log("大于400万像素");        ratio = Math.sqrt(ratio)        width /= ratio        height /= ratio      } else {        ratio = 1      }      canvas.width = width      canvas.height = height      //    铺底色      ctx.fillStyle = '#fff'      ctx.fillRect(0, 0, canvas.width, canvas.height)      //如果图片像素大于100万则使用瓦片绘制      let count      if ((count = (width * height) / 1000000) > 1) {        // console.log("超过100W像素");        count = ~~(Math.sqrt(count) + 1) //计算要分成多少块瓦片        //      计算每块瓦片的宽和高        let nw = ~~(width / count)        let nh = ~~(height / count)        tCanvas.width = nw        tCanvas.height = nh        for (let i = 0; i < count; i++) {          for (let j = 0; j < count; j++) {            tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh)            ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh)          }        }      } else {        ctx.drawImage(img, 0, 0, width, height)      }      //进行压缩       let ndata = canvas.toDataURL('image/jpeg', this.quality)      tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;      return {base64Data:ndata,fileData:this.dataURLtoFile(ndata,name,type)}    },    //将base64转换为文件    dataURLtoFile(dataurl,name,type) {      name = name ? name : '图片'      type = type ? type : 'jpg'      var arr = dataurl.split(','),        bstr = atob(arr[1]),        n = bstr.length,        u8arr = new Uint8Array(n)      while (n--) {        u8arr[n] = bstr.charCodeAt(n)      }      return new File([u8arr], name, {        type: type      })    },    beforeReadFn(file,detail){      const {index} = detail      this.imgPreview(file,index)      return this.beforeRead(...arguments);    }  },  mounted(){      }};

使用示例

<SmUpload v-model="fileList" :before-read="beforeRead" :compressSwitch="true" :quality="0.5"/>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

本文链接地址:https://www.jiuchutong.com/zhishi/302802.html 转载请保留说明!

上一篇:js原型模式是什么(js原型模式创建对象的优缺点)

下一篇:mysql水平分表是什么(mysql水平拆分实现)

  • 小米civi代言人是谁(小米civi代言人叫啥)

    小米civi代言人是谁(小米civi代言人叫啥)

  • 小米云台摄像头怎么重新设置网络(小米云台摄像头安装内存卡)

    小米云台摄像头怎么重新设置网络(小米云台摄像头安装内存卡)

  • 微信支付分怎么用

    微信支付分怎么用

  • 小米手机数据漫游怎么打开(小米手机数据漫游设定)

    小米手机数据漫游怎么打开(小米手机数据漫游设定)

  • 苹果11输入法下面的空白怎么取消(苹果11输入法下面的地球怎么去掉)

    苹果11输入法下面的空白怎么取消(苹果11输入法下面的地球怎么去掉)

  • 快手申请仲裁是什么意思(快手退款申请仲裁会被退款吗)

    快手申请仲裁是什么意思(快手退款申请仲裁会被退款吗)

  • 怎么删word文档里面的空白页(怎么删word文档多余的页数)

    怎么删word文档里面的空白页(怎么删word文档多余的页数)

  • 微信视频号内测资格什么意思(微信视频号内测中暂无法创建)

    微信视频号内测资格什么意思(微信视频号内测中暂无法创建)

  • 取消oppo手机遮挡黑屏(取消oppo手机遮挡黑屏a96)

    取消oppo手机遮挡黑屏(取消oppo手机遮挡黑屏a96)

  • 摄像头40mp什么意思(摄像头480p是什么意思)

    摄像头40mp什么意思(摄像头480p是什么意思)

  • 为什么微信记录没删就没了(为什么微信记录只能保存2月)

    为什么微信记录没删就没了(为什么微信记录只能保存2月)

  • 华硕笔记本电脑拔下充电器立即关机(华硕笔记本电脑开机黑屏没反应)

    华硕笔记本电脑拔下充电器立即关机(华硕笔记本电脑开机黑屏没反应)

  • 视频黑屏怎么回事(视频时黑屏)

    视频黑屏怎么回事(视频时黑屏)

  • 电脑非正常关机后开不了机怎么办(电脑非正常关机后进不了系统)

    电脑非正常关机后开不了机怎么办(电脑非正常关机后进不了系统)

  • 打印机双面打印长边翻页是什么意思(打印机双面打印了一面,怎么打印另外一面)

    打印机双面打印长边翻页是什么意思(打印机双面打印了一面,怎么打印另外一面)

  • 优酷登录设备管理没有了(优酷登录设备管理不显示设备)

    优酷登录设备管理没有了(优酷登录设备管理不显示设备)

  • 苹果x跟xr外壳通用吗(苹果x跟xr手机壳可以共用吗)

    苹果x跟xr外壳通用吗(苹果x跟xr手机壳可以共用吗)

  • 苹果手机怎么设置不接电话(苹果手机怎么设置来电拦截)

    苹果手机怎么设置不接电话(苹果手机怎么设置来电拦截)

  • 手机怎么改路由器密码(手机怎么改路由器信道)

    手机怎么改路由器密码(手机怎么改路由器信道)

  • 低流量模式是怎么回事(低流量数据模式)

    低流量模式是怎么回事(低流量数据模式)

  • 微信手续费怎么避免(微信手续费怎么收费)

    微信手续费怎么避免(微信手续费怎么收费)

  • prom是什么(prom是什么意思)

    prom是什么(prom是什么意思)

  • 如何关闭微信平板电脑登录信息(如何关闭微信平台)

    如何关闭微信平板电脑登录信息(如何关闭微信平台)

  • 苹果a1602是第几代(iphone a1602)

    苹果a1602是第几代(iphone a1602)

  • 云闪付打不开怎么回事(云闪付怎么没反应)

    云闪付打不开怎么回事(云闪付怎么没反应)

  • 手机电池颜色变黄怎么回事(手机电池颜色变成橙色)

    手机电池颜色变黄怎么回事(手机电池颜色变成橙色)

  • 基于Python实现五大常用分类算法(原理+代码)

    基于Python实现五大常用分类算法(原理+代码)

  • 前端技术搭建飞机大战小游戏(内含源码)(前端工程搭建)

    前端技术搭建飞机大战小游戏(内含源码)(前端工程搭建)

  • java中TimerTask是什么(java timestamp localdatetime)

    java中TimerTask是什么(java timestamp localdatetime)

  • 企业所得税弥补亏损明细表怎么填写
  • 原始凭证太多如何删除
  • 资金账户托管协议
  • 本月发生费用下月收到发票
  • 代收货款的商品
  • 软件开发减免的流转税是否缴纳所得税
  • 投资性房地产处置时为什么要结转其他综合收益
  • 财政科技经费专项拨款的会计处理
  • 公司收到一次性吸纳就业补贴款怎么分录
  • 收入未确认可以结转成本吗
  • 有限责任公司减资的法律规定
  • 税收用在哪些方面
  • 事业单位自筹事业人员
  • 去年税收滞纳金是个人缴的,用做账嘛
  • 企业计提工资的操作步骤
  • 购买软件的增值税可以抵扣吗
  • 发票金额与支票数量不符
  • 公转私限额多久自动解冻
  • 工信部推出一键解绑怎么用
  • win7安装sqlserver2008
  • 企业投资的工程项目包括
  • 承兑交单是什么的一种
  • 怎么修改以前年度的账
  • php访问mysql数据库函数
  • 增加办税人员需要带什么材料
  • pdf.js原理
  • PHP:pg_get_pid()的用法_PostgreSQL函数
  • php的file函数
  • 阿尔山火山
  • 残疾人取得房屋所有权
  • h5的开发
  • html的网址
  • vue中解决跨域问题
  • 灵活就业收入是填多好还是填少好
  • 充话费如何开公司发票
  • 一般纳税人怎样申请简易计税
  • 社保工伤退回分录
  • 增值税的税目是什么意思
  • 长期待摊的装修费什么时候入账
  • 税务已注销工商如何注销
  • 捐赠支出汇算清缴需要调增吗
  • 劳务分包的三种形式
  • 以摊余成本计量的债权投资与以公允价值计量且其变动
  • 我国会计制度对会计要求
  • 以前年度损益调整怎么做账
  • 个体工商户公帐转法人私人账户
  • 免抵税额下个月还能退吗
  • 工业增加值计算表(按生产法)
  • 偿债基金作用
  • 研究费用怎么做账
  • 失控发票进项税转出成本调整
  • 公司租用私人汽车怎么操作
  • 部门财务独立核算原则有哪些
  • mysql运行代码
  • ubuntu系统怎么更新
  • torch.cuda.set_device
  • centos8 bond0
  • Windows7更改用户名
  • macbook air一键恢复出厂设置
  • linux系统中的一切都归结为
  • 乾坤大挪移秘籍图片
  • win10正式版激活码
  • MAC OS X 10.8通知中心无法访问、停止更新怎么重启
  • 如何在windows制作表格
  • win8电脑键盘全部失灵怎么办
  • opengl教程48讲
  • express常用中间件
  • 并行执行的符号
  • python函数菜鸟教程
  • kill某个进程
  • The method setClass(Context, Class<?>) in the type Intent is not applicable for the问题
  • javascript高级程序设计pdf下载
  • JavaScript中关于模板字符串
  • CloudEditText
  • unity3d项目
  • 宜兴税务局长郁岚
  • 慧付钱包app官网下载
  • 机票验真查询系统
  • 苹果关税多少钱一个
  • 日本海关关税税率表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设