视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue拖拽组件使用方法详解
2020-11-27 22:03:03 责编:小采
文档


前言

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

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

关于拖拽 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)
    如果简单的功能不能满足,推荐这个写好的轮子

    下载本文
    显示全文
    专题