vue拖拽组件使用方法详解


Posted in Javascript onDecember 01, 2018

前言

pc端开发需要拖拽组件完成列表的顺序交换,一般移动端的UI组件会包含,但是我在用的iview并没有此功能的组件,于是手写一个,实现起来很简单。效果图如下:

vue拖拽组件使用方法详解

可以拖拽完成新排序,点击某一项可以触发相关事件.

关于拖拽 drag & drop

拖放(Drag 和 drop)是 HTML5 标准的组成部分。

拖拽对象

dataTransfer对象,只能在拖放事件的事件处理程序中访问。重要属性:

  • effectAllowed ( none | copy | copyLink | copyMove | link、linkMove | move | all | uninitialized ):设置或返回被拖动元素允许发生的拖动行为。
  • dropEffect( none | copy | link | move ):设置或返回拖放目标上允许发生的拖放行为。如果此设置的拖放行为不在effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。
  • dataTransfer.getData(format):获取DataTransfer对象中设置format格式的数据。其中format代表数据格式,data代表数据。

拖拽属性

draggable 属性规定元素是否可拖动。

拖拽事件

  • ondragstart:在拖动开始时执行,返回被拖动元素。
  • ondragover:返回在何处放置被拖动的数据
  • 默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式
  • ondragenter:在被拖动的元素进入到放置目标时执行
  • ondragleave:在被拖动的元素离开放置目标时执行
  • ondragend && ondrop:皆指鼠标松开被拖动对象的事件,但是返回的分别为被拖动对象和被拖动元素悬挂的那个元素

源码:

<template>
 <div class="transition-container">
   <div class="item" v-for="(item, index) in items" :key="index"
    draggable="true"
    @dragstart="handleDragStart($event, item)"
    @dragover.prevent="handleDragOver($event, item)"
    @dragenter="handleDragEnter($event, item)"
    @dragend="handleDragEnd($event, item)" 
    @click="chooseNav(item)"
    >
    <p class="trans-btn">
     <span v-if="item.problemId">
      <b class="id">
        {{item.problemId}}
      </b>
       {{item.key}}
     </span>
     <span v-else>
       {{item.key}}
     </span>
     <span>
      <i-button v-if="btn" size="small" type="error" style="margin-right: 10px;" @click="deleteItem(item, index)">删除</i-button>
     </span>
    </p>
   </div>
 </div>
</template>
<script>
import './index.less';

export default {
  name: 'transition',
  props: {
    dataSource: Array,
    btn: Boolean,
  },
  data() {
    return {
      items: [],
      dragging: null,
    };
  },
  watch: {
    dataSource(val) {
      this.items = val;
    },
    dragging(val) {
      if (this.dataSource.includes(val)) {
        this.dragging = val;
      } else {
        this.dragging = null;
      }
    },
  },
  methods: {
    handleDragStart(e, item) {
      this.dragging = item;
    },
    handleDragEnd() {
      this.dragging = null;
      this.$emit('hasChanged', this.items);
    },
    // 首先把div变成可以放置的元素,即重写dragenter/dragover
    handleDragOver(e) {
      e.dataTransfer.dropEffect = 'move';// e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
    },
    handleDragEnter(e, item) {
      if (this.dragging) {
        e.dataTransfer.effectAllowed = 'move';// 为需要移动的元素设置dragstart事件
        if (item === this.dragging) {
          return;
        }
        const newItems = [...this.items];
        console.log(newItems);
        const src = newItems.indexOf(this.dragging);
        const dst = newItems.indexOf(item);
        newItems.splice(dst, 0, ...newItems.splice(src, 1));
        this.items = newItems;
      }
    },
    chooseNav(val) {
      this.$emit('selectItem', val);
    },
    deleteItem(item, index) {
      this.$emit('deleteItem', item, index);
    },
    editor(item, index) {
      this.$emit('editorItem', item, index);
    },
  },
};
</script>

基本功能就完成啦

参考文章

W3school——HTML 5 拖放
div拖拽互换位置(vue)
如果简单的功能不能满足,推荐这个写好的轮子

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
Apr 20 Javascript
javascript 变量作用域 代码分析
Jun 26 Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
May 10 Javascript
checkbox使用示例
Aug 23 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
JS实现两表格里数据来回转移的方法
May 28 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
React 子组件向父组件传值的方法
Jul 24 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
Jun 18 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
Jan 11 Javascript
vue实现div拖拽互换位置
Jul 29 #Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 #Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 #Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 #Javascript
Vue组件Draggable实现拖拽功能
Dec 01 #Javascript
BootStrap modal实现拖拽功能
Dec 01 #Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
Aug 21 #Javascript
You might like
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
javascript中的几个运算符
2007/06/29 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
express 项目分层实践详解
2018/12/10 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
2020/04/06 Javascript
整理Python 常用string函数(收藏)
2016/05/30 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Django开发中复选框用法示例
2018/03/20 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
pandas的排序和排名的具体使用
2019/07/31 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
网吧收银员岗位职责
2013/12/14 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
员工自我评价范文
2015/03/11 职场文书
结婚仪式主持词
2015/06/29 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL