如何在Vue 3中通过Vue-drag-resize组件实现拖拽功能

举报
炑焽 发表于 2024/12/20 23:37:45 2024/12/20
【摘要】 在 Vue 3 中,我们可以通过 Vue-drag-resize 组件实现拖拽功能,该组件提供了拖拽、缩放、旋转、拖拽到指定位置、拖拽到指定元素等功能。

前言

在 Vue 3 中,我们可以通过 Vue-drag-resize 组件实现拖拽功能,该组件提供了拖拽、缩放、旋转、拖拽到指定位置、拖拽到指定元素等功能。

官方文档: 官方文档地址

预览地址: 预览地址

image.png

文档是参考的 vue2 框架,vue3 框架的文档还没有更新,所以这里只介绍 vue3 框架的用法。

1、安装

1、安装组件

npm install vue-drag-resize
npm i vant
npm add vant@^4 @vant/compat@^1
  1. 修改 package.json 的 dependencies 字段
{
  "dependencies": {
-    "vant": "^3.0.0",
+    "vant": "^4.0.0",
+    "@vant/compat": "^1.0.0",
  }
}

2、全局引入

  1. 全局引入main.js
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import { Toast } from "vant";
import "vant/lib/index.css";
const app = createApp(App);
app.use(Toast).mount("#app");

3、Test.vue演示

<template>
  <div class="wrapper">
    <div class="head"></div>
    <div class="box">
      <VueDragResize
        :isActive="isActive"
        :parentLimitation="true"
        :w="58"
        :h="58"
        :x="40"
        :y="40"
        :minw="58"
        :minh="58"
        :isResizable="false"
        @resizestop="handleResizeStop($event, item)"
        @dragging="dragging"
        @dragstop="isActive = false"
        @activated="clickMessageBoard"
      >
        <div class="edit">弹窗</div>
      </VueDragResize>
    </div>
  </div>
</template>

<script setup>
import VueDragResize from "vue-drag-resize/src";
import { ref } from "vue";
import { showToast } from "vant";
const isActive = ref(false);
const clickMessageBoard = () => {
  setTimeout(() => {
    if (isActive.value) {
      return;
    }
    showToast({
      message: "弹窗被点击了~",
      icon: "like-o",
    });
  }, 100);
};
/**
 * 处理窗口大小调整停止的事件。
 * @param {Event} e - 窗口大小调整停止的事件对象。
 * @description 当窗口大小调整停止时,此函数会被调用,并打印事件对象到控制台。
 */
const handleResizeStop = (e) => {
  console.log(e);
};
/**
 * 拖动事件处理函数。
 * 当触发拖动事件时,该函数会被调用,并打印当前的激活状态,
 * 然后将激活状态设置为 true。
 */
const dragging = () => {
  console.log("isActive", isActive.value);
  isActive.value = true;
};
/**
 * 拖动停止时的处理函数。
 * 当拖动操作结束时,此函数会被调用,将`isActive`状态设置为`false`。
 */
const dragstop = () => {
  isActive.value = false;
};
</script>

<style scoped>
.wrapper {
  width: 100vw;
  height: 100vh;
  background: pink;
}
.head {
  width: 100vw;
  height: 100px;
}
.box {
  width: 100vw;
  height: calc(100vh - 100px);
  background: orange;
  position: relative;
}
.edit {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  line-height: 50px;
  text-align: center;
  background: blue;
}

::v-deep(.vdr.active:before) {
  outline: none !important;
}

::v-deep(.content-container) {
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

image.png

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。