Vue一种实现拖拽的方法 | 青训营笔记

142 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第16天

在大项目低代码平台的开发中,需要实现不同组件的拖拽功能。作者希望通过本文,提供一种基于vue.draggable包以及Vue框架的可执行拖拽的方案。

首先,通过指令,在终端上下载拖拽的包:
>>> npm install vuedraggable --save-dev

将draggable添加到vue库,并且创建新的vue app
>>> vue create kalacloud-draggable
>>> cd kalacloud-draggable

通过npm来完成包的安装
>>> npm i -s vuedraggable

vue.draggable具有诸多优点:

  • 支持触摸设备:不仅可以实现鼠标光标移动,也对触摸设备有很好的支持。
  • 拖拽与选取文本识别:vue.draggable 可以识别拖拽动作或选择文字的动作。
  • 对 Vue UI 库友好,可以把现有的 Vue 组件附加到可拖拽的元素上,实现这个组件的拖拽功能。
创建用于拖拽的组件table-draggable;
在app.js中添加语句:
Vue.component('table-draggable',require('./components/TableDraggable.vue'));

并在终端中输入
>>> npm run watch

我们先完成组件内部数据的获取:

public function home()
{
    $testimonials = Testimonial::where('visible',true)->orderBy('order')->get()
    
    return view('landing-page')->with([
        'testimonials' => $testimonials,
    ]);
}

通过prop传递数据:

<table-draggable: testimonials="{{ $testimonials }}"></table-draggable>

在组件中申明prop:

export default {
    props:['testimonials'],
    mounted(){
        console.log('Component mounted.')
    }
}

到现在为止,我们已经可以将testimonials的prop通过数组展示出来:

螢幕截圖 2022-08-22 上午9.35.36.png

下面就是如何利用draggable包实现拖拽操作了:

vue.draggable的优秀之处在于它开箱即用的特性,<draggable> 中的所有子元素都可实现拖拽功能。

添加以下样本代码,即可完成文字的拖拽操作:

<template>
  <main>
    <div>
      <draggable :list="myList">
        <div v-for="(list, i) in myList" :key="i">
          {{ list }}
        </div>
      </draggable>
    </div>
  </main>
</template>
<script>
import draggable from "vuedraggable";
export default {
  components: {
    draggable,
  },
  data() {
    return {
      myList: ["拖拽A", "拖拽B", "拖拽C"],
    };
  },
};
</script>

draggable包还有更多功能可以开发,比如:

  • group: 实现两个或多个区域内组件的拖拽,各区域的 group 对象名需要命名一致。可以写成 group:‘kalacloud-group’ 或者 group:{name:'kalacloud-group'}
  • clone: 拖拽时可将被拖拽组件复制到另一个区域
  • 快速搭建任务管理看板

参考: