vue拖拽添加的简单实现

 更新时间:2021年12月31日 11:03:36   作者:拜无忧  
本文主要介绍了vue拖拽添加的简单实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文主要介绍了vue拖拽添加的简单实现,具体如下:

效果图

并没有判断是否重复,没有删除旧数据

数据体

 <MyShuttle :dataOrigin='[
          {
            Name:"数据001",
            Id:"数001",
          },
          {
            Name:"数据002",
            Id:"数001",
          },
          {
            Name:"数据003",
            Id:"数001",
          }]' 
          
      :space='[{
            Name:"右001",
            Id:"右001",
            }]' />

代码

draggable开启可拖动

@dragenter.prevent @dragover.prevent
// 阻止浏览器默认行为,不然会显示一个叉叉,不好看

阻止默认行为

@dragleave.stop=“dragleave($event, ‘main')”

进入离开当前元素都会触发

@dragend.stop=“dragEnd($event, item)”

放下拖拽内容触发

拖拽事件和属性

标记 这个很重要!!! 这个决定了拖拽事件的行为。当点击开始拖拽之后,鼠标点击所在的位置就是标记。
dragstart:当单击下鼠标,并移动之后执行。
drag:在dragstart执行之后,鼠标在移动时连续触发。
dragend:当拖拽行为结束,也就是松开鼠标的时候触发。
dragenter:当正在拖拽的元素的标记进入某个Dom元素时触发,自身首先会触发。被进入的Dom元素会触发这个事件。
dragover:当拖拽的元素的标记在进入的Dom元素上移动时触发,在自身移动时也会触发。
dragleave:当拖拽的元素在离开进入的Dom时触发。

H5拖拽属性 draggable

draggable:当需要某个元素可以拖拽时,需设置为true,默认为false。选中的文本、图片、链接默认可以拖拽。
DataTransfer对象:该属性用于保存拖放的数据和交互信息,该组件没有使用到,暂忽略。

当鼠标移动到目标div盒子才会追加,简单的才最能说明问题

<template>
  <div class="MyShuttle">
    <div class="MyShuttleLeft">
      <div class="title">数据源</div>
      <div class="dataBox" @dragleave.stop="dragleave($event, 'main')">
        <div v-for="(item, i) in dataOrigin" :key="i" class="dataList" draggable @dragenter.prevent
          @dragover.prevent @dragstart.stop="dragstart($event, item)"
          @dragend.stop="dragEnd($event, item)">
          {{ item.Name}}
        </div>
      </div>
    </div>
    <div class="MyShuttleCenter"></div>
    <div class="MyShuttleRight">
      <div class="title">数据源</div>
      <div ref="MyShuttleRight" class="dataBox">
        <div v-for="(item, i) in spaceList" :key="i" class="dataList" draggable @dragenter.prevent
          @dragover.prevent>
          {{ item.Name}}
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: '',
  components: {},
  props: {
    dataOrigin: {
      type: Array
    },
    space: {
      type: Array
    }
  },
  data() {
    return {
      spaceList: this.space,
      isDragStatus: false
    }
  },
  computed: {},
  watch: {},
  created() { },
  mounted() { },
  methods: {
    dragleave(e, item) {
      // console.log(e, item)
      if (item === 'main') {
        this.isDragStatus = true
      } else {
        this.isDragStatus = false
      }
      // console.log(this.isDragStatus)
    },
    dragstart(e, item) {
      // console.log(e, item)
    },
    dragEnd(e, item) {
      const top = this.$refs.MyShuttleRight.getBoundingClientRect().top
      const right = this.$refs.MyShuttleRight.getBoundingClientRect().right
      const bottom = this.$refs.MyShuttleRight.getBoundingClientRect().bottom
      const left = this.$refs.MyShuttleRight.getBoundingClientRect().left
      console.log(top, right, bottom, left)
      console.log(e.clientX, e.clientY, item)
      if (this.isDragStatus && e.clientY > top && e.clientY < bottom && e.clientX > left && e.clientX < right) {
        this.spaceList.push(item)
        console.log(this.spaceList.indexOf(item))
      }
    }
  }
}
</script>

