vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能

实现效果:

功能实现:

要实现图片的拖拽功能首先需要安装vuedraggable库

npm install vuedraggable --save

在组件中引入并注册 vuedraggable

<script>
   import draggable from "vuedraggable";
   export default {
     // 注册组件
      components: {
        draggable,
      },
      data(){
        return {}
      }
   }
</script>

 使用element ui的el-upload组件,结合vuedraggable实现图片的上传与排序功能

<el-form-item label="上传轮播图" prop="image">
   <ul class="image-upload">
       <draggable v-model="fileList" @update="dataDragEnd">
           <transition-group class="uploader">
              <div v-for="(item, index) in fileList" :key="item.url" class="upload-list">
                 <img v-if="item.url" style="width:146px;height: 146px" :src="item.url">
                 <div class="icon-container">
                    <span v-if="item.url" @click="handlePreviewNew(index)">
                       <i class="el-icon-zoom-in"></i>
                    </span>
                    <span v-if="item.url" @click="handleRemoveNew(item, index)">
                       <i class="el-icon-delete"></i>
                    </span>
                  </div>
                </div>
             </transition-group>
         </draggable>
         <el-upload name="image" ref="uploadFile" class="upload-demo" action="#" multiple
            :on-preview="handlePreview" :on-remove="handleRemove" 
            :http-request="uolpadMorePic" :file-list="fileList" list-type="picture-card">
            <el-button size="small" type="primary">点击上传</el-button>
         </el-upload>
    </ul>
</el-form-item>
 <!-- 图片回显预览 -->
    <el-dialog title="图片预览" :visible.sync="previewVisible" width="50%" append-to-body>
      <img :src="previewPath" alt="" style="width:100%;height:100%" />
    </el-dialog>

上传图片时处理方法


    uolpadMorePic(file) {
      let up = new FormData();
      up.append("image", file.file);
      up.append("name", this.editForm.name);
      //上传图片接口
      bannerUp(up).then((res) => {
          if (res.status == "0000") {
            this.fileList.push({
              name: res.data.imageUrl,
              url: res.data.imageUrl,
              uid: Math.floor(Math.random() * 100000),
            })
            //上传的图片和回显的图片进行重新排序
            this.fileList.map((item, index) =>
              item.sortNum = index + 1
            )
            this.$message({
              type: "success",
              message: "上传成功",
            });
          } else {
            this.$message({
              type: "error",
              message: res.codemsg,
            });
            let uid = file.uid; // 关键作用代码,去除文件列表失败文件
            let idx = this.$refs.uploadFile.uploadFiles.findIndex(
              (item) => item.uid === uid
            ); // 关键作用代码,去除文件列表失败文件(uploadFiles为el-upload中的ref值)
            this.$refs.uploadFile.uploadFiles.splice(idx, 1); // 关键作用代码,去除文件列表失败文件
          }
        })
        .catch((err) => {
          console.log(err);
          let uid = file.uid; // 关键作用代码,去除文件列表失败文件
          let idx = this.$refs.uploadFile.uploadFiles.findIndex(
            (item) => item.uid === uid
          ); // 关键作用代码,去除文件列表失败文件(uploadFiles为el-upload中的ref值)
          this.$refs.uploadFile.uploadFiles.splice(idx, 1); // 关键作用代码,去除文件列表失败文件
        });
    },

图片查看、删除及拖拽排序

//删除图片
 handleRemoveNew(file, index) {
    this.fileList.splice(index, 1)
 },
 // 处理图片预览效果
 handlePreviewNew(index) {
    this.previewPath = this.fileList[index].url
    this.previewVisible = true
 },
 //拖拽图片排序
 dataDragEnd() {
    // 拖拽图片更换位置 并重新从1开始排序
    this.fileList.forEach((item, index) => {
      item.sortNum = index + 1
    })
    //过滤一下url为空的数据
    this.fileList = this.fileList.filter(item => {
      return item.url != ''
    });
 },

编辑弹窗图片回显

