el-upload实现可替换、删除、预览的图片上传。js 往返缓存(可判断当前页面是不是返回的页面)

本文主要是介绍el-upload实现可替换、删除、预览的图片上传。js 往返缓存(可判断当前页面是不是返回的页面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

el-upload实现可替换、删除、预览的图片上传

在这里插入图片描述

  • 组件使用:
<template><div><UploadImage sendUrl='' :limit="1" :size="size" :gifSize="gifSize" v-model="images"></UploadImage> </div>
</template>
<script>import Vue from 'vue'import UploadImage from './UploadImage.vue'export default {components: {UploadImage},data(){retun {images:'',size: 400 * 1024,ifSize: 1 * 1024 * 1024,// images:[]}}}
</script>
  • UploadImage.vue 组件:
<template><div class="uploadFileMain" :style="{'--height':`${height}px`,'--width':`${width}px`}"><div v-for="(item,index) in fileList" :key="index" class="upload-list" :class="[limit==1?'upload-lis1':'']"><div v-if="switchIndex==index && showProgress" v-loading="true" class="loadingView" element-loading-background="rgba(0, 0, 0, 0.8)" /><img :id="`${idName}_image_${index}`" class="el-upload-listImg" :src="item.url"  alt=""><span class="el-actions"><spanclass="el-upload-icon"@click="handlePictureCardPreview(index,item.url)"><i class="el-icon-zoom-in" /></span><spanclass="el-upload-icon"@click="switchFn(index)"><i class="el-icon-sort" style="transform: rotate(90deg);" /></span><spanclass="el-upload-icon"@click="delRemove(index)"><i class="el-icon-delete" /></span></span></div><el-uploadv-show="!limit || fileList.length<limit":ref="`${idName}_upload`":show-file-list="false":multiple="multiple":limit="limit?limit+1:limit":action="sendUrl"list-type="picture-card":headers="{Authorization: $utils.getToken()}":accept="acceptArray.length>0?acceptArray.map(n=>this.acceptType[n]).join(',') :'*'":file-list="fileList":before-upload="beforeUpload":on-progress="progressFn":on-success="uploadSuccess"><div v-if="switchIndex==-1 && showProgress" v-loading="true" :style="{'height':`${height}px`,'width':`${width}px`}" class="loadingView" element-loading-background="rgba(0, 0, 0, 0.8)" /><div v-else  class="uploadClick" :id="`${idName}_uploadClick`" slot="trigger" @click="changeIndex(-1)"><i class="el-icon-plus"  /></div></el-upload></div>
</template>
<script>
import Vue from 'vue'export default {props: {sendUrl: {type: String,default: ''},value: {type: [Array, String],default: ''},width: {type: [Number, String],default: 80},height: {type: [Number, String],default: 80},multiple: {type: Boolean,default: true},limit: {type: Number,default: null// default: 4},// 大小限制:10 * 1024 * 1024 = 10MBsize: {type: Number,default: -1},//   限制类型,按照acceptType数组里面来acceptArray: {type: Array,default: () => {return ['png', 'jpg', 'jpeg', 'gif']}},gifSize: {type: Number,default: -1}},data() {return {acceptType: {'doc': 'application/msword','docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document','pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation','xls': 'application/vnd.ms-excel','xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','pdf': 'application/pdf','csv': '.csv','txt': 'text/plain','image': 'image/*','png': 'image/png','gif': 'image/gif','jpg': 'image/jpg','jpeg': 'image/jpeg'},idName: `${Math.random().toString(36).slice(-8)}_${new Date().getTime()}`,switchIndex: -1,fileList: [],dataArray: {1: [],2: []},showProgress: false}},watch: {value: {handler(value) {if (Array.isArray(value)) {this.fileList = value.filter(n => n != '').map(n => {return {url: n}})} else {this.fileList = value.split(',').filter(n => n != '').map(n => {return {url: n}})}},deep: true,immediate: true},fileList: {handler(value) {if (value.length > 0) {this.toFileImg(value)}},deep: true,immediate: true},dataArray: {handler(value) {// 1 和 2 相等表示这次上传成功的数量相同,会添加到数组里面if (value[1].length != 0 && value[2].length != 0 && value[1].length == value[2].length) {value[2].forEach(e => {// 有更换就变化if (this.switchIndex != -1) {this.fileList.splice(this.switchIndex, 1, {status: 'success',url: e.data})} else {// 没有更好追加this.fileList.push({status: 'success',url: e.data})}})setTimeout(() => {this.showProgress = falsethis.switchIndex = -1}, 300)this.dataArray = {1: [],2: []}}},deep: true}},methods: {async lookImageViewer(url, list) {let listImg = listconst thisIndex = list.indexOf(url)const firstArray = list.slice(thisIndex, list.length)const twoArray = list.slice(0, thisIndex)listImg = [...firstArray, ...twoArray]// this.$viewerApi({ images: listImg })//v-viewer组件const id = 'MyElImageViewer_' + new Date().getTime() + '_' + parseInt(Math.random() * 1000)// 引用组件(找到Elementui中image-viewer的位置)const ElImageViewer = (await import('element-ui/packages/image/src/image-viewer')).defaultconst MyElImageViewer = Vue.component('MyElImageViewer', ElImageViewer)const MyElImageViewerNew = new MyElImageViewer({propsData: {urlList: listImg,onClose: () => {// 删除组件compDOm.$destroy()document.body.removeChild(document.getElementById(id))}}})const DOM = document.createElement('div')DOM.setAttribute('id', id)DOM.setAttribute('class', 'imageSwipeViewer_Show')document.body.appendChild(DOM)// 挂载组件const compDOm = MyElImageViewerNew.$mount(DOM.appendChild(document.createElement('template')))compDOm.$nextTick(() => {const showDom = document.getElementById(id)showDom.querySelector('.el-icon-circle-close').style = 'font-size:38px;color:#fff'})},filterSize(size) {const pow1024 = (num) => {return Math.pow(1024, num)}if (!size) return ''if (size < pow1024(1)) return size + ' B'if (size < pow1024(2)) return (size / pow1024(1)).toFixed(0) + ' KB'if (size < pow1024(3)) return (size / pow1024(2)).toFixed(0) + ' MB'if (size < pow1024(4)) return (size / pow1024(3)).toFixed(0) + ' GB'return (size / pow1024(4)).toFixed(2) + ' TB'},// 上传之前放到1beforeUpload(e) {const fileSize = e.sizeif (this.gifSize > 0) {if (e.type.indexOf('gif') != -1 && fileSize > this.gifSize) {this.$message.error(`gif最大上传${this.filterSize(this.gifSize)}`)return false}} else {if (this.size > 0 && fileSize > this.size) {this.$message.error(`最大上传${this.filterSize(this.size)}`)return false}}this.dataArray[1].push({status: 'uploading',...e})return true},// 通过 slot="trigger" ,区分模拟点击,表示这次时人为点击的changeIndex(index) {if (index == -1) {this.switchIndex = -1}},progressFn(e) {this.showProgress = true},// 更换图片,模拟点击switchFn(index) {document.getElementById(`${this.idName}_uploadClick`).click(this.switchIndex)setTimeout(() => {this.switchIndex = index}, 0)},// 查看图片handlePictureCardPreview(index, url) {this.lookImageViewer(url, [url])},// 成功后放到2uploadSuccess(e) {this.dataArray[2].push({...e})},// 传递图片toFileImg(value) {if (Array.isArray(this.value)) {this.$emit('input', value.map(n => n.url))} else {this.$emit('input', value.map(n => n.url).join(','))}},delRemove(index) {this.fileList.splice(index, 1)if (this.fileList.length == 0) {this.toFileImg(this.fileList)}}}}
</script>
<style lang="scss" scoped>::v-deep .el-upload--picture-card{width: var(--width);display:flex;justify-content:center;align-items:center;height: var(--height);}.uploadClick{width: var(--width);display:flex;justify-content:center;align-items:center;height: var(--height);}::v-deep .el-upload-list--picture-card .el-upload-list__item{width: var(--width);display:flex;align-items:center;height: var(--height);transition: none !important;}::v-deep .el-upload-list__item .el-icon-check{position: absolute;margin-top: 0px;top: 10px;right: 14px;}::v-deep .el-loading-spinner{width: 100%;height: 100%;top: 0;margin-top: 0;display: flex;align-items: center;justify-content: center;}::v-deep .el-upload-list,::v-deep .el-upload-list--picture-card{//display: none;}.uploadFileMain{display: flex;flex-wrap: wrap;.upload-list{flex-shrink:0;width: var(--width);border:1px solid #0000005d;box-sizing: border-box;height: var(--height);margin-right: 20px;margin-bottom: 10px;&.upload-lis1{margin-bottom: 0px;}overflow: hidden;border-radius: 8px;position: relative;.el-actions{position: absolute;width: 100%;height: 100%;top: 0;left: 0;background-color: rgba(0,0,0,0.5);align-items: center;justify-content: center;display: none;.el-upload-icon{margin: 5px;i{color: #ffffff;cursor: pointer;}}}&:hover{.el-actions{display: flex;}}}.el-upload-listImg{width: 100%;height: 100%;object-fit: contain;}}.loadingView{width: 100%;height: 100%;}
</style>

往返缓存(BFCache)

BFCache是一种浏览器优化,可实现即时前进和后退载入页面。它改善了用户的浏览体验,尤其是那些网络或设备速度较慢的用户。*我们可以通过这个方法判断当前页面是不是返回的页面*

在APP站内嵌套h5页面,判断进入拨号页返回情况:

  • 我们需要通过visibilitychange

  • 通过在点击时修改一个状态值,回来时和上面的方法进行判断

    const isClick=false // 是否点击了离开页面按钮
    const isShowPop=false // 是否显示弹窗
    document.addEventListener('visibilitychange', () => {if (document.visibilityState == "visible") {if (isClick) {isShowPop = true}isClick = false} else {}
    })
    

如果是在浏览器里面,判断进入拨号页(三方客服链接)返回情况:

  • 在浏览器里面如果是离开了页面还是可以通过visibilitychange判断,但是跳转的是三方客服链接,那我我们回到页面,页面是会重新刷新的,我们需要知道是否返回了,就需要通过performance.getEntriesByType('navigation')[0].type

  • 同时通过在点击时修改一个状态值,回来时和上面的方法进行判断

    const isClick=false // 是否点击了离开页面按钮
    const isShowPop=false // 是否显示弹窗
    const pageshowFn=(event)=> {const navigationType = performance.getEntriesByType('navigation')[0].typeconst {persisted = null} = eventif (persisted || navigationType == 'back_forward') {isShowPop = trueisClick = false
    }
    }
    window.removeEventListener('pageshow', pageshowFn)
    window.addEventListener('pageshow', pageshowFn)
    // 页面初次进入需要调用
    pageshowFn({})

往返缓存(BFCache)具体详解

这篇关于el-upload实现可替换、删除、预览的图片上传。js 往返缓存(可判断当前页面是不是返回的页面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592057

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)