当前位置: 首页 > news >正文

【vue-media-upload 升级玩法】一个页面用两个Uploader,一个上传图片,一个上传视频(分开传,容易分开设置和展示图片和视频)

此文写于2024年,凌晨4点,此时我经历了重构把自己玩死,启用备份,继续重构,完成。停坎坷的。
在这过程中,我感受到了,变量管理的混乱,也意识到了加入vuex的必要性(此时我还没有引入 vuex,也没有做好 store)

不得不说,这是一个大坑

一、方法

  • 先做一个 Uploader,做好之后注释掉
  • 在做另一个Uploader
  • 做好之后,取消前一个注释
  • 调试,发现问题,解决问题
  • 不断地 console.log
  • 最终完成

二、经验和教训

  1. 真的不要随便改别人的组件,很要命的,一不小心就会把自己玩死(修改之前记得做好备份)

三、过程

设置变量

const imageMedia = ref({saved: [],added: [],removed: [],all: []
})
const videoMedia = ref({saved: [],added: [],removed: [],all: []
})

设置函数

// 将editedProduct.productImages更新为media.saved和media.added的合并
watch(imageMedia, (newMedia) => {editedProduct.productImages = newMedia.saved.concat(newMedia.added);}, { deep: true}
);
watch(videoMedia, (newMedia) => {editedProduct.productVideos = newMedia.saved.concat(newMedia.added);}, { deep: true}
);const addMedia = (addedImage, addedMedia) => {imageMedia.value.added = addedMedia
}const removeMedia = (removedImage, removedMedia) => {imageMedia.value.removed = removedMedia
}
const addVideoMedia = (addedImage, addedMedia) => {videoMedia.value.added = addedMedia
}const removeVideoMedia = (removedImage, removedMedia) => {videoMedia.value.removed = removedMedia
}const handleAllMedia = (media) => {imageMedia.value.all = media
}
const handleAllVideoMedia = (media) => {videoMedia.value.all = media
}

设置组件

<Uploader:server="server":media="imageMedia.saved":accept="['image/jpeg', 'image/png']"@add="addMedia"@remove="removeMedia"@init="handleAllMedia"
/>
<Uploader:server="server":media="videoMedia.saved":accept="['video/mp4']"@add="addVideoMedia"@remove="removeVideoMedia"@init="handleAllVideoMedia"
/>

修改组件

<div v-for="(image, index) in savedMedia"><div v-for="(image, index) in addedMedia">中都要添加

<template v-if="isImage(image.url)"><img :src="image.url" alt=""  class="mu-images-preview">
</template>
<template v-if="isVideo(image.url)"><video controls class="mu-images-preview"><source :src="image.url" type="video/mp4"></video>
</template>

修改 props

accept : {type: Array,default: ['image/*']
}

在script 中添加方法

isImage(url) {const imageExtensions = /\.(jpg|jpeg|png|gif|bmp)$/i;return imageExtensions.test(url);
},
isVideo(url) {const videoExtensions = /\.(mp4|webm|ogg)$/i;return videoExtensions.test(url);
},

修改方法

async fileChange(event) {this.isLoading = truelet files = event.target.filesfor (var i = 0; i < files.length; i++) {if (!this.max || this.allMedia.length < this.max) {if (files[i].size <= this.maxFilesize * 1000000) {let formData = new FormDatalet url = URL.createObjectURL(files[i])formData.set('image', files[i])var { data } = await axios.post(this.server, formData, this.config)data = '/image/' + data;let addedImage = { url: data, size: files[i].size, type: files[i].type }this.addedMedia.push(addedImage)console.log(this.addedMedia)console.log(this.savedMedia)this.$emit('change', this.allMedia)this.$emit('add', addedImage, this.addedMedia)} else {this.$emit('maxFilesize', files[i].size)if (this.warnings) {alert('The file you are trying to upload is too big. \nMaximum Filesize: ' + this.maxFilesize + 'MB')}break;}} else {this.$emit('max')if (this.warnings) {alert('You have reached the maximum number of files that you can upload. \nMaximum Files: ' + this.max)}break;}}event.target.value = nullthis.isLoading = false
},
removeAddedMedia(index) {let removedImage = this.addedMedia[index]this.addedMedia.splice(index, 1)this.$emit('change', this.allMedia)this.$emit('remove', removedImage, this.removedMedia)this.$emit('init', this.allMedia)
},
removeSavedMedia(index) {let removedImage = this.savedMedia[index]this.removedMedia.push(removedImage)this.savedMedia.splice(index, 1)this.$emit('change', this.allMedia)this.$emit('remove', removedImage, this.removedMedia)this.$emit('init', this.allMedia)
}

四、总结

所以说,尽量别动别人的代码,真的牵一发而动全身
要改,也得采用方法循序渐进的改,不然会很懵逼


http://www.mrgr.cn/news/34761.html

相关文章:

  • Nginx Spring boot指定域名跨域设置
  • RabbitMQ 在 Linux CentOS 和 Docker 环境下的部署及分布式部署指南
  • 7.4、实验四:RIPv2 认证和触发式更新
  • GIT:如何查找已删除的文件的历史记录
  • 科技型中小企业的认定标准
  • 【Linux】网络编程3
  • 库仑定律-库仑力-两个电荷之间静电力的计算公式
  • fo-dicom是如何实现DICOM 的网络通信功能
  • 远程升级,你成功了吗?
  • 【漏洞复现】HIKVISION 视频编码设备接入网关 showFile.php 任意文件下载漏洞
  • 解决方案:TypeError:float() argument must be a string or a number,not “NoneType”
  • OmniPeek 空口抓包软件安装指导
  • vue3知识汇总
  • 扩大产品库存怎么破?手把手教你,全开源哦!
  • JavaScript 是一种令人着迷但也充满争议的编程语言
  • 综合题第二题(路由器的配置)
  • PhpStudy —— README
  • 热斑黄斑光伏发电板 红外黄斑检测图像数据集内含最高温度信息 1200张,jpg格式。
  • 分库分表-分页排序查询
  • Golang | Leetcode Golang题解之第题432题全O(1)的数据结构
  • Golang | Leetcode Golang题解之第433题最小基因变化
  • GNU链接器(LD):LMA、VMA等链接脚本基本概念
  • Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
  • 2024在线翻译工具横评:准确率、速度与易用性大比拼
  • Java | Leetcode Java题解之第433题最小基因变化
  • Python | Leetcode Python题解之第433题最小基因变化