vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue3使用vuedraggable拖拽

Vue3中使用vuedraggable拖拽实战教程

作者:冷太阳a

这篇文章主要介绍了Vue3中使用vuedraggable拖拽实战教程,文中通过示例介绍了vue3拖拽组件vuedraggable的使用demo,需要的朋友可以参考下

Vue3中简单使用vuedraggable拖拽

一、安装引入

npm i vuedraggable@4.1.0 --save
import Draggable from 'vuedraggable';

二 、使用

<template>
  <button @click="submit">提交数据</button>
  <div class="drag-box">
    <Draggable
      v-model="tags"
      :list="list"
      :animation="100"
      item-key="id"
      class="list-group"
      :forceFallback="true"
      ghost-class="ghost"
      @change="onMoveCallback"
      :move="getdata"
    >
      <template #item="{ element }">
        <div class="items">
          <div class="title">{{ element.label }}</div>
        </div>
      </template>
    </Draggable>
  </div>
</template>
<script lang="ts">
import { reactive} from 'vue';
import Draggable from 'vuedraggable';
export default {
  components: {
    Draggable,
  },
  setup() {
    let list = reactive([
      {
        label: '模块1',
        id: 1,
        isflod: false,
      },
      {
        label: '模块2',
        id: 2,
        isflod: false,
      },
      {
        label: '模块3',
        id: 3,
        isflod: false,
      },
      {
        label: '模块4',
        id: 4,
        isflod: false,
      },
      {
        label: '模块5',
        id: 5,
        isflod: false,
      },
      {
        label: '模块6',
        id: 6,
        isflod: false,
      },
    ]);
    const onMoveCallback = (val) => {
      console.log('拖动前的索引 :' + val.moved.newIndex);
      console.log('拖动后的索引 :' + val.moved.oldIndex);
    };
    const getdata = (val) => {
      console.log(val.draggedContext.element.id);
    };
    // 查看最新的数据
    const submit = () => {
      console.log(list);
    };
    // watch(
    //   list,
    //   (newValue, oldValue) => {
    //     console.log('list', newValue, oldValue);
    //   },
    //   { immediate: true }
    // );
    return {
      list,
      onMoveCallback,
      getdata,
      submit,
    };
  },
};
</script>
<style   scoped>
.drag-box .items {
  display: flex;
  justify-content: space-between;
  width: 80%;
  padding: 20px;
  margin-bottom: 20px;
  background: #e3e3e3;
  border-radius: 8px;
}
</style>

三、Api

group: “name”, // or { name: “…”, pull: [true, false, clone], put: [true, false, array] } name相同的组可以互相拖动
sort: true, // 内部排序列表
delay: 0, // 以毫秒为单位定义排序何时开始。
touchStartThreshold: 0, // px,在取消延迟拖动事件之前,点应该移动多少像素?
disabled: false, // 如果设置为真,则禁用sortable。
store: null, // @see Store
animation: 150, // ms, 动画速度运动项目排序时,’ 0 ’ -没有动画。
handle: “.my-handle”, // 在列表项中拖动句柄选择器。
filter: “.ignore-elements”, // 不导致拖拽的选择器(字符串或函数)
preventOnFilter: true, // 调用“event.preventDefault()”时触发“filter”
draggable: “.item”, // 指定元素中的哪些项应该是可拖动的。
ghostClass: “sortable-ghost”, // 设置拖动元素的class的占位符的类名。
chosenClass: “sortable-chosen”, // 设置被选中的元素的class
dragClass: “sortable-drag”, //拖动元素的class。
dataIdAttr: ‘data-id’,
forceFallback: false, // 忽略HTML5的DnD行为,并强制退出。(h5里有个属性也是拖动,这里是为了去掉H5拖动对这个的影响
fallbackClass: “sortable-fallback”, // 使用forceFallback时克隆的DOM元素的类名。
fallbackOnBody: false, // 将克隆的DOM元素添加到文档的主体中。(默认放在被拖动元素的同级)
fallbackTolerance: 0, // 用像素指定鼠标在被视为拖拽之前应该移动的距离。
scroll: true, // or HTMLElement
scrollFn: function(offsetX, offsetY, originalEvent, touchEvt, hoverTargetEl) { … }
scrollSensitivity: 30, // px, how near the mouse must be to an edge to start scrolling.
scrollSpeed: 10, // px

vue3 拖拽组件 vuedraggable的使用 demo

效果图:

<template>
    <div class="container mover">
        <!-- animation 拖拽的过渡动画的时间 -->
        <!-- onStart 开始拖拽的事件 -->
        <!-- onEnd 拖拽结束的事件 -->
        <!-- ghost-class 当前正在被拖拽的元素 的样式的类名  -->
        <!-- sort 是否可以进行拖拽,false 不可以进行拖拽,  默认为true -->
        <!-- delay 鼠标按下去 多少秒之后才可以进行拖拽 -->
        <!-- handle 表示 当鼠标落在handle指定的元素上面时才允许拖动,下面的例子中 只有鼠标放到 + 的div 才能拖拽 -->
        <!-- filter 表示鼠标落在filter指定的元素上面 不允许拖动,和 handle正好相反 -->
        <!-- draggable 表示样式为item的元素才能被拖动 -->
        <draggable :list="list" animation="300" @start="onStart" delay="3" :sort="true" @end="onEnd" item-key="name"
            ghost-class="ghost" handle=".mover" filter=".unmover" draggable=".item" fallback-tolerance="80">
            <template #item="{ element }">
                <div class="item ">
                    <div class="mover">+</div>
                    {{ element.name }}{{ element.id }}
                    <div class="mover unmover">-</div>
                </div>
            </template>
        </draggable>
    </div>
</template>
<script lang="ts">
import { defineComponent, reactive, toRefs } from "vue"
import draggable from "vuedraggable";
export default defineComponent({
    name: "HomeIndex",
    components: { draggable },
    setup() {
        const state = reactive({
            list: [
                {
                    name: '1',
                    id: 1,
                },
                {
                    name: '1',
                    id: 2,
                },
                {
                    name: '3',
                    id: 3,
                },
                {
                    name: '4',
                    id: 4,
                },
                {
                    name: '5',
                    id: 5,
                    disabled: false
                },
            ]
        })
        const onStart = () => {
            console.log('%c 开始拖', 'color:red');
        }
        const onEnd = () => {
            console.log('%c 结束拖', 'color:green');
        }
        return {
            ...toRefs(state),
            onStart,
            onEnd
        }
    }
})
</script>
<style lang="less" scoped>
.container {
    width: 100vw;
    height: 100vh;
    background: salmon;
    .item {
        width: 80%;
        height: 5vh;
        background: skyblue;
        border: 2px solid red;
        margin: 20px;
        display: flex;
        justify-content: space-between;
        .mover {
            width: 50px;
            height: 100%;
            background: red;
            font-size: 25px;
            text-align: center;
        }
        .unmover {
            width: 50px;
            height: 100%;
            background: red;
            font-size: 20px;
            text-align: center;
            float: right;
        }
    }
    .ghost {
        background: #0333f2 !important;
    }
}
</style>  

到此这篇关于Vue3中简单使用vuedraggable拖拽的文章就介绍到这了,更多相关Vue3使用vuedraggable拖拽内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文