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

【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 = true
    let files = event.target.files

    for (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 FormData
                let 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 = null
    this.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.kler.cn/a/321556.html

相关文章:

  • 基于python+django的外卖点餐系统
  • JavaScript 中的 `parseInt()` 函数详解
  • Redis常见阻塞原因总结
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • TCL发布万象分区,再造Mini LED技术天花板
  • Linux下部署MySQL8.0集群 - 主从复制(一主两从)
  • 解决远程连接AlpineLinux Mysql/MariaDB 无法连接的问题
  • FortiGate 无线组网
  • 深度学习:卷积神经网络CNN
  • css div固定位置 div固定高度 文本固定高度 超出滚动
  • liunxcentos7下 跟目录空间不足docker load镜像报错空间不足
  • 泛型(Java)
  • 【稳定且高效的分治排序 —— 归并排序算法】
  • 【传感器技术】【第1章 传感器与检测技术的理论基础,测量系统,测量分类,误差分析,估计和处理】
  • 25:stm32的低功耗模式
  • FastAPI 第五课 -- 基本路由
  • 63.HDMI显示器驱动设计与验证-彩条实验
  • LeetCode142. 环形链表 II(2024秋季每日一题 28)
  • 付费和免费代理IP工具的区别大吗?
  • 深度学习中的正则化和归一化
  • JWT令牌技术介绍及使用
  • Spring事务和AOP
  • 文件上传、重定向、Gin路由
  • 融云音视频RTC介绍
  • 六、设计模式-6.1、单例模式
  • 显示技术概念极简理解(分辨率、英寸、PPI、DPI)