JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 13
  • Score
    100M100P100Q51569F

基于 Vue 的思维导图

Package Exports

  • bi-vue-mindmap
  • bi-vue-mindmap/dist/bi-vue-mindmap.esm.js
  • bi-vue-mindmap/dist/bi-vue-mindmap.umd.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (bi-vue-mindmap) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

bi-vue-mindmap

🖼️ Screen Shoot

效果图1

🔨 Minimal Sample

<template>
  <BiVueMindmap ref="bi-vue-mindmap" :flatNodes="mindmapNodes" />
</template>
<script>
import BiVueMindmap, { BtnWrapper } from "bi-vue-mindmap";
export default {
  components: {
    BiVueMindmap,
  },
  data() {
    return {
      mindmapNodes: [
        {
          id: "xxx",
          parentId: null,
          title: "父节点",
          extra: {
            a: 1,
            b: "x",
          },
        },
        {
          id: "yyy",
          parentId: "xxx",
          title: "子节点",
          extra: {
            a: 2,
            b: "y",
          },
        },
      ],
    };
  },
};
</script>
<template>
  <BiVueMindmap ref="bi-vue-mindmap" :flatNodes="mindmapNodes">
    <template v-slot:operation>
      <BtnWrapper>
        <img
          class="btn-img"
          :style="{ width: '20px', height: '20px' }"
          :src="LOGO_ICON"
        />
      </BtnWrapper>
    </template>
  </BiVueMindmap>
</template>
<script>
import BiVueMindmap, { BtnWrapper } from "bi-vue-mindmap";
import LOGO_ICON from "../assets/logo.png";

export default {
  components: {
    BiVueMindmap,
    BtnWrapper,
  },
  data() {
    return {
      LOGO_ICON,
      mindmapNodes: [
        {
          id: "xxx",
          parentId: null,
          title: "父节点",
          extra: {
            a: 1,
            b: "x",
          },
          resources: [
            {
              type: "PIC",
              url: require("../assets/examples/landscape.png"),
            },
            {
              type: "VIDEO",
              url: require("../assets/examples/cat.mp4"),
            },
            {
              type: "FILE",
              url: require("../assets/examples/cat.mp4"),
            },
          ],
        },
        {
          id: "yyy",
          parentId: "xxx",
          title: "子节点",
          extra: {
            a: 2,
            b: "y",
          },
          resources: [
            {
              type: "PIC",
              url: require("../assets/examples/landscape.png"),
            },
          ],
        },
        {
          id: "zzz",
          parentId: "xxx",
          title: "子节点",
          extra: {
            a: 3,
            b: "z",
          },
          resources: [
            {
              type: "VIDEO",
              url: require("../assets/examples/cat.mp4"),
            },
          ],
        },
      ],
    };
  },
};
</script>

🔠 Properties