let res = 接口获取的详情数据
res.data.slider_image.map((item, index) => {
   this.fileList.push({
      url: item.url ,
      name: item.name,
      sortNum: index + 1,
    });
});

一些样式

<style lang="scss" scoped>
.image-upload {
  display: flex;
  list-style-type: none;
  margin: 0;
  padding: 0;

  .uploader {
    display: flex;
    align-items: center;

    .upload-list {
      margin-right: 8px;
      width: 146px;
      height: 146px;
      border-radius: 8px;
      overflow: hidden;
      border: 1px solid #c0ccda;
      position: relative;

      &:hover {
        .icon-container {
          display: block;
          transition: all 0.5s;
        }
      }

      .icon-container {
        position: absolute;
        display: none;
        transition: all 0.5s;
        width: 146px;
        height: 146px;
        line-height: 146px;
        color: #fff;
        font-size: 20px;
        text-align: center;
        border-radius: 8px;
        top: 0;
        left: 0;
        background-color: rgba(0, 0, 0, .5);

        span {
          margin: 0 10px;
          cursor: pointer;
        }
      }
    }
  }
}
</style>
<style scoped>
//此处一定要将原el-upload的图片回显list隐藏,用自己写的
/deep/ .upload-demo .el-upload-list {
  display: none;
}
</style>

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

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

相关文章

【神行百里】pandas查询加速之行索引篇

最近进行大数据处理的时候&#xff0c;发现我以前常用的pandas查询方法太慢了&#xff0c;太慢了&#xff0c;真是太慢了&#xff0c;查阅资料&#xff0c;遂发现了一种新的加速方法&#xff0c;能助力我飞上天&#xff0c;和太阳肩并肩&#xff0c;所以记录下来。 1. 场景说明…

ThingWorx/Vuforia—工业物联网和AR平台

产品概述 ThingWorx是美国PTC公司旗下的一款物联网和AR平台&#xff0c;它提供了适用于IoT的开发工具和能力&#xff0c;使开发者可以为工业物联网快速构建和部署变革性的智能互联解决方案&#xff0c;使创新者能够快速为当今的智能互联世界提供优异的应用程序、解决方案和用户…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0&#xff0c;测试和eval的时候结果也全是空的&#xff0c;排除了数据集读取的问题&#xff0c;最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之&#xff0c;在自定义了数据集里的metainf…

常见表单元素的使用

目录 **表单是什么**一, from&#x1f367; Action 属性&#x1f367; Method 属性 二,input&#x1f367; 常见的type属性&#x1f367;text属性 三,select,option下拉框&#x1f367;selected属性 四,textarea五, button 表单是什么 HTML 表单用于收集用户的输入信息。 表示文…

2,PyCharm的下载与安装

1&#xff0c;PyCharm的下载 a&#xff1a;打开PyCharm官网&#xff0c;并选择Developer Tools → PyCharm Pycharm官网地址 b&#xff1a;点击Download c&#xff1a;下载完成后&#xff0c;会在下载文件夹中&#xff0c;出现“pycharm-professional-2023.3.exe”文件 2&a…

C++类与对象(一)

目录 一&#xff0c;面向过程和面向对象初步认识 二&#xff0c;类的引入 三&#xff0c;类的定义 四&#xff0c;类的访问限定符及封装 五&#xff0c;类的实例化 六&#xff0c;类对象模型 七&#xff0c;this指针 一&#xff0c;面向过程和面向对象初步认识 c语言是面…

菜鸟学习日记(python)——循环语句

python中的循环语句包括for循环语句和while循环语句&#xff0c;但是python中是没有do...while循环语句的。 while循环语句 while循环语句的一般格式为; while condition:loop body condition是循环判断条件&#xff0c;loop body是循环体。 当循环条件成立时&#xff0c;…

APP广告变现有哪些独特的优势?

作为互联网广告的载体&#xff0c;APP天生就比线下传统广告位更具优势&#xff0c;不受地域限制可以辐射到地球上的每一个角落&#xff0c;可以让广告获得更广的覆盖面。通过丰富的广告形式&#xff0c;精准的目标用户画像&#xff0c;也可以更好地实现品牌广告或效果广告的投放…

