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)具体详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux系统编程——Linux目录结构

Linux的文件系统呈现为一种树状结构&#xff0c;以根目录/为最顶层&#xff0c;其下分布着各种不同的子目录&#xff0c;每个目录都有其特定的用途和功能。下面是Linux目录结构的详细介绍&#xff1a; 1. 根目录 / 根目录是整个文件系统的基础。所有的目录和文件都从这里开始…

LeetCode刷题13:回溯+剪枝解决216.组合总和 III

找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 解…

阿里云c8i服务器CPU性能、架构及费用测评

阿里云第八代云服务器ECS计算型c8i实例&#xff0c;CPU采用Intel Xeon Emerald Rapids或者Intel Xeon Sapphire Rapids&#xff0c;主频不低于2.7 GHz&#xff0c;全核睿频3.2&#xff0c;阿里云百科aliyunbaike.com分享阿里云c8i服务器CPU处理器型号、存储、网络、安全、使用场…

子域名收集

目录 1、OneForAll 2、利用Google的搜索 3、fofa 4、使用在线查询网站查询 5、利用ip反查 6、Layer子域名挖掘机 7、JSFinder 用法 在进行渗透的过程中有一个很重要的工作就是信息收集&#xff0c;而信息收集中的子域名收集是很重要的一项工作&#xff0c;在本篇中我会给大…

绝地求生:【PC】2024年1月商店更新

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 欢迎大家来到闲游盒2024年首次商店更新&#xff01; 我们在1月商店更新中准备了全新生存通行证&#xff1a;龙腾&#xff0c;彩色烟雾皮肤&#xff0c;地狱天使 VS 天堂恶魔系列皮肤&#xff0c;相信大家一定会喜欢~ 实用腰带…

Linux操作系统——进程控制(三) 进程程序替换

前言 目前我们接触到我们所创建的所有的子进程&#xff0c;它执行的代码都是父进程代码的一部分&#xff01;那么如果我们想让子进程执行新的程序呢&#xff1f;&#xff1f;&#xff1f;执行全新的代码和访问全新的数据&#xff0c;不在和父进程有瓜葛&#xff0c;我们该怎么…

一文详解向量数据库Milvus Cloud动态 Schema

在数据库中&#xff0c;Schema 常有&#xff0c;而动态 Schema 不常有。 例如&#xff0c;SQL 数据库有预定义的 Schema&#xff0c;但这些 Schema 通常都不能修改&#xff0c;用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构&#xff0c;确…

如何利用 NFTScan Portfolio 功能分析钱包 NFT 持仓

随着 NFT 市场的扩大和投资者的增加&#xff0c;追踪和管理大量 NFT 资产正变得越来越复杂&#xff0c;无论是新手还是资深投资者&#xff0c;都需要借助实时的 NFT 数据作为判断依据。因此&#xff0c;一个能够全面分析 NFT 钱包持仓的工具就显得尤为重要。帮助投资者掌握自身…

bootstrap搭建一个简单的官网案例附代码

bootstrap搭建一个简单的官网案例附代码 效果常用属性完整代码 效果 大概的效果如下 主要都是用bootstrap的代码实现的 网站是照着 b站视频做的 查看视频教程 建议自己先看一遍文档再跟着视频写&#xff0c;不然可能看不懂 bootstarp中文文档 logo是从别人的站上扒的有点不太协…

阿里巴巴提出AnyText:首个解决多语言视觉文本生成的工作

基于扩散模型的文本到图像在最近取得了令人瞩目的成就。尽管当前的图像合成技术已经非常先进&#xff0c;能够以高保真度生成图像&#xff0c;但当关注生成图像中的文本区域时&#xff0c;往往可能会暴露问题&#xff0c;因为合成文本通常包含模糊、不可读或不正确的字符&#…

firewalld高级配置

IP伪装与端口转发 在互联网发展初期&#xff0c;设计者们并没有想到互联网会发展到现在这个空前繁荣的阶段&#xff0c;所以&#xff0c;设 计的Pv4地址空间只有32位.但是随着互联网的发展&#xff0c;P地址变得严重缺乏&#xff0c;并且地址分配不均匀&#xff0c; 所以就在原…

设计模式-规格模式

设计模式专栏 模式介绍模式特点应用场景规格模式和策略模式的区别和联系代码示例Java实现规格模式Python实现规格模式 规格模式在spring中的应用 模式介绍 规格模式&#xff08;Specification Pattern&#xff09;是一种行为设计模式&#xff0c;其目的是将业务规则封装成可重…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

OceanBase原生分布式数据库

1.历史背景 在Java Web项目中&#xff0c;常常使用免费开源的MySQL数据库存储业务数据&#xff0c;按业界经验MySQL单库超过多大数据体量&#xff0c;或单表超过几百万条数据后就会出现查询变慢的情况&#xff0c;单实例数据库只能扩展物理资源(CPU、内存)&#xff0c;来提升查…

vivado 工程管理

管理项目 打开项目 当项目打开时&#xff0c;Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件&#xff0c;以及合成、模拟和实现运行。要打开项目&#xff0c;请使用以下方法之一&#xff1a; •在“入门”页面…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11 文章目录 [2645. 构造有效字符串的最少插入数](https://leetcode.cn/problems/minimum-additions-to-make-valid-string/)方法一&#xff1a;计算组数方法二&#xff1a;动态规划方法三: 考虑相邻字母 2645. 构造有效字符串的最少插入数 方法一&#xff1a;计算组数 …

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能&#xff0c;uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好&#xff0c;用Recorder插件可避免…