跳到主要内容

19 思维导图组件makmap

一、添加依赖

npm install markmap-common markmap-lib markmap-toolbar markmap-view

二、编写组件

项目目录/src/components/ 新增 MarkMap/index.js

import React, { useEffect, useRef } from "react";
import { Transformer } from "markmap-lib";
const { Markmap } = require("markmap-view");

const transformer = new Transformer();

const MarkmapRender = (props) => {
const svg = useRef(null); // useRef 初始化为 null

useEffect(() => {
const mm = Markmap.create(svg.current);
const { root } = transformer.transform(props.value || ""); // 确保 value 存在
mm.setData(root);
mm.fit();
}, [props.value]); // 当 props.value 改变时触发

return (
<React.Fragment>
<svg className="flex-1" ref={svg} style={props.style} />
</React.Fragment>
);
};

export default MarkmapRender;

三、使用组件

创建 Markdown 文档

# 思维导图示例

在下面你将看到一个思维导图:

import MarkmapRender from "/src/components/MarkMap";

<MarkmapRender value={`
# 知识库
## Linux
- Linux命令
- debian12桌面日常
## 前端
- HTML
- CSS
- BOM/DOM
- Javascript
`} style={{ width: "100%", height: "500px" }} />

npm run start 预览效果

image-20250223173242553

效果:


补充:ts 版本组件

import React, { useEffect, useRef } from "react";
import { Transformer } from "markmap-lib";
const { Markmap } = require("markmap-view");

const transformer = new Transformer();

interface MarkmapRenderProps {
value?: string;
style?: React.CSSProperties;
}

const MarkmapRender: React.FC<MarkmapRenderProps> = ({ value, style }) => {
const svg = useRef<SVGSVGElement>(null);

useEffect(() => {
const mm = Markmap.create(svg.current);
const { root } = transformer.transform(value || "");
mm.setData(root);
mm.fit();
}, [value]);

return (
<svg ref={svg} style={style} className="flex-1" />
);
};

export default MarkmapRender;