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 相关文章推荐
jQuery EasyUI API 中文文档 - Parser 解析器
Sep 29 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
Dec 17 Javascript
JS正则表达式大全(整理详细且实用)
Nov 14 Javascript
js中indexof的用法详细解析
Dec 24 Javascript
js实现鼠标悬浮给图片加边框的方法
Jan 30 Javascript
浅谈window对象的scrollBy()方法
Jul 15 Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 Javascript
浅谈ng-zorro使用心得
Dec 03 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
使用JQuery自动完成插件Auto Complete详解
Jun 18 jQuery
Jquery Datatables的使用详解
Jan 30 jQuery
vue-cli3项目配置eslint代码规范的完整步骤
Sep 10 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
php字符串截取问题
2006/11/28 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP培训要多少钱
2017/06/06 PHP
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
Bootstrap表单布局
2016/07/19 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
利用Python学习RabbitMQ消息队列
2015/11/30 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
python制作填词游戏步骤详解
2019/05/05 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
详解Python文件修改的两种方式
2019/08/22 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
运行Python编写的程序方法实例
2020/10/21 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
Oracle性能调优原则
2012/05/03 面试题
结构和类有什么异同
2012/07/16 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
求职简历自我评价范例
2014/03/12 职场文书
教学改革实施方案
2014/03/31 职场文书
目标责任书格式
2014/07/28 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
安阳殷墟导游词
2015/02/10 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
Nginx动静分离配置实现与说明
2022/04/07 Servers