引入 mxGraph
旧方法
yarn add mxgraph-js # 这个包里的 mxgraph 版本号为 3.6.0
import {
mxGraph,
mxUtils,
mxHierarchicalLayout,
mxCellOverlay,
mxEvent,
mxRubberband,
mxKeyHandler,
mxConstants,
mxImage,
} from 'mxgraph-js';
官方用法
yarn add mxgraph # mxgraph 版本号 4.2.2
import * as mxgraph from 'mxgraph';
const {
mxGraph,
mxUtils,
mxHierarchicalLayout,
mxCellOverlay,
mxEvent,
mxRubberband,
mxKeyHandler,
mxConstants,
mxImage,
} = mxgraph();
mxgraph 导出的不是库本身,而是它的工厂方法。所以可以这样使用:
// ./mxgraph.js
import mxgraphFactory from 'mxgraph'
export default mxgraphFactory({
// here should be your paths to mxgraph's assets (it's optional)
mxImageBasePath: 'assets/mxgraph/images',
mxBasePath: 'assets/mxgraph'
})
// ./app.js
import mxgraph from './mxgraph'
new mxgraph.mxGraph()
新方法
yarn add mxgraph4vue;
<div ref="graph_container" class="graph-container"></div>
<style lang="scss" scoped>
.graph-container {
position: relative;
height: 400px;
}
</style>
import * as mxgraph from 'mxgraph4vue';
import 'mxgraph4vue/javascript/src/css/common.css';
const {
mxGraph,
mxUtils,
mxHierarchicalLayout,
mxCellOverlay,
mxEvent,
mxRubberband,
mxKeyHandler,
mxConstants,
mxImage,
} = mxgraph();
import icon from './images/icon.png';
export default {
mounted() {
let graph = new mxGraph(this.$refs.graph_container);
graph.view.rendering = false; // 先不渲染,最后要调整宽高尺寸
// 启用拖动平移
graph.setPanning(true);
graph.panningHandler.useLeftButtonForPanning = true;
// 自定义 tooltip
graph.setTooltips(true);
graph.getTooltipForCell = function (cell) {
var data = cell.data || {};
var tip = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const value = data[key];
tip.push(`${key}: ${value}`);
}
}
return tip.length ? tip.join('\n') : cell.value;
};
// 右键菜单
mxEvent.disableContextMenu(this.$refs.graph_container);
graph.popupMenuHandler.factoryMethod = function (menu, cell, evt) {
return function (graph, menu, cell, evt) {
if (cell != null) {
menu.addItem('MenuItem1', icon, function () {
mxUtils.alert('MenuItem1');
});
}
};
};
let root = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
let v1 = graph.insertVertex(root, null, 'Hello,', 0, 0, 80, 30);
let v2 = graph.insertVertex(root, null, 'World!', 0, 0, 80, 30);
let e1 = graph.insertEdge(root, null, '', v1, v2);
v1.data = {key: 'value', key1: 'v1'}; // 自定义数据
// 自动布局
this.layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
this.layout.execute(root);
}
finally
{
graph.getModel().endUpdate();
graph.fit(); // 让图填充整个容器
graph.view.rendering = true;
graph.refresh();
graph.zoomOut(); // 缩小一些给周围留个边距
}
},
}
