【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.mfbz.cn/a/882428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Debian安装mysql遇到的问题解决及yum源配置

文章目录 一、安装mysql遇到的问题解决二、Debain系统mysql8.0的安装以及远程连接三、彻底卸载软件四、Python 操作 mysql五、debian软件源source.list文件格式说明1. 第一部分2. 第二部分3. 第三部分4. 第四部分5. 关于源的混用问题6. 按需修改自己的sources.list7. 更新软件包…

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

LabVIEW提高开发效率技巧----使用LabVIEW工具

LabVIEW为开发者提供了多种工具和功能&#xff0c;不仅提高工作效率&#xff0c;还能确保项目的质量和可维护性。以下详细介绍几种关键工具&#xff0c;并结合实际案例说明它们的应用。 1. VI Analyzer&#xff1a;自动检查代码质量 VI Analyzer 是LabVIEW提供的一款强大的工…

Java — LeetCode 面试经典150题(一)

双指针 125.验证回文串 题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回…

验收测试:从需求到交付的全程把控!

在软件开发过程中&#xff0c;验收测试是一个至关重要的环节。它不仅是对软件质量的把关&#xff0c;也是对整个项目周期的全程把控。从需求分析到最终的软件交付&#xff0c;验收测试都需要严格进行&#xff0c;以确保软件能够符合预期的质量和性能要求。 一、需求分析阶段 在…

0-1开发自己的obsidian plugin DAY 1

官网教程有点mismatch&#xff0c;而且从0-100跨度较大&#xff0c;&#x1f4dd;记录一下自己的踩坑过程 首先&#xff0c;官网给的example里只有main.ts&#xff0c;需要自己编译成main.js 在视频教程&#xff08;https://www.youtube.com/watch?v9lA-jaMNS0k&#xff09;里…

K8S服务发布

一 、服务发布方式对比 二者主要区别在于&#xff1a; 1. 部署复杂性&#xff1a;传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等&#xff0c;过程相对复 杂且容易出错。相比之下&#xff0c;Kubernetes服务发布方式 通过使用容器编排和自动化部署工…

大数据新视界 --大数据大厂之 Reactjs 在大数据应用开发中的优势与实践

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

虚幻引擎的射线检测/射线追踪

射线检测在 FPS/TPS 游戏中被广泛应用 什么是射线检测? 两个点行成一条线 , 射线检测是从一个起始点发出一条到终点的射线 , 如果射线命中一个游戏对象&#xff0c;就可以获取到对象命中时的 位置、距离、角度、是否命中、骨骼 等非常多的信息 , 这些信息在射击游戏中至关重…

付费电表系统的通用功能和应用过程参考模型(上)

Generic functions and application process reference model for the Payment Metering System 付费电表系统的通用功能和应用过程参考模型 1. 参考模型 Reference model 1.1 在参考模型中的符号的说明 Legend of symbols used in the reference model 功能框 (function bo…

AWS 管理控制台

目录 控制台主页 AWS 账户信息 AWS 区域 AWS 服务选择器 AWS 搜索 AWS CloudShell AWS 控制面板小部件 控制台主页 注册新的 AWS 账户并登录后&#xff0c;您将看到控制台控制面板。这是与各种 AWS 服务以及其他重要控制台组件进行交互的起点。控制面板由页面顶部的导航…

mqtt网关数据接入rabbitmq,缓存离线数据,实现消息保留

应用场景&#xff1a;网关将设备数据发布至mqtt服务器后&#xff0c;数采程序因为重启或者升级等原因&#xff0c;未能接到到离线的订阅消息&#xff0c;利用rabbitmq-mqtt可将离线数据缓存&#xff0c;待上线后接收 启用mqtt插件 rabbitmq-plugins enable rabbitmq_mqtt

成为谷歌开发者专家(GDE)的经历

大家好&#xff0c;我是张海龙(Jason)。经过一年多的准备&#xff0c;GDE申请 终于正式成功通过面试&#xff0c;成为了国内第一位Firebase GDE。下面对整个过程做个总结&#xff0c;希望对大家有所帮助。 1.什么是 GDE&#xff1f; Google Developers上面有详细的说明&#x…

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式&#xff08;State Pattern&#xff09; 1、什么时候使用状态模式 2、使用状态模式的…

VCNet论文阅读笔记

VCNet论文阅读笔记 0、基本信息 信息细节英文题目VCNet and Functional Targeted Regularization For Learning Causal Effects of Continuous Treatments翻译VCNet和功能目标正则化用于学习连续处理的因果效应单位芝加哥大学年份2021论文链接[2103.07861] VCNet和功能定向正…

OpenCV_图像旋转超详细讲解

图像转置 transpose(src, dst); transpose()可以实现像素下标的x和y轴坐标进行对调&#xff1a;dst(i,j)src(j,i)&#xff0c;接口形式 transpose(InputArray src, // 输入图像OutputArray dst, // 输出 ) 图像翻转 flip(src, dst, 1); flip()函数可以实现对图像的水平翻转…

9.23 C++类中的特殊内容

仿照string类&#xff0c;实现myString //my_string.cpp #include "my_string.h" #include <iostream> #include <cstring>using namespace std;My_string::My_string():size(15){this->ptr new char[size];this->ptr[0] \0; //表示…

Qt_多元素控件

目录 1、认识多元素控件 2、QListWidget 2.1 使用QListWidget 3、QTableWidget 3.1 使用QListWidget 4、QTreeWidget 4.1 使用QTreeWidget 5、QGroupBox 5.1 使用QGroupBox 6、QTabWidget 6.1 使用QTabWidget 结语 前言&#xff1a; 在Qt中&#xff0c;控件之间…

Python办公自动化教程(001):PDF内容提取

1、Pdfplumber介绍 pdfplumber的github地址&#xff1a; https://github.com/jsvine/pdfplumber/【介绍】&#xff1a;pdfplumber 是一个用于处理 PDF 文件的 Python 第三方库&#xff0c;它提供了一种方便的方式来提取 PDF 文件中的文本、表格和其他信息。【功能】&#xff…

CICD从无到会

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是…