使用Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件
一、前言
思維導(dǎo)圖是一種用于表示信息、想法和概念的圖形化工具。通過(guò)將內(nèi)容分層次的組織和連接,幫助用戶更好地理解和記憶。今天,我們將基于 Vue 3 和 VueDraggable,一起實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件,支持節(jié)點(diǎn)拖拽、編輯及節(jié)點(diǎn)之間的關(guān)系連接。
二、技術(shù)選型
Vue 3:現(xiàn)代的前端框架,適合構(gòu)建響應(yīng)式和交互豐富的組件。
VueDraggable:一個(gè) Vue 的拖拽插件,能夠輕松實(shí)現(xiàn)元素拖拽功能。
Canvas 或 SVG:用來(lái)繪制節(jié)點(diǎn)間的連接線條。
三、思維導(dǎo)圖組件設(shè)計(jì)
3.1 功能需求
我們要實(shí)現(xiàn)的思維導(dǎo)圖組件需要具備以下功能:
- 節(jié)點(diǎn)拖拽:用戶能夠自由地拖動(dòng)每個(gè)節(jié)點(diǎn)。
- 節(jié)點(diǎn)編輯:用戶可以修改節(jié)點(diǎn)的名稱。
- 節(jié)點(diǎn)關(guān)系:用戶可以通過(guò)連線將節(jié)點(diǎn)與節(jié)點(diǎn)之間的關(guān)系展示出來(lái)。
- 自適應(yīng)布局:當(dāng)節(jié)點(diǎn)被拖動(dòng)時(shí),自動(dòng)調(diào)整連接線的位置。
3.2 組件結(jié)構(gòu)
思維導(dǎo)圖組件可以分為以下幾部分:
- 節(jié)點(diǎn)組件:展示每個(gè)節(jié)點(diǎn)的內(nèi)容(文本、標(biāo)題等)。
- 連接線組件:通過(guò)直線或曲線連接節(jié)點(diǎn)之間的關(guān)系。
- 畫布組件:包含所有節(jié)點(diǎn)和連接線的容器。
四、實(shí)現(xiàn)步驟
4.1 設(shè)置 Vue 3 項(xiàng)目
首先,創(chuàng)建一個(gè)新的 Vue 3 項(xiàng)目:
vue create mind-map
安裝所需的依賴包:
npm install vue-draggable
4.2 創(chuàng)建思維導(dǎo)圖組件
畫布組件
我們首先創(chuàng)建一個(gè)畫布組件,容納所有的節(jié)點(diǎn)和連接線。
<template>
<div class="canvas" ref="canvasRef">
<MindNode v-for="node in nodes" :key="node.id" :node="node" @update-node="updateNode"/>
<svg class="connections">
<line v-for="(line, index) in connections" :key="index" :x1="line.x1" :y1="line.y1" :x2="line.x2" :y2="line.y2" stroke="black"/>
</svg>
</div>
</template>
???????<script>
import MindNode from './MindNode.vue';
export default {
components: {
MindNode,
},
data() {
return {
nodes: [
{ id: 1, x: 100, y: 100, title: 'Node 1' },
{ id: 2, x: 300, y: 200, title: 'Node 2' },
],
connections: [
{ x1: 100, y1: 100, x2: 300, y2: 200 },
]
};
},
methods: {
updateNode(id, newTitle) {
const node = this.nodes.find(n => n.id === id);
if (node) node.title = newTitle;
}
}
};
</script>
<style scoped>
.canvas {
position: relative;
width: 100%;
height: 100vh;
background-color: #f9f9f9;
}
.connections line {
stroke-width: 2;
}
</style>
節(jié)點(diǎn)組件
每個(gè)節(jié)點(diǎn)可以單獨(dú)作為一個(gè)組件,用 VueDraggable 實(shí)現(xiàn)拖拽效果,并允許用戶編輯節(jié)點(diǎn)標(biāo)題。
<template>
<div class="node" v-bind:style="{ left: node.x + 'px', top: node.y + 'px' }" v-draggable @drag="onDrag">
<input type="text" v-model="node.title" @input="updateNodeTitle" />
</div>
</template>
<script>
export default {
props: ['node'],
methods: {
onDrag(event) {
this.node.x += event.movementX;
this.node.y += event.movementY;
this.$emit('update-node', this.node.id, this.node.title);
},
updateNodeTitle() {
this.$emit('update-node', this.node.id, this.node.title);
}
}
};
</script>
???????<style scoped>
.node {
position: absolute;
background-color: #fff;
border: 2px solid #ddd;
padding: 10px;
border-radius: 5px;
cursor: pointer;
min-width: 150px;
}
.node input {
border: none;
background: transparent;
font-size: 16px;
text-align: center;
}
</style>
4.3 連接線的自動(dòng)調(diào)整
我們使用 SVG 元素繪制連接線,當(dāng)節(jié)點(diǎn)位置發(fā)生變化時(shí),重新計(jì)算連接線的坐標(biāo),確保連接始終保持正確。
4.4 完整實(shí)現(xiàn)
此時(shí),我們的思維導(dǎo)圖組件已經(jīng)具備了基本的功能:節(jié)點(diǎn)拖拽、編輯和節(jié)點(diǎn)關(guān)系的連接。你可以根據(jù)需求繼續(xù)添加更多的功能,例如:
- 節(jié)點(diǎn)的刪除功能
- 可調(diào)整的節(jié)點(diǎn)大小
- 支持多個(gè)級(jí)別的樹形結(jié)構(gòu)
五、總結(jié)
通過(guò)使用 Vue 3 和 VueDraggable,我們成功實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的思維導(dǎo)圖組件,支持拖拽、節(jié)點(diǎn)編輯和自動(dòng)調(diào)整連接線。這個(gè)組件可以作為基礎(chǔ),擴(kuò)展出更多的功能,適用于在線協(xié)作、課程規(guī)劃等場(chǎng)景。
到此這篇關(guān)于使用Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件的文章就介紹到這了,更多相關(guān)Vue3思維導(dǎo)圖組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)驗(yàn)證碼按鈕倒計(jì)時(shí)功能
最近項(xiàng)目結(jié)束,空閑時(shí)間比較多,今天小編抽時(shí)間給大家使用vue寫一個(gè)小例子,就決定做驗(yàn)證碼倒計(jì)時(shí)功能,具體實(shí)例代碼大家參考下本文2018-04-04
解決vue 打包發(fā)布去#和頁(yè)面空白的問(wèn)題
今天小編就為大家分享一篇解決vue 打包發(fā)布去#和頁(yè)面空白的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
ant design vue 清空upload組件圖片緩存的問(wèn)題
這篇文章主要介紹了ant design vue 清空upload組件圖片緩存的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue3+vant4封裝日期時(shí)間組件方式(年月日時(shí)分秒)
這篇文章主要介紹了vue3+vant4封裝日期時(shí)間組件方式(年月日時(shí)分秒),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Vue實(shí)現(xiàn)右鍵菜單組件的超詳細(xì)教程(支持快捷鍵)
右鍵菜單組件非常常見,所有的前端開發(fā)工程師都會(huì)遇到類似的功能組件開發(fā)需求,這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)右鍵菜單組件的超詳細(xì)教程,文中介紹的方法支持快捷鍵,需要的朋友可以參考下2024-02-02
vue點(diǎn)擊單張圖片放大實(shí)現(xiàn)步驟(純js)
這篇文章主要給大家介紹了關(guān)于vue點(diǎn)擊單張圖片放大實(shí)現(xiàn)的相關(guān)資料,在vue項(xiàng)目中實(shí)現(xiàn)點(diǎn)擊圖片放大功能相信對(duì)大家來(lái)說(shuō)都不陌生,文中給出了詳細(xì)的js示例代碼,需要的朋友可以參考下2023-07-07
vue Draggable實(shí)現(xiàn)拖動(dòng)改變順序
這篇文章主要為大家詳細(xì)介紹了vue Draggable實(shí)現(xiàn)拖動(dòng)改變順序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
vue在data中定義變量后依舊報(bào)undefined的解決
這篇文章主要介紹了vue在data中定義變量后依舊報(bào)undefined的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

