使用vuedraggable图片拖拽排序并支持element-ui 图片上传upload

下载插件

npm install vuedraggable

引入插件

import draggable from 'vuedraggable'; // 拖动插件

注册组件

components: { 
    draggable
}

使用

              <draggable
                class="el-upload-list el-upload-list--picture-card" 
                v-model="fileList"
                @start="isDragging = true"   //拖拽前
                @end="isDragging = false"    //拖拽后
                @update="updateList"         //更新
              >
              ~~~内容~~~
              </draggable>

事例

该事例配合element-ui的el-upload使用

vuedraggable组件要自己重写上传图片之后的样式,那样子才能使图片移动

例子样式主要使用el-upload的样式,并对其做了简单的修改

笔者还在移动图片的基础上添加了移动图片的文字信息,不需要的可自行删除

设置  :show-file-list="false"  不显示el-upload的图片列表

        <div class="pic">
          <el-form-item label="上传图片:">
            <ul class="el-upload-list el-upload-list--picture-card">
              <div>
              <draggable
                class="el-upload-list el-upload-list--picture-card" 
                v-model="fileList"
                @start="isDragging = true" 
                @end="isDragging = false"
                @update="updateList" 
              >

              <div class="el-upload-list__item is-success"
                  v-for="(item, index) in fileList"
                  :key="item + index"
                >
                <li>
                <div class="content1">
                  <img :src="item.url"  class="el-upload-list__item is-success"/>
                  <span class="el-upload-list__item-actions">
                    <span class="remove">
                    <i class="el-icon-remove" @click="delImg(index)"></i>
                  </span>
                  </span> 
                  

                  //文字信息
                  <i class="text" ref="ii" v-if="item.isShow" @click="input($event,index)">{{item.name.split('.')[0]}}</i> 
                  <textarea rows="2" class="text" maxlength="20"  
                  v-else  
                  id="textarea"
                  autofocus="autofocus"
                  :value="item.name.split('.')[0]" 
                  @input="inputChange($event,index)" 
                  @blur="blur(index)" 
                  onkeypress="if(window.event.keyCode==13) this.blur()"></textarea>
                  
                  
                </div>
               </li>
            </div>
            </draggable>
            </div>
            <li>
            <el-upload
              action="/api/upload"
              list-type="picture-card"
              :before-upload="beforeAvatarUpload"
              :on-success="handlerUploadSuccess"
              :limit="10"
              :show-file-list="false"
              :on-exceed="chooseImg"
              :headers="headers"
              :file-list="fileList"
              :before-remove="handlerBeforeRemove"
            >              
            <i class="el-icon-plus"></i>
            </el-upload>
          </li>
            </ul>
          </el-form-item>
        </div>

     // 拖拽更新数据
    async updateList (e) {
      const newIndex = e.newIndex// 新位置下标
      const oldIndex = e.oldIndex// 原始位置下标
      // 打印出新位置 位置从0开始算
      console.log(newIndex)
      console.log(oldIndex)
      // 打印出来的为该位置的对象
      console.log(this.fileList)
    },

献上笔者使用的样式,可能会有点小问题,别介哈 ~

希望可以帮到你 ~

