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判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
js 获取input点选按钮的值的方法
Apr 14 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
javascript将异步校验表单改写为同步表单
Jan 27 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
微信小程序版翻牌小游戏
Jan 26 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判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
载入进度条 效果
2006/07/08 Javascript
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
Display SQL Server Login Mode
2007/06/21 Javascript
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
JavaScript的Cookies
2008/01/16 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python中list列表的高级函数
2016/05/17 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
对python 命令的-u参数详解
2018/12/03 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
python super用法及原理详解
2020/01/20 Python
python中time包实例详解
2021/02/02 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
全民健身日活动方案
2014/01/29 职场文书
质量保证书格式
2015/02/27 职场文书
2015年教师节广播稿
2015/08/19 职场文书