<style scoped lang="scss">
.MyShuttle {
  width: 100%;
  height: 308px;

  display: flex;
  justify-content: space-between;
  // 左右盒子公共样式
  .MyShuttleLeft,
  .MyShuttleRight {
    border: 1px solid #dddddd;
    border-collapse: collapse;
    .title {
      box-sizing: border-box;
      width: 100%;
      height: 40px;
      background: #f5f5f5;
      border-radius: 4px 4px 0px 0px;
      border-bottom: 1px solid #dddddd;
      padding: 10px 16px;
      font-size: 14px;
      font-family: PingFangSC-Regular, PingFang SC;
      font-weight: 400;
      color: #333333;
      line-height: 20px;
    }
    .dataBox {
      width: 100%;
      height: 228px;
      overflow: auto;
      padding: 6px 0;
      .dataList {
        width: 96%;
        height: 40px;
        box-sizing: border-box;
        font-size: 14px;
        font-family: PingFangSC-Regular, PingFang SC;
        font-weight: 400;
        color: #666;
        line-height: 20px;
        margin: 0 2% 10px;
        padding: 10px 16px;
        border: 1px solid #ddd;
        border-radius: 4px;
        user-select: none;
        cursor: pointer;
        &:hover {
          color: #01bc77;
          background: rgba(1, 188, 119, 0.1);
        }
      }
    }
  }
  .MyShuttleLeft {
    width: 362px;
    height: 100%;
    background: #ffffff;
    border-radius: 4px;
  }
  .MyShuttleCenter {
    width: 64px;
    height: 100%;
  }
  .MyShuttleRight {
    width: 362px;
    height: 100%;
    background: #ffffff;
    border-radius: 4px;
  }
}
</style>

到此这篇关于vue拖拽添加的简单实现的文章就介绍到这了,更多相关vue拖拽添加内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • vue3 element-plus实现图片预览功能实例

    vue3 element-plus实现图片预览功能实例

    这篇文章主要给大家介绍了关于vue3 element-plus实现图片预览功能的相关资料,在项目中我们经常会碰到图片预览的功能需求,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Vue常见报错整理大全(从此报错不害怕)

    Vue常见报错整理大全(从此报错不害怕)

    写代码的过程中一定会遇到报错,遇到报错不要担心,认真分析就可以解决报错,同时积累经验,早日成为大牛,这篇文章主要给大家介绍了关于Vue常见报错整理的相关资料,需要的朋友可以参考下
    2022-08-08
  • el-element中el-table表格嵌套el-select实现动态选择对应值功能

    el-element中el-table表格嵌套el-select实现动态选择对应值功能

    这篇文章主要给大家介绍了关于el-element中el-table表格嵌套el-select实现动态选择对应值功能的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • Vue POST请求头'Content-Type':'application/json;',data上传过程

    Vue POST请求头'Content-Type':'application/j

    这篇文章主要介绍了Vue POST请求头'Content-Type':'application/json;',data上传过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue中使用带隐藏文本信息的图片、图片水印的方法

    vue中使用带隐藏文本信息的图片、图片水印的方法

    这篇文章主要介绍了vue中使用带隐藏文本信息的图片、图片水印的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Vue3获取响应式数据的四种方法

    Vue3获取响应式数据的四种方法

    Vue 3 引入了一个全新的响应式系统,其中最核心的就是 reactive 和 ref,它们是实现响应式数据的基础,用于创建可以自动跟踪变化并更新视图的对象和变量,本文介绍了Vue3获取响应式数据的四种方法,需要的朋友可以参考下
    2024-08-08
  • vue单页面改造多页面应用详解

    vue单页面改造多页面应用详解

    本文主要介绍了vue单页面改造多页面应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Vue 理解之白话 getter/setter详解

    Vue 理解之白话 getter/setter详解

    这篇文章主要介绍了Vue getter setter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue自定义可选时间的日历组件

    vue自定义可选时间的日历组件

    这篇文章主要为大家详细介绍了vue自定义可选时间的日历组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 一文教会你如何运行vue项目

    一文教会你如何运行vue项目

    最近因为公司项目问题,开始学习vue,这篇文章主要给大家介绍了关于如何运行vue项目的相关资料,文中还介绍了如何运行别人的项目,需要的朋友可以参考下
    2022-06-06

最新评论