当前位置: 首页 > news >正文

基于vueflow可拖拽元素的示例(基于官网示例的单文件示例)

效果图

在这里插入图片描述

代码

<template><div style="width: 100%;height: calc(100vh - 84px)"><VueFlow :nodes="nodes" :edges="edges" @drop="onDrop" @dragover="onDragOver" @dragleave="onDragLeave"><div class="dropzone-background"><Background pattern-color="#aaa" :gap="8" :style="{backgroundColor: isDragOver ? '#e7f3ff' : 'transparent',transition: 'background-color 0.2s ease',}"></Background><div class="overlay"><p v-if="isDragOver">Drop here</p></div></div></VueFlow><Panel position="top-right" class="process-panel"><div class="description">You can drag these nodes to the pane.</div><div class="nodes"><div class="vue-flow__node-input" :draggable="true" @dragstart="onDragStart($event, 'input')">Input Node</div><div class="vue-flow__node-default" :draggable="true" @dragstart="onDragStart($event, 'default')">Default Node</div><div class="vue-flow__node-output" :draggable="true" @dragstart="onDragStart($event, 'output')">Output Node</div></div></Panel></div>
</template><script setup name="Index">
import {ref} from 'vue'
import {VueFlow, Panel, useVueFlow} from '@vue-flow/core'
import {Background} from '@vue-flow/background'
import {MiniMap} from '@vue-flow/minimap'const {onConnect, addEdges, addNodes, toObject, screenToFlowCoordinate, onNodesInitialized, updateNode} = useVueFlow()
const instance = useVueFlow()
const {proxy} = getCurrentInstance();const nodes = ref([]);
const edges = ref([]);
const draggedType = ref(null);
const isDragOver = ref(false);
const isDragging = ref(false);/*** 开始拖拽选项的事件* @param event* @param type*/
function onDragStart(event, type) {if (event.dataTransfer) {event.dataTransfer.setData('application/vueflow', type)event.dataTransfer.effectAllowed = 'move'}draggedType.value = typeisDragging.value = truedocument.addEventListener('drop', onDragEnd)
}/*** 拖拽到画布vueflow的事件* @param event*/
function onDragOver(event) {event.preventDefault()if (draggedType.value) {isDragOver.value = trueif (event.dataTransfer) {event.dataTransfer.dropEffect = 'move'}}
}/*** 拖拽放下的事件* @param event*/
function onDrop(event) {const position = screenToFlowCoordinate({x: event.clientX,y: event.clientY,})const nodeId = Math.random() + "id";const newNode = {id: nodeId,type: draggedType.value,position,data: {label: nodeId},}// 更新位置到鼠标中心const {off} = onNodesInitialized(() => {updateNode(nodeId, (node) => ({position: {x: node.position.x - node.dimensions.width / 2, y: node.position.y - node.dimensions.height / 2},}))off()})addNodes(newNode)
}/*** 拖拽到画布外面的的事件*/
function onDragLeave() {isDragOver.value = false
}/*** 拖拽结束*/
function onDragEnd() {isDragging.value = falseisDragOver.value = falsedraggedType.value = nulldocument.removeEventListener('drop', onDragEnd)
}onConnect(addEdges)
</script><style>
/* import the necessary styles for Vue VueFlow to work */
@import '@vue-flow/core/dist/style.css';/* import the default theme, this is optional but generally recommended */
@import '@vue-flow/core/dist/theme-default.css';.process-panel {background-color: #EBEEF5;padding: 10px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);display: flex;flex-direction: column;
}.dropzone-background {position: relative;height: 100%;width: 100%
}.dropzone-background .overlay {position: absolute;top: 0;left: 0;height: 100%;width: 100%;display: flex;align-items: center;justify-content: center;z-index: 1;pointer-events: none
}
</style>

相关文章:

  • 面试实践AND面经热点题目总结
  • 探索 C++23 的 views::cartesian_product
  • 基于机器学习的攻击检测与缓解,以及 SDN 环境中的多控制器布局优化
  • 微程序控制器的详细工作过程
  • 如何在Jmeter中调用C程序?
  • 深入理解Embedding Models(嵌入模型):从原理到实战(上)
  • 2025-05-08 Unity 网络基础9——FTP通信
  • 学习笔记:数据库——事务
  • 克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!
  • 使用Jmeter对AI模型服务进行压力测试
  • Matlab 四分之一车体被动和模糊控制对比
  • MySQL报错解决过程
  • MySQL 8.0 OCP 英文题库解析(一)
  • Python 爬虫之 XPath 元素定位
  • 【Linux】swap交换分区管理
  • 【ArcGIS微课1000例】0146:将多个文件夹下的影像移动到一个目标文件夹(以Landscan数据为例)
  • 一文读懂Python之requests模块(36)
  • 精品,架构师总结,MySQL 5.7 查询入门详解
  • 【Rust】结构体
  • 云原生安全治理体系建设全解:挑战、框架与落地路径
  • 警惕“全网最低价”等宣传,市监总局和中消协发布直播消费提示
  • 第1现场 | 50多年来首次!印度举行大规模民防演习
  • 菲护卫艇企图侵闯中国黄岩岛领海,南部战区:依法依规跟踪监视、警告驱离
  • 公积金利率降至历史最低!多项房地产利好政策落地,购房者置业成本又降了
  • 外交部发言人就当前印巴局势答记者问
  • 川大全职引进考古学家宫本一夫,他曾任日本九州大学副校长