vue.draggable拖拽组件封装(Vue3)

文档

官方网站

https://github.com/SortableJS/vue.draggable.next

中文文档

vue3: https://www.itxst.com/vue-draggable-next/tutorial.html
vue2: https://www.itxst.com/vue-draggable/tutorial.html

安装

# NPM
$ npm i -S vuedraggable@next

# Yarn
$ yarn add vuedraggable@next

# pnpm
$ pnpm i -S vuedraggable@next

导入

import Draggable from "vuedraggable";

组件封装实例

Draggable组件封装(vue3版)

<script lang="ts" setup>
import { ref, watch } from "vue";
import Draggable from "vuedraggable";

const props = defineProps({
  dragList: {
    type: Array,
    default() {
      return [];
    }
  },
  icons: {
    type: String,
    default: ""
  },
  hideIcons: {
    type: Boolean,
    default: true
  }
});
const dragList = ref([]) as any;
const drag = ref(false);

const emit = defineEmits(["dragList"]);
function updateDrag() {
  emit("dragList", dragList.value);
}
watch(
  () => props.dragList,
  val => {
    dragList.value = val;
  },
  {
    deep: true,
    immediate: true
  }
);
</script>

<template>
  <div>
    <Draggable
      :list="dragList"
      @update="updateDrag"
      @start="drag = true"
      @end="drag = false"
      v-bind="{ animation: 400 }"
      itemKey="index"
    >
      <template #item="{ element, index }">
        <div>
          <el-card shadow="hover">
            <div class="flex items-start">
              <!-- 图标 -- >
              <img :src="props.icons" v-show="props.hideIcons"/>
              <slot :item="element" :index="index" />
            </div>
          </el-card>
        </div>
      </template>
    </Draggable>
  </div>
</template>

引用组件

<script setup lang="ts">
    import Draggable from './Draggable.vue'

    const list =[{
        num:1
    },{
        num:2
    },{
        num:3
    },{
        num:4
    }]

    function deleteItem(index){
        list.value.splice(index,1)
    }
</script>

<template>
    <div class="wrapper">
        <Draggable :dragList="list">
            <template #default="element">
                <div v-for="(item, idx) in element" :key="idx">
                    <p>{{item.num}}</p>
                    <el-button @click="deleteItem(element.index)">删除</el-button>
                </div>
            </template>
        </Draggable>
    </div>
</template>
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue3是最新版本的Vue.js框架,它具有更强大的功能和性能优化,可以实现可拖动弹窗的封装。 首先,我们可以利用Vue3的自定义指令来实现拖动效果。首先在弹窗组件中添加一个容器元素,用来表示弹窗的位置和大小。然后,在该容器元素上添加一个自定义指令,比如"v-draggable"。在该自定义指令中,我们可以通过监听鼠标事件来实现拖动功能。当鼠标按下时,记录当前鼠标的位置坐标,并监听鼠标移动事件,不断地更新弹窗容器的位置坐标。最后,在鼠标松开的时候,停止拖动。 接下来,我们可以为弹窗组件添加一些控制按钮,比如关闭按钮和最小化按钮。这些按钮可以通过Vue3的事件绑定来实现对应的功能。例如,点击关闭按钮后,可以通过触发一个"close"事件来关闭弹窗。 此外,我们还可以利用Vue3的响应式数据和计算属性来实现弹窗的位置和大小自动调整。通过监听窗口大小变化的事件,并实时更新弹窗容器的位置和大小,使之适应不同的显示设备和分辨率。 最后,为了防止拖动时超出边界的情况,我们可以在自定义指令中添加一些边界限制的判断逻辑,以确保弹窗不会超出容器范围。 综上所述,通过Vue3的自定义指令、事件绑定、响应式数据和计算属性,我们可以很方便地封装一个可拖动的弹窗组件,并且可以根据需要添加其他功能和样式,以满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值