# 操作节点内容

目前支持在节点中插入`图片`、`图标`、`超链接`、`备注`、`标签`、`概要`、`关联线`，本节教程会介绍如何通过UI界面来完成这些内容的插入。

## 监听节点激活事件

首先我们要监听节点的激活事件，如果当前没有激活节点，那么对应的UI界面肯定是禁用状态。可以通过`node_active`事件来监听节点激活事件：

```js
const activeNodes = shallowRef([])
mindMap.on('node_active', (node, activeNodeList) => {
    activeNodes.value = activeNodeList
})
```

你还可以进一步判断当前激活的节点中是否操作根节点，是否存在概要节点，因为根节点肯定不能添加兄弟节点，概要节点则子节点、兄弟节点、概要节点、关联线都不能添加。

```js
const hasRoot = computed(() => {
    return activeNodes.value.findIndex(node => {
        return node.isRoot
    }) !== -1
})


const hasGeneralization = computed(() => {
    return activeNodes.value.findIndex(node => {
        return node.isGeneralization
    }) !== -1
})
```

有了这些判断以后，我们就可以对工具按钮进行控制了，接下来就是实现按钮的相关功能。

## 插入图片

选择图片和上传图片的功能需要你自行开发，假设我们已经上传了一张图片，我们就可以遍历当前激活的节点，挨个调用节点的`setImage`方法设置图片：

```js
activeNodes.value.forEach((node) => {
    node.setImage({
        url: '图片url',
        title: '图片的标题或描述',
        width: 100,// 图片的宽高也不能少
        height: 100
    })
})
```

图片回显也很简单，可以使用节点的`getData`方法获取节点的图片：

```js
const img = activeNode.getData('image')
const imgTitle = activeNode.getData('imageTitle')
```

## 插入图标

整体逻辑和插入图片是一样的，不过你需要显示所有可插入的图标，目前只能使用库里自带的一些图标，然后将选择的图标插入到节点中：

```js
const iconList = ['priority_1', '...']// 选择的图标
activeNodes.value.forEach(node => {
    node.setIcon(iconList)
})
```

获取节点的图标数据：

```js
const iconList = activeNode.getData('icon') || []
```

## 插入超链接

对于超链接，你需要实现两个输入框，分别输入`url`和名称，然后插入到节点：

```js
activeNodes.value.forEach(node => {
    node.setHyperlink('url', '名称')
})
```

获取节点超链接数据：

```js
const url = activeNode.getData('hyperlink')
const name = activeNode.getData('hyperlinkTitle')
```

## 插入备注

备注会稍微复杂一点，因为支持两种方式。

### 使用内置逻辑

使用内置的逻辑，只能插入纯文本备注，所以你只需要显示一个输入框用来输入文本，然后插入到节点：

```js
activeNodes.value.forEach(node => {
    node.setNote('备注内容')
})
```

这样在鼠标移入节点内的备注图标时会显示你插入的备注内容。

### 自定义显示备注

如果你想显示更丰富的备注内容，比如支持`markdown`，那么你可以在实例化`simple-mind-map`时插入`customNoteContentShow`选项。

设置备注内容还是使用`setNote`方法，只不过现在插入的是`markdown`字符串，因为内置的备注弹窗只能处理纯文本内容，所以你需要自己来渲染`markdown`：

```js
const mindMap = new MindMap({
    // ...
    customNoteContentShow: {
        show: (content, left, top) => {
            // 在这里显示你的自定义弹窗
            // content表示你插入的备注的内容，left和top时弹窗应该显示的位置，你需要将你的弹窗元素设置成fixed定位
        },
        hide: () => {
            // 在这里隐藏你的自定义弹窗
            // 你也可以选择不在鼠标移出备注图标时隐藏弹窗，比如可以在画布被点击时隐藏
        }
    },
})
```

获取节点的备注内容可以通过`getData`方法：

```js
const note = activeNode.getData('note')
```

## 插入标签

标签其实就是一个个带背景颜色的文本块，你需要实现的就是一个可以输入多个文本的输入框，然后插入到节点：

```js
activeNodes.value.forEach(node => {
    node.setTag(['标签1', '...'])
})
```

获取节点标签数据：

```js
const tagArr = activeNode.getData('tag') || []
```

## 插入概要

插入概要可以不需要实现UI，直接调用插入概要的命令即可：

```js
mindMap.execCommand('ADD_GENERALIZATION', data)
```

会给当前激活的节点插入一个概要节点，第二个参数`data`可以不传，默认为：

```js
{
    text: '概要'
}
```

概要节点本质上也是一个节点，所以普通节点支持的内容它也支持。

## 插入关联线

> 要支持关联线需要使用关联线插件

关联线也不需要UI，调用一个方法即可：

```js
mindMap.associativeLine.createLineFromActiveNode()
```

然后会从激活的节点（如果有多个激活节点，默认是第一个）到鼠标的实时位置生成一条曲线，点击某个目标节点后就会创建一条从激活节点到目标节点的关联线。

## 完整示例

<iframe style="width: 100%; height: 455px; border: none;" src="https://wanglin2.github.io/playground/# " />