在Vue中如何利用jsmind实现思维导图的缩放和平移操作?

1. 前言

思维导图是一个常用的思维工具,它通过树形结构的方式清晰地展示了各种主题和子主题间的关系。在Web应用程序中,利用JavaScript库来创建思维导图是非常常见的做法,jsmind就是一个非常流行的JavaScript库,它允许我们创建简单但功能齐全的思维导图。在Vue中使用jsmind创建思维导图非常容易,但是jsmind本身并没有提供缩放和平移功能。在本文中,我们将介绍如何利用Vue和jsmind来实现思维导图的缩放和平移操作。

2. 安装jsmind和vue-jsmind模块

为了能够使用jsmind库,我们首先需要在我们的项目中安装它。我们可以使用npm来安装jsmind,命令如下:

npm install jsmind --save

其他的Node.js包也需要一起安装:

npm install --save jsmind@0.4.1

npm install --save jquery@3.5.1

npm install --save ejs@3.1.5

我们还需要安装Vue-jSmart模块,它提供了Vue组件用来渲染jsmind数据。命令如下:

npm install vue-jsmind --save

3. 创建一个基本的思维导图

我们要开始创建我们的思维导图。下面的代码演示了如何使用jsmind库创建一个基本的思维导图:

var mind = {

"meta":{

"name":"example",

"author":"author",

"version":"0.2"

},

"format":"node_array",

"data":[

{"id":"root", "isroot":true, "topic":"example"},

{"id":"sub1", "parentid":"root", "topic":"subtopic 1"},

{"id":"sub2", "parentid":"root", "topic":"subtopic 2"}

]

};

var options = {

//加上以下两个属性之一可以放置节点

//adjustment.x: 节点相对于屏幕横向方向的值,默认为0,表示位于中心。

//adjustment.y: 节点相对于屏幕纵向方向的值,默认为0,表示位于中心。

adjustment: {x:0, y:0},

};

var jm = new jsMind({

container:'jsmind_container',

editable:true,

theme:'default', //主题风格,可以是'default','primary'等等

mode :'side', //展现方式,有floating,top,left,right等方式

support_html:true,

view:{

canvasSizes:{

w:10000,

h:10000

}

},

layout:{

hspace:80,

vspace:18,

pspace:13

} //布局样式

});

jm.show(mind,options);

上述代码将创建一个只有root,sub1和sub2三个节点的思维导图。下面是jsmind容器的HTML代码,其中, 我们使用“#jsmind_container”选中了JSMind的容器:

<div id="jsmind_container"></div>

我们可以运行上面的代码并在浏览器中打开HTML文件来看到思维导图。思维导图看起来不错,但是我们现在想在其中实现缩放和平移。

4. 控制缩放和平移

4.1 缩放

jsmind没有提供缩放API,但是我们可以使用缩放x和缩放y来实现缩放。有两种方法来实现缩放操作。

方法一:鼠标滚轮缩放

我们可以利用鼠标滚轮事件,在浏览器中监听缩放事件。下面是代码示例:

mounted(): {

let container = document.querySelector('#jsmind_container');

var scale = 1.0;

container.addEventListener('wheel',function(event){

event.preventDefault();

var mouseX = event.pageX - container.offsetLeft;

var mouseY = event.pageY - container.offsetTop;

var wheel = event.wheelDelta/120;

var zoom = Math.exp(wheel*0.2);

if(scale*zoom > 2 || scale * zoom < 0.5){

return false;

}else {

scale *= zoom;

}

var transformOrigin = mouseX + "px " + mouseY + "px";

container.style.transform = "scale(" + scale + ")";

container.style.transformOrigin= transformOrigin;

})

}

上面的代码允许我们使用鼠标滚轮来缩放思维导图。我们通过计算鼠标指针在容器内的位置,并应用当前的缩放比率来更新缩放计算值。我们使用css的transform属性来更新容器的缩放比率和缩放的中心点。transform-origin属性允许我们指定中心点位置。

方法二:缩放按钮控制

在缩放按钮上添加事件监听器,并在每次点击时计算缩放比率即可实现。以下是代码示例:

data: {

scale: 1.0, //初始缩放比例

},

methods: {

zoomIn() {

if (this.scale >= 2) {

return;

}

this.scale += 0.1;

this.updateTransform();

},

zoomOut() {

if (this.scale <= 0.5) {

return;

}

this.scale -= 0.1;

this.updateTransform();

},

updateTransform() {

let container = document.querySelector('#jsmind_container');

container.style.transform = "scale(" + this.scale + ")";

}

}

我们通过一个名为scale的Vue数据来存储当前的缩放比率。我们在缩放按钮的点击事件上实现了zoomIn()和zoomOut()方法。在这些方法中,我们检查缩放比率是否达到上限或下限,如果没有,则增加或减少比率。我们还编写了updateTransform()方法来动态更新css 样式,并将当前比率应用于思维导图容器的transform属性。

4.2 平移

我们可以使用鼠标拖拽事件来实现平移,以下是代码示例:

mounted() {

let container = document.querySelector('#jsmind_container');

let prevX = 0, prevY = 0, isMoving = false;

container.addEventListener('mousedown',function(event){

isMoving = true;

prevX = event.clientX;

prevY = event.clientY;

container.style.cursor = "grabbing";

});

container.addEventListener('mouseup',function(event){

isMoving = false;

container.style.cursor = "default";

});

container.addEventListener('mousemove',function(event){

if (isMoving === false) {

return;

}

container.style.cursor = "grabbing";

let dx = event.clientX - prevX;

let dy = event.clientY - prevY;

container.scrollLeft -= dx;

container.scrollTop -= dy;

prevX = event.clientX;

prevY = event.clientY;

});

}

在上述代码中,我们使用三个变量 prevX, prevY和 isMoving 来记录拖拽的状态。当鼠标在容器上移动时,我们检查 isMoving 的状态,如果为 true,则计算鼠标光标在容器内的偏移,并应用此偏移来更新容器的滚动位置。我们使用CSS属性cursor来修改鼠标光标的显示,为其加上一个手柄表示正在移动,具体参考css样式。

5. 总结

在Vue中利用jsmind来实现思维导图的缩放和平移操作非常简单。我们可以使用浏览器API来监听事件并控制视图进行缩放和平移。通过添加事件监听器和自定义样式,我们可以轻松地实现高效的自动化思维导图。

参考jsmind官方文档: https://github.com/hizzgdev/jsmind