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 相关文章推荐
asp 取文本框名称代码
Dec 02 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
Extjs grid添加一个图片状态或者按钮的方法
Apr 03 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 Javascript
react路由配置方式详解
Aug 07 Javascript
vue-cli项目中使用Mockjs详解
May 14 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
Dec 29 jQuery
Promise扫盲贴
Jun 24 Javascript
JavaScript实现放大镜效果代码示例
Apr 29 Javascript
ES6扩展运算符和rest运算符用法实例分析
May 23 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
基于mysql的论坛(4)
2006/10/09 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
文案策划求职信
2014/03/18 职场文书
广告语设计及教案
2014/03/21 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
大足石刻导游词
2015/02/02 职场文书
2016年党建工作简报
2015/11/26 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
分享python函数常见关键字
2022/04/26 Python
Python中的socket网络模块介绍
2022/07/23 Python
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS