更新记录

1.2.0(2026-06-09) 下载此版本

新增节点内容过长时可换行渲染相关配置项

1.1.0(2026-05-18) 下载此版本

更新部分兼容问题

1.0.0(2026-03-04) 下载此版本

初版发布

查看更多

平台兼容性

uni-app(3.8.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟

uni-app x(3.8.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

cs-mindmap 微信小程序原生 Canvas 思维导图组件

基于 uni-app 和微信小程序原生 Canvas 2D API 纯手写打造的高性能、轻量级思维导图组件。彻底摆脱臃肿的第三方图表库依赖,解决各类 Webview 和跨端编译带来的兼容性黑盒问题。

✨ 核心特性

  • 🚀 极致性能:纯原生 Canvas 2D 绘制,利用 requestAnimationFrame 调度动画帧,拖拽缩放丝滑无卡顿。
  • 🎨 动态自适应布局:告别写死的宽高!根据节点文字长度自动计算动态宽度,并支持带有弧度的优雅三次贝塞尔曲线连线。
  • 🧭 多排布模式:支持向右排布 (right)、向左排布 (left) 以及居中发散排布 (center)。
  • 📱 完善的移动端手势:内置一指拖拽漫游、双指捏合缩放(Pinch-to-zoom)数学模型。
  • 🎯 智能初始视角:支持全局自适应缩放(Fit View),自动计算包围盒(Bounding Box),确保初始加载时整棵树完美停靠在视口内;也支持指定初始缩放比例。
  • 👆 精准点击拾取:内置逆向坐标系转换与 AABB 碰撞检测,支持精确点击节点并抛出事件。

📦 文件结构

确保以下两个文件在同一个目录下:

  • layout.js:底层核心布局算法引擎(纯数学计算,剥离视图)。
  • MindMap.vue:视图层组件(负责 Canvas 渲染、手势交互与生命周期)。

🚀 快速上手

1. 引入组件

在你的业务页面中引入并注册组件:

<template>
  <view class="page-container">
    <MindMap
      ref="mindmap"
      mindMapId="mindmap"
      :layoutMode="'right'"
      :fitView="true"
      :rawData="rawData"
      :contentStyle="contentStyle"
      @node-click="handleNodeClick"
    />
  </view>
</template>

<script>
import MindMap from "@/components/MindMap/MindMap.vue"; // 请根据实际路径修改

export default {
  components: { MindMap },
  data() {
    return {
      rawData: {
        id: "root",
        topic: "中心根节点",
        children: [
          {
            id: "sub_1",
            topic: "分支主题1",
            children: [
              {
                id: "sub_1_1",
                topic: "分支主题1-1",
              },
              {
                id: "sub_1_2",
                topic: "分支主题1-2",
              },
            ],
          },
          {
            id: "sub_2",
            topic: "分支主题2",
             children: [
              {
                id: "sub_2_1",
                topic: "分支主题2-1",
              },
              {
                id: "sub_2_2",
                topic: "分支主题2-2",
              },
            ],
          },
        ],
      },
      contentStyle: {
        height: "40vh",
        background: "#f4f4f4",
      },
    };
  },
  onShow(){
    this.$refs.mindmap.initMindMap();
  },
  methods: {
    handleNodeClick(nodeData) {
      console.log("点击了节点:", nodeData.topic);
      uni.showToast({
        title: `选中: ${nodeData.topic}`,
        icon: "none",
      });
    },
  },
};
</script>

<style>
.page-container {
  width: 100vw;
  height: 100vh;
}
</style>

⚙️ API 参考

Props 配置项

参数名 类型 默认值 说明
layoutMode String 'right' 思维导图排布模式。可选值:'right' (向右)、'left' (向左)、'center' (居中发散)
fitView Boolean true 是否开启自适应视图。开启后,将忽略 initialZoom,自动缩放并将导图完整置于屏幕内
initialZoom Number 1.0 初始缩放比例(0.2 ~ 3.0)。仅在 fitViewfalse 时生效
mindMapId String 40 画布ID 用于一个页面多画布时区分画布
rawData Object null 思维导图数据
contentStyle Object null 思维导图外部容器样式,可用来配置画布背景色及宽高、圆角等样式
textWrap Boolean false 思维导图节点文字过多时是否可换行
textMaxWidth Number 180 思维导图节点最大宽度,textWrap为true时生效
textLineHeight Number 18 思维导图节点文字行高,textWrap为true时生效
textAlign String 'center' 思维导图节点文字对齐方式,可选center/left

Events 事件

事件名 参数 说明
@node-click (node) 点击节点时触发。返回被点击节点的完整数据对象

📊 数据结构约定

为了保证布局算法正常运行,Prop传入的数据 rawData 需要严格遵循以下嵌套 JSON 格式:

{
  "id": "root",
  "topic": "中心根节点",
  "children": [
    {
      "id": "sub_1",
      "topic": "分支主题一",
      "children": []
    },
    {
      "id": "sub_2",
      "topic": "分支主题二"
    }
  ]
}
  • 核心字段:必须包含唯一的 id 和用于展示文本的 topic
  • 层级字段:子节点必须放在 children 数组中。

⚠️ 注意事项与避坑指南

  1. 小程序环境差异:本组件使用了小程序特有的 Canvas 2D 接口 (type="2d") 请勿在普通的 H5 环境下直接运行,如需跨端到 H5,需做环境降级兼容处理。
  2. 真机预览:微信开发者工具中的 Canvas 渲染表现(尤其是文字排版和手势事件触发频率)有时与真机不一致。遇到交互问题时,请务必使用真机调试
  3. 性能上限:当前碰撞检测使用的是全量树遍历。如果在极端场景下(如节点数量超过 1000 个),建议对不在视口内的节点开启 Culling(剔除)优化以维持高帧率。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议