vue+jsmind实现思维导图加入按钮

一.jsmind官网:http://hizzgdev.github.io/jsmind/docs/zh/1.usage.html

官网解释的很详细,注意的就是,想让子节点在根节点的左右时,需要将mode设置为full,然后在数据中设置direction为left或right

mode: 'full', // 显示模式
{"id":"easy", "parentid":"root", "topic":"2", "direction":"left"},

话少说,上图

 

其中需要注意的是什么呢,一点是mind中data的数据格式,尤其是json文档转思维导图的同学,真的是让人肝肠寸断,一定要确定好data的格式,比如说,我是说比如:   "format":"node_array",时,data后是【, "format":"node_tree",时,data后是{

/* 数据格式声明 */
"format":"node_array",
/* 数据内容 */
"data":[
  {"id":"root", "isroot":true, "topic":"111","data": {
      selected: false, // 选中状态

    }},
"format": "node_tree",
/* 数据内容 */
"data": {
  "id": 12,
  "topic": "jsMind",
  "children": [
    {
      "id": 11,
      "topic": "Easy777777777",
      // "direction": "left",
还有的就是children不可与parentid同时在一个节点中,不然你就会收获

can not open this file as mindmap!!!!!!!!!!!!

还有什么需要展开说说呢,那就options的属性及对应的值,

 ,还有jsmind中自带的方法,3.operation | zh | docs | jsMind

然后就是方法了,读取文档创建思维导图的方法!(!!!!!!!!一定要注意格式,不然会痛苦死)

 

//从文件输入框file_input获取选中的文件
    function open_nodearray(){
        var file_input = document.getElementById('file_input_nodearray');
        var files = file_input.files;
        if(files.length > 0){
            var file_data = files[0];
            jsMind.util.file.read(file_data,function(jsmind_data, jsmind_name){
                var mind = jsMind.util.json.string2json(jsmind_data);
                if(!!mind){
                    _jm.show(mind);
                    reBuild()
                }else{
                    // console.error('Failed to parse jsmind_data:', jsmind_data);

                    alert('can not open this file as mindmap');
                }
            });
        }else{
            alert('please choose a file first')
        }
    }

还有什么可以说的呢?
那当然就是在思维导图中增加按钮啊!
具体怎么做呢,需要修改一下jsmind.js的源码
打开node—modules

编辑jsmind.js,ctrl+f搜索create_node_element

我们来增加下面这么一小段 

就可以产生按钮啦,当然,我这里是自定义的按钮,也很简单,怎么做呢,
如下所示:
创建一个新的组件,随便取名字,我这里取的是MyButton.vue

 

不要担心,就是一个简单的div块,加上一些css,就将按钮变了
 

 

 

 神奇不神奇,具体代码去掘金搜索吧,单标签下的日间/黑夜模式切换按钮效果 - 掘金

 然后千万别忘了,在你想应用的组件下面
看到MyButton,感谢MyButton
然后还有什么可说的呢,这无情的文字,无情的知识,没了吧,下播

还有哦,在渲染页面后,可以在组件直接通过jmnode修改样式
(有什么问题,小伙伴可以再私信我) 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Vue3 和 TypeScript 实现的 D3 思维导图的示例代码,同时自定义了无限嵌套的功能: ```vue <template> <div ref="svgContainer"></div> </template> <script lang="ts"> import { defineComponent, onMounted, ref } from 'vue'; import * as d3 from 'd3'; export default defineComponent({ setup() { const svgContainer = ref<HTMLElement | null>(null); let svg: d3.Selection<SVGSVGElement, unknown, null, undefined> | undefined; let zoom: d3.ZoomBehavior<Element, unknown> | undefined; let g: d3.Selection<SVGGElement, unknown, null, undefined> | undefined; let root: d3.HierarchyNode<unknown> | undefined; const data = { name: 'root', children: [ { name: 'child1' }, { name: 'child2', children: [{ name: 'grandchild1' }, { name: 'grandchild2' }] }, ], }; const treeLayout = d3.tree().size([400, 400]); // 递归遍历树结构,为每个节点添加 id 和 parent 属性 const addIdAndParent = (node: d3.HierarchyNode<unknown>, parentId?: string) => { node.id = `${node.data.name}_${Math.random().toString(16).slice(2)}`; node.parentId = parentId; if (node.children) { node.children.forEach((child) => addIdAndParent(child, node.id)); } }; // 自定义的无限嵌套函数,每次嵌套时在当前节点下添加两个子节点 const nest = (node: d3.HierarchyNode<unknown>) => { const id1 = `${node.id}_1`; const id2 = `${node.id}_2`; node.children = [ { name: `child1_${id1}` }, { name: `child2_${id2}`, children: [{ name: `grandchild1_${id1}` }, { name: `grandchild2_${id2}` }] }, ]; node.children.forEach((child) => { child.id = `${child.name}_${Math.random().toString(16).slice(2)}`; child.parentId = node.id; }); return node; }; const update = (source: d3.HierarchyNode<unknown>) => { // 更新树结构 const nodes = treeLayout(root!).descendants(); const links = treeLayout(root!).links(); // 更新链接 const link = g!.selectAll('.link').data(links, (d) => (d as any).target.id); link.enter().append('path').attr('class', 'link').attr('d', d3.linkHorizontal().x((d: any) => d.y).y((d: any) => d.x)); link.transition().attr('d', d3.linkHorizontal().x((d: any) => d.y).y((d: any) => d.x)); link.exit().remove(); // 更新节点 const node = g!.selectAll('.node').data(nodes, (d) => (d as any).id); const nodeEnter = node.enter().append('g').attr('class', 'node').attr('transform', () => `translate(${source.y0},${source.x0})`); nodeEnter.append('circle').attr('r', 10).style('fill', '#fff').style('stroke', '#000'); nodeEnter.append('text').attr('dy', '0.35em').attr('x', (d) => (d.children ? -13 : 13)).style('text-anchor', (d) => (d.children ? 'end' : 'start')).text((d) => d.data.name); const nodeUpdate = nodeEnter.merge(node); nodeUpdate.transition().attr('transform', (d) => `translate(${d.y},${d.x})`); node.exit().transition().attr('transform', () => `translate(${source.y},${source.x})`).remove(); nodes.forEach((d) => { d.x0 = d.x; d.y0 = d.y; }); }; const init = () => { svg = d3.select(svgContainer.value).append('svg').attr('width', '100%').attr('height', '100%'); zoom = d3.zoom().scaleExtent([0.1, 10]).on('zoom', () => { g!.attr('transform', d3.event.transform); }); svg.call(zoom); g = svg.append('g').attr('transform', 'translate(50, 50)'); root = d3.hierarchy(data, (d) => d.children); addIdAndParent(root!); update(root!); // 点击节点时无限嵌套 svg.selectAll('.node').on('click', (d: d3.HierarchyNode<unknown>) => { nest(d); update(d); zoom?.transform(svg!, d3.zoomIdentity.translate(50, 50).scale(1)); }); }; onMounted(() => { init(); }); return { svgContainer, }; }, }); </script> <style> .node { cursor: pointer; } </style> ``` 在这个示例中,我们使用了 D3 的树形布局来排列思维导图的节点,使用递归函数遍历树结构为每个节点添加了 id 和 parentId 属性,并且使用了 D3 的选择集和过渡来更新节点和链接的位置。同时,在点击节点时使用自定义的无限嵌套函数实现了无限嵌套的功能。 需要注意的是,这个示例代码只是一个比较简单的实现,具体的实现方式和界面样式还需要根据具体的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值