day45-46-Vue+ElementUI实现学生管理

VueElementUI实现学生管理 代码&#xff1a; qiushiju/java2313_vue_elementui_crud (gitee.com) 一、思考 考虑需求&#xff08;登录&#xff0c;查询全部&#xff0c;基本增删改查&#xff0c;分页&#xff0c;搜索&#xff0c;批量&#xff09; 设计数据库搭建项目 后端…

数据结构期末考前复习

时间复杂度分析 常数时间复杂度 O(1) 的示例&#xff1a; def print_first_element(arr):print(arr[0])# 无论 arr 的大小如何&#xff0c;执行时间都是恒定的&#xff0c;因此具有常数时间复杂度。线性时间复杂度 O(n) 的示例&#xff1a; def print_all_elements(arr):for …

【并发编程篇】Callable实现多线程计算

文章目录 &#x1f354;简述Callable&#x1f33a;代码测试⭐如果改为了两个线程&#xff0c;效果如何 &#x1f354;简述Callable Callable是Java中一个函数式接口&#xff0c;用于表示可以返回结果并且可能会抛出异常的计算任务。该接口定义了一个call()方法&#xff0c;该方…

Flink Window中典型的增量聚合(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器&#xff0c;我们只是知道了数据属于哪个窗口&#xff0c;可以将数据收集起来了&#xff1b;至于收集起来到底要做什么&#xff0c;其实还完全没有头绪&#xff0c;这也就是窗口函数所需要做的事情。所以在窗口分配器…

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称虚拟实境或灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术&#xff0c;其基本实现方式是以计算机技术为主&#xff0c;利用并…

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品&#xff0c;和开源数据库OpenGauss之间又是什么样的关系&#xff0c;刚开始接触的时候是一头雾水&#xff0c;因此本文简要对比下二者的区别&#xff0c;以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…

表格中上传文件的表单验证

<template><!-- 新增记录 --><div class"newRecord"><div class"danger-detail"><div class"detail-right"><el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-wid…

数据库系统原理与实践 笔记 #12

文章目录 数据库系统原理与实践 笔记 #12事务管理和并发控制与恢复(续)并发控制SQL-92中的并发级别基于锁的协议基于锁的协议的隐患锁的授予封锁协议两阶段封锁协议多粒度粒度层次的例子意向锁类型相容性矩阵多粒度封锁模式基于时间戳的协议基于时间戳协议的正确性基于有效性检…

解决:TypeError: write() argument must be str, not Tag

解决&#xff1a;TypeError: write() argument must be str, not Tag 文章目录 解决&#xff1a;TypeError: write() argument must be str, not Tag背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错&#xf…

如何轻松解决企业报修系统问题?有什么比较实用的工单管理系统?

许多企业报修方面的问题就是兼职师傅多&#xff0c;难以管理&#xff0c;导致整个报修流程都比较滞后。关于这个问题&#xff0c;我个人的建议是引入工单管理系统&#xff0c;依靠线上平台进行统一的管理。 引入工单管理系统的好处主要有&#xff1a;   1、沟通报修更加高效 …

频率、概率

频率 在相同的条件下进行试验&#xff0c;假设试验进行了次&#xff0c;其中随机事件A发生了次&#xff0c;那么就称为随机事件A发生的频率。 概率 假设随机试验E的样本空间是S&#xff0c;对于其中每个随机事件&#xff0c;都对应了一个实数&#xff0c;把这个实数称为随机…

Qt/C++音视频开发59-使用mdk-sdk组件/原qtav作者力作/性能凶残/超级跨平台

一、前言 最近一个月一直在研究mdk-sdk音视频组件&#xff0c;这个组件是原qtav作者的最新力作&#xff0c;提供了各种各样的示例demo&#xff0c;不仅限于支持C&#xff0c;其他各种比如java/flutter/web/android等全部支持&#xff0c;性能上也是杠杠的&#xff0c;目前大概…