.pic {
  .el-form-item__content{
    width: 770px;
  }
  .el-upload-list--picture-card{
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
  }
  .el-upload-list--picture-card 
  .el-upload-list__item{
    margin: 0px 33px 65px 0px;
    overflow: visible;

  }
  .el-upload-list--picture-card .el-upload-list__item-actions{
    height: 92%;
    width: 148px;
    border-radius: 6px;
  }
  .el-upload-list__item-actions{
    .remove{
      position: relative;
      left:45px;
      .el-icon-remove{
        position: absolute;
        top: -80px;
        font-size: 28px;
        color: red;
      }
    }
  }
  .content1{
    height: 160px;
    position: relative;
    .text{
      position: absolute;
      display: block;
      width: 148px;
      height: 50px;
      top:155px;
      word-wrap:break-word; 
      word-break:break-all;
      -webkit-line-clamp: 2;
      overflow: hidden;
      left:0px;
      z-index: 99999;
    }
  }
  img{
    width: 148px;
    height: 148px;
    display: inline-block;
  } 
  textarea {
    width: 22%;
    font-size: 16px;
    border-color: pink;
  }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue使用Element UI上传图片并预览可以按照以下步骤进行: 1. 首先,在项目中安装Element UI和axios: ``` npm install element-ui axios --save ``` 2. 在main.js中引入Element UI和axios,并使用: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import axios from 'axios' Vue.use(ElementUI) Vue.prototype.$axios = axios ``` 3. 在组件中使用`<el-upload>`组件进行文件上传,并使用`<el-image>`组件进行预览: ```html <template> <div> <el-upload action="/api/upload" :on-success="handleSuccess" :on-preview="handlePreview" list-type="picture-card"> <i class="el-icon-plus"></i> </el-upload> <el-dialog :visible.sync="dialogVisible"> <el-image :src="imageUrl" :preview-src-list="previewImages"></el-image> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, imageUrl: '', previewImages: [] }; }, methods: { handleSuccess(response) { if (response.status === 200) { this.imageUrl = response.data.url; this.previewImages.push(response.data.url); } }, handlePreview(file) { this.dialogVisible = true; this.imageUrl = file.url; this.previewImages = [file.url]; } } } </script> ``` 4. 在服务器端设置相应的文件上传接口,例如使用Node.js和express: ```javascript const express = require('express'); const multer = require('multer'); const app = express(); const upload = multer({ dest: 'uploads/' }); app.post('/api/upload', upload.single('file'), (req, res) => { // 处理上传文件并返回文件URL const file = req.file; const url = `http://example.com/${file.filename}`; res.send({ url }); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 上述代码实现了一个简单的上传图片并预览的功能,具体可根据实际需求进行调整和扩展。 ### 回答2: 在Vue使用Element UI上传图片并预览可以按照以下步骤进行: 1. 首先,在项目中引入Element UI组件库,并在需要使用的组件中进行注册。 ```js import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 2. 创建一个上传组件,并初始化需要的数据,如图片列表和上传接口等。 ```vue <template> <div> <el-upload action="/your-upload-url" :on-success="handleSuccess" :file-list="fileList" :on-remove="handleRemove" multiple > <el-button size="small" type="primary"> 选择图片 </el-button> </el-upload> <el-image v-for="(file, index) in fileList" :key="index" :src="file.url" :preview-src-list="previewList" fit="cover" style="width: 100px; height: 100px;" ></el-image> </div> </template> <script> export default { data() { return { fileList: [], // 上传的文件列表 previewList: [] // 预览图片列表 } }, methods: { handleSuccess(response, file, fileList) { // 上传成功的回调函数 fileList[fileList.length - 1].url = URL.createObjectURL(file.raw) this.previewList = fileList.map(file => file.url) }, handleRemove(file, fileList) { // 上传文件移除的回调函数 this.previewList = fileList.map(file => file.url) } } } </script> ``` 在上述代码中,el-upload组件负责上传图片,action属性指定上传图片的接口地址,on-success属性可以监听上传成功的事件,并通过handleSuccess方法返回上传成功后的处理方式。file-list属性用于展示上传成功的文件列表,并且绑定了on-remove属性来处理上传文件的移除事件。 el-image组件用于展示预览图片,v-for指令遍历渲染fileList数组中的每张图片,通过src属性绑定图片的地址,在handleSuccess方法中将上传成功的文件通过URL.createObjectURL方法生成临时的URL作为图片的地址。同时,preview-src-list属性绑定了previewList数组,用于展示预览图片的列表。 这样,当用户选择图片并上传成功后,页面将会展示上传的图片,并提供预览功能。 ### 回答3: 使用Element UI库实现图片上传并预览的步骤如下: 1. 首先,在项目中引入Element UIVue插件。 ``` import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` 2. 在Vue组件中,添加一个上传组件和一个用于预览图片的容器。 ``` <template> <div> <!-- 图片上传组件 --> <el-upload class="upload-demo" action="/your-upload-api" <!-- 上传图片的接口地址 --> :on-success="handleUploadSuccess" > <el-button size="small" type="primary">点击上传</el-button> </el-upload> <!-- 图片预览容器 --> <div class="preview-container"> <img :src="imageUrl" v-if="imageUrl" alt="预览图片" /> </div> </div> </template> <script> export default { data() { return { imageUrl: '' // 预览图片的URL }; }, methods: { handleUploadSuccess(response) { // 上传成功后,将返回的图片URL赋值给imageUrl this.imageUrl = response.data.imageUrl; } } }; </script> ``` 3. 完成上述代码后,当用户选择图片并上传成功时,上传接口会返回图片的URL。通过`handleUploadSuccess`方法将返回的URL赋值给`imageUrl`,然后在预览容器中显示预览图片即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值