vue图片拖动 利用vuedraggable依赖(结合element图片上传)

直接代码

1.安装: 
npm i vuedraggable 或 yarn add vuedraggable
2.
引入:
import Draggable from 'vuedraggable'
注册
components: {
  Draggable
}

需要自己写图片上传的图片列表,不能使用elment/iview图片上传自带的

3.
使用:
<!--@update 拖动有更新 comImageArr 图片列表-->
<Draggable v-model="comImageArr" @update="onMoveCallback">
  <transition-group class="menuimgupload-list-box">
    <div class="items-box" v-for="(items, index) in comImageArr" :key="index">
      <img class="items-img" :src="items" />
      <div class="mask">
        <p class="mask-con">
          <Icon
            type="ios-eye-outline"
            size="20"
            color="#fff"
            class="icon"
            @click="handleView(index)" // 小眼睛 查看大图
          ></Icon>
          <Icon
            v-if="control"
            type="ios-trash-outline"
            size="20"
            color="#fff"
            class="icon"
            @click="handleRemove(index)" // 删除图片
          ></Icon>
        </p>
      </div>
    </div>
  </transition-group>
</Draggable>


methods: {
onMoveCallback () {
    // 我这里是一个图片上传的组件,虽然Draggable做了双向绑定,帮我更新了comImageArr 但是我要还告诉父组件更新 所以我需要这个事件
    // handleRemove/handleView这个事件我就不放了
  }
}
// 如果想快速看一下可以复制下面的代码
<template>
    <Draggable v-model="comImageArr" @update="onMoveCallback">
      <transition-group class="menuimgupload-list-box" :id="idNames">
        <div class="items-box" v-for="(items, index) in comImageArr" :key="index">
          <img class="items-img" :src="items" />
          <div class="mask">
            <p class="mask-con">
              <Icon
                type="ios-eye-outline"
                size="20"
                color="#fff"
                class="icon"
                @click="handleView(index)"
              ></Icon>
              <Icon
                type="ios-trash-outline"
                size="20"
                color="#fff"
                class="icon"
                @click="handleRemove(index)"
              ></Icon>
            </p>
          </div>
        </div>
    </transition-group>
    </Draggable>
</template>

<script>
import Viewer from 'viewerjs'
import 'viewerjs/dist/viewer.css'
import Draggable from 'vuedraggable'
function RndNum(n){
  var rnd=""
  for (var i=0;  i<n; i++)  {
    rnd += Math.floor(Math.random() * 10)
  }
  return rnd
}
export default {
  components: {
    Draggable
  },
  name: 'newImgUpload',
  data () {
    return {
      idNames: 'box',
      comImageArr: ['https://sdcms-1253457213.file.myqcloud.com/content/9ad289110e4eee4052a733b67ffd2a36','https://sdcms-1253457213.file.myqcloud.com/content/4a9060bf3b19a8bb61f458a7ce83467a']
    }
  },
  created () {
    this.idNames = this.idNames + RndNum(4)
  },
  methods: {
    onMoveCallback () {
      this.$emit(
        'onUploadImage',
        this.comImageArr
      )
    },
    handleView (index) {
      const viewer = new Viewer(document.getElementById(this.idNames), {
        initialViewIndex: index,
        title: false,
        navbar: false,
        hidden: function () {
          viewer.destroy()
        }
      })
      viewer.show()
    }
  }
}
</script>

<style lang="less" scoped>
.menuimgupload-list-box {
  display: flex;
  flex-wrap: wrap;
  margin-top: 20px;

  .items-box {
    width: 140px;
    height: 80px;
    position: relative;
    margin-right: 6px;
    margin-bottom: 6px;
    border-radius: 4px;
    overflow: hidden;

    .mask {
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      background: rgba(0, 0, 0, 0.6);
      display: none;
      .mask-con {
        height: 20px;
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        margin: auto;
        display: flex;
        align-items: center;
        justify-content: center;

        .icon {
          &:first-child {
            margin-right: 15px;
            // width: 32px;
            // height: 32px;
          }
        }
      }
    }

    .items-img {
      width: 140px;
      height: 80px;
      border-radius: 4px;
    }
  }
  .items-box:hover {
    .mask {
      display: block;
    }
  }
}
</style>


如果使用 import Viewer from 'viewerjs’他预览的,有一个值得注意的地方,当一个页面同时有几个预览的时候
new Viewer(document.getElementById(‘这个id不能写死’))
要么写个随机id,要么在viewer隐藏时触发的
hidden: function () {
移除上面创建的id
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,关于您的问题,可以通过以下步骤实现图片预览: 1. 首先,需要安装并引入 element-ui 组件库和 vue-preview 插件。 2. 在需要实现图片预览的页面中,使用 <el-upload> 组件上传图片,并设置相关属性,如 action、before-upload、list-type 等。 3. 在 <el-upload> 组件的 slot 属性中添加自定义内容,这里可以使用 vue-preview 插件来实现图片预览。具体实现方法如下: ``` <el-upload action="your_upload_url" :before-upload="checkImage" list-type="picture-card"> <i slot="default" class="el-icon-plus"></i> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> // 添加自定义内容 <vue-preview :slides="slides"></vue-preview> </el-upload> ``` 4. 在 data 中定义 slides 数组,并在 checkImage 方法中动态生成 slides 数组的内容,用于传递给 vue-preview 组件进行图片预览。具体实现方法如下: ``` data() { return { slides: [] } }, methods: { checkImage(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG || !isLt2M) { this.$message.error('上传图片只能是 JPG/PNG 格式,且不超过 2MB'); return false; } // 生成 slides 数组,并使用 vue-preview 进行图片预览 const reader = new FileReader(); reader.readAsDataURL(file.raw); reader.onload = () => { this.slides.push({ src: reader.result }); this.$nextTick(() => { this.$refs.preview.open(); }); }; } } ``` 以上就是使用 vue 结合 element-ui 实现图片预览的方法了,希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值