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 RegExp方法获取地址栏参数(面向对象)
Mar 10 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
May 02 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
15条JavaScript最佳实践小结
Aug 09 Javascript
仿百度输入框智能提示的js代码
Aug 22 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
Jun 01 Javascript
JavaScript检测原始值、引用值、属性
Jun 20 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
Aug 24 Javascript
jQuery Tree Multiselect使用详解
May 02 jQuery
详解AngularJS 模块化
Jun 14 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
May 23 Javascript
微信小程序使用echarts获取数据并生成折线图
Oct 16 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和ACCESS写聊天室(四)
2006/10/09 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
php购物车实现代码
2011/10/10 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
numpy自动生成数组详解
2017/12/15 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
诚信承诺书模板
2014/05/26 职场文书
五一活动标语
2014/06/30 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书