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>

Vue 的 `el-upload` 组件实现图片预览时通过鼠标滚轮进行缩放和放大操作,你可以利用 Vue 的响应式特性以及一些库如 `vue-zoom-image` 或自定义事件处理函数。以下是简单的步骤: 1. 首先,在你的模板添加一个 `<img>` 元素用于显示图片,并绑定到上传文件的 `url` 属性。 ```html <template> <div> <el-upload :action="uploadUrl" :on-preview="handleImagePreview"> <!-- ...其他配置... --> </el-upload> <img :src="previewImageUrl" ref="zoomImg" @wheel="handleZoomEvent" /> </div> </template> ``` 2. 定义 `handleImagePreview` 函数,当用户点击预览时,设置当前选图片 URL 到 `previewImageUrl` 和初始化 `zoomImg` 的 `ref`。 ```javascript export default { data() { return { previewImageUrl: '', zoomImgRef: null, // 添加一个比例变量用于缩放 scale: 1, }; }, methods: { handleImagePreview(file) { this.previewImageUrl = file.url; this.zoomImgRef = this.$refs['zoomImg']; }, // ...其他方法... }, } ``` 3. 创建 `handleZoomEvent` 方法,监听 `zoomImgRef` 的 `@wheel` 事件,根据滚轮的方向调整图片的缩放比例。 ```javascript methods: { handleZoomEvent(event) { const { deltaY } = event; // deltaY 正数表示向下滚动,负数表示向上滚动 if (deltaY > 0) { // 缩小 this.scale -= 0.1; } else if (deltaY < 0) { // 放大 this.scale += 0.1; } // 限制最小和最大缩放比例 this.scale = Math.max(0.5, Math.min(this.scale, 2)); this.zoomImgRef.style.transform = `scale(${this.scale})`; }, }, ``` 4. 记得在你的 CSS 设置初始样式,比如设置 `zoomImg` 的默认大小。 ```css #zoomImg { width: 100%; height: auto; max-width: 800px; } ``` 以上是一个基础示例,实际项目可能需要考虑更多细节,例如平滑缩放动画、移动端支持等。如果你想要更高级的功能,可以使用专门的轮播图插件,它们通常已经内置了滚动缩放功能
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阁下何不同风起?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值