Prop Name Type Default Value Description
flatNodes Array.<Node> 仅包含单个根节点 节点数据(组件不会更改本数组内的数据)
isReadonly Boolean false 是否全局只读(true 会使整个导图没有任何编辑功能)
defaultLayout String "horizontal" 默认展示的布局方式(横向/竖向),取值范围["horizontal", "vertical"]
defaultLineStyle String "curve" 默认的节点间连线样式,取值范围["curve", "straight"]
defaultLineColor String "#338AFF" 默认的节点间连线的颜色(以 # 开头的十六进制颜色)
allowDrop Boolean false 是否允许往节点拖放图片/视频/文件/Html 内容
isBottomBarVisible Boolean true 是否隐藏底部工具栏
isNodeHide String "vif" 不在视窗范围内的节点是否渲染,取值范围["none", "vshow", "vif"]
operationPosition String "left-top" 操作按钮组的位置,取值["left-top", "right-top", "left-bottom", "right-bottom"]

Node Fields

Field Name Type Default Value required Description
id string 随机的 uuid 非必填 标识节点的全局唯一值
parentId string | null null 除根节点外必填 父节点的id(本身为根节点则本值设为null)
title string "" 非必填 节点标题(自定义节点不需本值)
isReadonly boolean false 非必填 节点是否为只读(当节点只读时,不能编辑节点标题,没有任何操作按钮)
orderNo number 1 非必填 在同一父节点下的排列顺序(从1开始,如果值相同,则按 flat-nodes 数组内的默认顺序)
extra object {} 非必填 额外需要保存到节点对象的数据对象(可包含用户的自定义数据)
isCustomized boolean false 非必填 是否自定义节点内容(详见 Customization 一节)
resources array [] 非必填 图片、视频、文件等附件资源
isFolded boolean false 非必填 节点属下的子节点是否折叠
redefineSubCount number 0 非必填 重新定义某节点属下所有层级子节点的数量(而不是由本组件自动计算),当 isFolded 同时为 true 时,即使是末端子节点亦可显示后代数量,多用于节点数据懒加载
extraClassName string undefined 非必填 额外需要加到节点上的类名

Resource Fields

Field Name Type Default Value required Description
type string - 必填 资源类型,取值范围['PIC', 'VIDEO', 'FILE', 'HTML']
url string - 非HTML时必填 资源的预览或下载地址
title string - 非HTML时必填 标题/文件名
size number - 非HTML时必填 大小(单位字节)
htmlContent string - HTML时必填 html内容

目前本组件仅支持一个根节点


🛠️ Methods

Method Name Params Description
refreshNodesAndLinks - 刷新节点及连线(flat-nodes 数组内的元素数量或位置有改变时,会自动调用本方法,无需手动调用)
getNodeOrderNoById id:string 通过节点id获取在同一父节点下该节点的排列顺序号
foldOrUnfold nodeIds:string[], isFolded:boolean 批量折叠节点
focusToNode nodeId:string 屏幕视角中心聚焦到某个节点
focusToNodes nodeIds:string[] 屏幕视角中心聚焦到多个节点的共同中心点
insertResource nodeId:string, resource:Object 向指定节点追加一个资源
plusScaleValue - 放大一个单位导图缩放比例
minusScaleValue - 缩小一个单位导图缩放比例
setScaleValue scaleValue:number 设置缩放比例(例如设置为0.5,则表示导图缩小为正常尺寸的一半)
setFullScreen isFullScreen:boolean 设置导图是否全屏
focusCenter - 焦点定位到中心

Method Examples

this.$refs["bi-vue-mindmap"].refreshNodesAndLinks();
this.$refs["bi-vue-mindmap"].getNodeOrderNoById("yyy");
this.$refs["bi-vue-mindmap"].insertResource("idxxxxx", {
  type: "VIDEO",
  url: "https://xxx.com/xxx.mp4",
  title: "cat.mp4",
  size: 5000,
});

🎺 Events

Operation Events

Event Name Parameters Meaning
title-changed 节点对象, 原标题 某节点的标题被改变
child-added 新节点对象, 父节点对象, 新节点的排序号 新的子节点被添加(id 为随机 uuid,可手动调用新节点对象的 setId() 更改为自定义的id)
sibling-added 新节点对象, 兄弟节点对象, 新节点的排序号 新的兄弟节点被添加(id 为随机 uuid,可手动调用新节点对象的 setId() 更改为自定义的id)
nodes-deleted 被删除的节点对象二维数组, 形如: [[节点a, 子节点a1, 子节点a2...],[节点b, 子节点b1, 子节点b2...]...] 1个或多个节点被删除
change-parent 节点对象集合, 新父节点id, 旧父节点id集合 节点移动到新的父节点下
node-folded 被折叠的节点对象 节点的下级子节点被隐藏
node-unfolded 被展开的节点对象 节点的下级子节点被展示
img-inserted 节点对象, 含图片的资源对象, 浏览器文件对象(可用于上传后端), 资源的排序index 节点内被插入图片
video-inserted 节点对象, 含视频的资源对象, 浏览器文件对象(可用于上传后端), 资源的排序index 节点内被插入视频
file-inserted 节点对象, 含文件的资源对象, 浏览器文件对象(可用于上传后端), 资源的排序index 节点内被插入文件
frame-size-reseted 节点对象, 资源对象, 现尺寸{w, h}, 原尺寸{w, h} 节点内图片或视频的显示尺寸被调整
resource-deleted 节点对象, 被删除的资源对象 节点内资源被删除
resource-forward 节点对象, 被前移的资源对象 多资源节点内资源被前移
resource-backward 节点对象, 被后移的资源对象 多资源节点内资源被后移
font-bold 节点对象, 是否字体加粗 节点文字字体加粗/取消加粗
font-italic 节点对象, 是否设置斜体 节点文字设置斜体/取消设置斜体
font-underline 节点对象, 是否设置下划线 节点文字设置下划线/取消设置下划线
font-eraser 节点对象 清除节点文字的样式
font-bg-color 节点对象, 新设置的文字背景色 设置节点的文字背景色

Normal Events

Event Name Parameters Meaning
before-full-screen - 在全屏之前
before-cancel-full-screen - 在取消全屏之前

Infomation Events

Event Name Parameters Meaning
map-style-change params: {width, height, scale, top, left} 导图样式变化事件

Ctrl+Z Events

Event Name Parameters Meaning
recover-title-changed 节点对象 title-changed 事件恢复
recover-child-added 节点对象, 父节点对象, 新节点的排序号 child-added 事件恢复
recover-nodes-deleted 被恢复的节点对象二维数组 node-deleted 事件恢复
recover-change-parent 节点对象集合, 恢复后的父节点id集合, 恢复前的父节点id change-parent 事件恢复
recover-node-folded 折叠后被恢复的对象 node-folded 事件恢复
recover-node-unfolded 展开后被恢复的对象 node-unfolded 事件恢复
recover-img-inserted 节点对象, 含图片的资源对象 img-inserted 事件恢复
recover-video-inserted 节点对象, 含视频的资源对象 video-inserted 事件恢复
recover-file-inserted 节点对象, 含文件的资源对象 file-inserted 事件恢复
recover-frame-size-reseted 节点对象, 资源对象, 恢复后尺寸{w, h}, 恢复前尺寸{w, h} frame-size-reseted 事件恢复
recover-resource-deleted 节点对象, 被恢复的资源对象 resource-deleted 事件恢复
recover-resource-forward 节点对象, 前移后被恢复的资源对象 resource-forward 事件恢复
recover-resource-backward 节点对象, 后移后被恢复的资源对象 resource-backward 事件恢复
recover-font-bold 节点对象, 还原后字体是否加粗 font-bold 事件恢复
recover-font-italic 节点对象, 还原后字体是否倾斜 font-italic 事件恢复
recover-font-underline 节点对象, 还原后字体是否有下划线 font-underline 事件恢复
recover-font-bg-color 节点对象, 还原后字体的背景色 font-bg-color 事件恢复
recover-font-eraser 节点对象, 还原后的字体样式 font-eraser 事件恢复

Drag Drop Events

Event Name Parameters Meaning
node-dragenter 节点对象, 原生事件对象 对应原生 dragenter 事件
node-dragleave 节点对象, 原生事件对象 对应原生 dragleave 事件
node-dragover 节点对象, 原生事件对象 对应原生 dragover 事件
node-drop 节点对象, 原生事件对象 对应原生 drop 事件

详情可参考:https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_Drag_and_Drop_API


🎣 Hooks Before Events

Function Name Parameters Meaning
before-child-added 节点对象, 父节点对象, 新节点的排序号 child-added 事件的前置钩子; 可修改节点对象的字段,从而控制新增子节点
before-sibling-added 节点对象, 兄弟节点对象, 新节点的排序号 sibling-added 事件的前置钩子; 可修改节点对象的字段,从而控制新增兄弟节点
before-change-parent 节点对象集合, 新父节点id, 旧父节点id集合 change-parent 事件的前置钩子
before-img-inserted 浏览器文件对象(可用于上传后端), 图片资源的index, 图片资源对象 img-inserted 事件的前置钩子; 可修改图片资源对象的 id 和 url 属性, url 属性是图片的预览地址
before-video-inserted 浏览器文件对象(可用于上传后端), 视频资源的index, 视频资源对象 video-inserted 事件的前置钩子; 可修改视频资源对象的 id 和 url 属性, url 属性是视频的预览地址
before-file-inserted 浏览器文件对象(可用于上传后端), 文件资源的index, 文件资源对象 file-inserted 事件的前置钩子; 可修改图片资源对象的 id, url, title, size 属性, url 属性是文件的下载地址
  1. 钩子函数作为 Props 传递给组件
  2. 以上前置钩子函数,函数内 return false 会使对应的后续事件取消发生

⚙️ Customization

节点 Node 对象中 isCustomized 字段设置为 true 后,节点则作为自定义节点渲染。以插槽的形式定义节点的渲染样式

Customized Node Additional Fields

Field Name Type Default Value Description
width number 100 节点的宽度
height number 32 节点的高度
calcCellSize function - 计算节点高度和宽度的方法(当宽高有变时,可手动调用组件的 refreshNodesAndLinks() 方法刷新导图)

Customization Sample

<template>
  <BiVueMindmap
    :flatNodes="mindmapNodes"
    v-slot="{ id, parentId, orderNo, width, height, extra }"
  >
    <div class="my-node-template">
      <p class="title">{{ extra.myTitle }}</p>
      <button
        tabindex="-1"
        @click.stop="
          onBtnClick({ id, parentId, orderNo, width, height, extra })
        "
      >
        确认
      </button>
    </div>
  </BiVueMindmap>
</template>
<script>
import BiVueMindmap from "bi-vue-mindmap";
export default {
  components: {
    BiVueMindmap,
  },
  data() {
    return {
      mindmapNodes: [
        {
          id: "xxx",
          parentId: null,
          title: "父节点",
        },
        {
          id: "yyy",
          parentId: "xxx",
          isCustomized: true,
          width: 100,
          height: 32,
          extra: {
            myTitle: "Customized Node",
          },
          calcCellSize: function (node) {
            this.width = 200;
            this.height = 64;
            // ----- or -----
            // node.width = 200;
            // node.height = 64;
          },
        },
      ],
    };
  },
  methods: {
    onBtnClick({ id, parentId, orderNo, width, height }) {},
  },
};
</script>

🎹 快捷键

Keys Description
Ctrl+Z 恢复上一步操作
Ctrl+0 将缩放比例恢复到100%
Detele 删除当前激活的节点对象