vue.js 3: markmap using typescript

在项目目录文件下,通过cmd运行下述指令。
npm create vue@latest
cd vue-projectnpm installnpm run format
npm run dev或
npm init vue@latest
cd vue-prjectnpm run build --打包项目创建项目没有node_modules
npm init -y
npm install vue-routernpm install markmap-lib
npm install markmap-render
npm install markmap-view
npm install markmap-cli
npm install markmap-toolbar
npm install coc-markmap
npm i markmap-autoloade

项目结构:

/** @creater: geovindu* @since: 2025-06-24 22:22:55* @LastAuthor: geovindu* @lastTime: 2025-06-24 22:23:29* @文件相对于项目的路径: \jsstudy\markmapdemo\src\views\markmap.ts* @message: geovindu* @IDE: vscode* @Development: node.js 20, vuejs3.0* @package:* @ISO: windows10* @database: mysql 8.0 sql server 2019 postgresSQL 16* Copyright (c) 2025 by geovindu email:geovindu@163.com, All Rights Reserved.*/
import { loadJS, loadCSS } from 'markmap-common';
import { Transformer } from 'markmap-lib';
import * as markmap from 'markmap-view';// 定义类型
type LoadJS = (scripts: string[],options: { getMarkmap: () => typeof markmap }
) => Promise<void>;type LoadCSS = (styles: string[]) => void;// 创建转换器实例
export const transformer = new Transformer();
const { scripts, styles } = transformer.getAssets();// 加载资源
const loadJSWithType: LoadJS = (scripts, options) => {return loadJS(scripts, options);
};const loadCSSWithType: LoadCSS = (styles) => {loadCSS(styles);
};loadCSSWithType(styles);
loadJSWithType(scripts, { getMarkmap: () => markmap });

<!--* @creater: geovindu* @since: 2025-06-24 22:24:23* @LastAuthor: geovindu* @lastTime: 2025-06-24 22:39:38* @文件相对于项目的路径: \jsstudy\markmapdemo\src\views\VueComposition.vue* @message: geovindu* @IDE: vscode* @Development: node.js 20, vuejs3.0* @package:* @ISO: windows10* @database: mysql 8.0 sql server 2019 postgresSQL 16* Copyright (c) 2025 by geovindu email:geovindu@163.com, All Rights Reserved.
-->
<template><div class="flex-1"><textarea class="w-full h-full border border-gray-400" v-model="value" /></div><svg class="flex-1" ref="svgRef" /></template><script lang="ts" setup>import { ref, onMounted, onUpdated } from 'vue';import { Markmap } from 'markmap-view';import { transformer } from './markmap';// 定义类型type MarkmapInstance = Markmap;const initValue = `# 中国行政区划
## 北京市
### 市辖区
#### 东城区
##### 五道口街道
###### 教苑社区
- 林海花园
- 江海花园
- 学清苑小区
## 江西省
### 吉安市
#### 永丰县
##### 沿陂镇
###### 涂家村委
- 涂家村
- 艾家村
- 黄家村
## 广东省
### 深圳市
#### 罗湖区
##### 东晓街道
###### 兰心社区
- 江海花园
- 江心花园
- 兰亭国际
###### 田心社区
- 田心村
- 东晓花园
- 鹿鸣园
##### 桂园街道
###### 大塘龙社区
- 大塘龙小区
- 万科桂苑
- 天地大厦`;const svgRef = ref<SVGSVGElement | null>(null);const value = ref<string>(initValue);let mm: MarkmapInstance | null = null;const update = async () => {if (!mm || !svgRef.value) return;try {const { root } = transformer.transform(value.value);await mm.setData(root);mm.fit();} catch (error) {console.error('更新Markmap失败:', error);}};onMounted(() => {if (svgRef.value) {mm = Markmap.create(svgRef.value);update();}});onUpdated(update);</script><style scoped>textarea {font-family: monospace;font-size: 14px;}</style>
<!--* @creater: geovindu* @since: 2025-06-24 22:23:43* @LastAuthor: geovindu* @lastTime: 2025-06-24 22:37:14* @文件相对于项目的路径: \jsstudy\markmapdemo\src\views\VueLegacy.vue* @message: geovindu* @IDE: vscode* @Development: node.js 20, vuejs3.0* @package:* @ISO: windows10* @database: mysql 8.0 sql server 2019 postgresSQL 16* Copyright (c) 2025 by geovindu email:geovindu@163.com, All Rights Reserved.
-->
<template><div class="flex flex-col h-screen"><div class="flex-1 flex"><textareaclass="w-full h-full border border-gray-400 p-2"v-model="value"placeholder="输入 Markdown 内容..."/><svg ref="svgRef" class="w-full h-full border border-gray-400" /></div></div>
</template><script lang="ts" setup>
import { ref, onMounted, onUpdated, watch } from 'vue';
import { Markmap } from 'markmap-view';
import { transformer } from './markmap';// 定义类型
type MarkmapInstance = Markmap;// 初始值和状态
const initValue = `# 中国行政区划
## 北京市
### 市辖区
#### 东城区
##### 五道口街道
###### 教苑社区
- 林海花园
- 江海花园
- 学清苑小区
## 江西省
### 吉安市
#### 永丰县
##### 沿陂镇
###### 涂家村委
- 涂家村
- 艾家村
- 黄家村
## 广东省
### 深圳市
#### 罗湖区
##### 东晓街道
###### 兰心社区
- 江海花园
- 江心花园
- 兰亭国际
###### 田心社区
- 田心村
- 东晓花园
- 鹿鸣园
##### 桂园街道
###### 大塘龙社区
- 大塘龙小区
- 万科桂苑
- 天地大厦
`;const value = ref(initValue);
const svgRef = ref<SVGSVGElement | null>(null);
let mm: MarkmapInstance | null = null;// 更新 Markmap
const update = async () => {if (!mm || !svgRef.value || !value.value) return;try {const { root } = transformer.transform(value.value);await mm.setData(root);mm.fit();} catch (err) {console.error('更新 Markmap 失败:', err);}
};// 初始化 Markmap
onMounted(() => {if (svgRef.value) {mm = Markmap.create(svgRef.value);update();}
});// 监听值变化并更新 Markmap
watch(value, update);// 组件更新后调整 Markmap
onUpdated(() => {if (mm && svgRef.value) {mm.fit();}
});
</script><style scoped>
textarea {font-family: monospace;font-size: 14px;resize: none;
}
</style>
<!--* @creater: geovindu* @since: 2025-06-24 22:24:23* @LastAuthor: geovindu* @lastTime: 2025-06-24 22:43:26* @文件相对于项目的路径: \jsstudy\markmapdemo\src\views\displayview.vue* @message: geovindu* @IDE: vscode
*npm install markmap-lib
*npm install markmap-render
*npm install markmap-view
*npm install markmap-cli
*npm install markmap-toolbar
*npm install coc-markmap
* npm i markmap-autoloade* @Development: node.js 20, vuejs3.0* @package:* @ISO: windows10* @database: mysql 8.0 sql server 2019 postgresSQL 16* Copyright (c) 2025 by geovindu email:geovindu@163.com, All Rights Reserved.
-->
<template><div class="flex flex-col h-screen p-2"><select class="border border-gray-400" v-model="type"><option value="composition">Composition API</option><option value="legacy">Legacy</option></select><component :is="currentComponent" class="flex-1" /></div>
</template><script lang="ts" setup>
import { ref, computed } from 'vue';
import VueComposition from './VueComposition.vue';
import VueLegacy from './VueLegacy.vue';// 定义类型
type ComponentType = 'composition' | 'legacy';const type = ref<ComponentType>('composition');
const currentComponent = computed(() => {return {composition: VueComposition,legacy: VueLegacy,}[type.value];
});
</script><style scoped>
@import url('https://cdn.jsdelivr.net/npm/tailwindcss@2.2.0/dist/tailwind.min.css');select {padding: 0.5rem;font-size: 1rem;margin-bottom: 0.5rem;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88272.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚宽量化——股票时间序列函数

import matplotlib.pyplot as plt import pandas as pd from mpl_finance import candlestick2_ochl import mplfinance as mpf from unittest import TestCaseclass TestPandasKline(TestCase):#读取股票数据&#xff0c;画出K线图def testKLineChart(self):file_name "…

(一)代码随想录 - 数组

代码随想录 一. 数组的理论基础 概念&#xff1a;数组是存放在连续内存空间上的相同类型数据的集合 特点&#xff1a;&#xff08;1&#xff09;数组可以通过下标进行访问对应的数据并且下标是从0开始的 -> 随机访问&#xff1b;&#xff08;2&#xff09;数组内存空间的地…

Netty内存池核心PoolArena源码解析

PoolArena 是 Netty 内存池化机制的核心组件之一&#xff0c;它负责管理一整块或多块内存&#xff08;PoolChunk&#xff09;&#xff0c;并将这些内存分配给应用程序。每个 PoolArena 实例都与一个特定的线程相关联&#xff08;通过 PoolThreadCache&#xff09;&#xff0c;或…

echarts-for-react 日历热力图渲染导致白屏 踩坑记录

先说结果&#xff0c;补上了一行tooltip.trigger后能正常渲染了。 报错情况&#xff1a; 在页面中添加了一个日历热力图后&#xff0c;一渲染它就白屏&#xff0c;控制台报错如下&#xff1a; echarts-for-react版本是当前最新的3.0.2&#xff0c;尝试debug但没看懂源码这里是…

SpringBoot项目启动时自动加载数据到Redis的完整实现方案,用于存储字典,定时任务,登录用户等

一、基础配置 ‌在pom.xml中添加必要依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.baomi…

python:使用 OpenAI CLIP 模型进行图像与文本的语义匹配,并用彩虹色带可视化 CLIP 模型的相似度矩阵

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何使用 OpenAI 的 CLIP 模型来实现图像与文本之间的语义匹配。代码使用 Python 语言&#xff0c;加载多个图像与类别文本&#xff0c;并通过计算余弦相似度判断每张图片最匹配的文本标签。 结果如下图所示&#xff0c; 文章目录 …

微服务链路追踪在生产环境问题定位中的实战经验

微服务链路追踪在生产环境问题定位中的实战经验 在当今复杂的系统架构中&#xff0c;微服务之间相互调用形成的链路往往变得极其复杂。一旦出现问题&#xff0c;仅凭日志和监控信息常常难以迅速定位根因。链路追踪技术因此成为生产环境中不可或缺的工具&#xff0c;能够帮助我…

正点原子——直流无刷电机-霍尔传感基本实现流程

直流无刷电机-霍尔传感实现流程 初始化TIM以及IO 霍尔状态读取函数 uint32_t hallsersor(void) {uint32_t state 0;if(HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO,HALL_TIM_CH1_PIN)!RESET){state |0x01;}if(HAL_GPIO_ReadPin(HALL1_TIM_CH2_GPIO,HALL_TIM_CH2_PIN)!RESET){stat…

小白的进阶之路系列之十七----人工智能从初步到精通pytorch综合运用的讲解第十部分

NLP 从零开始:使用字符级 RNN 生成姓名 这是我们“NLP 从零开始”系列三部分教程中的第二部分。在第一个教程中,我们使用了 RNN 将姓名分类到其语言来源。这次我们将反过来,从语言生成姓名。 > python sample.py Russian RUS Rovakov Uantov Shavakov> python sampl…

思辨场域丨AR技术如何重塑未来学术会议体验?

毫无疑问&#xff0c;增强现实&#xff08;AR&#xff09;已成为科技浪潮中最澎湃的浪花之一。当Pokemon Go点燃全球热情&#xff0c;我们首次大规模体验到数字精灵与现实街景的奇妙交融。这不仅是游戏革命&#xff0c;更是一个强烈的信号&#xff1a;虚实共生的交互时代已轰然…

医学数据分析实战:冠心病发病因素可视化

一、数据加载与基本信息检查 #例9.5 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings#引入第三方库plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 warnings.filterwarnings(ignore) #防止…

Proteus8.0 打开前期版本的操作方法

1.打开Proteus8.0 2. 打开菜单File->Import legacy Project 3.在Import Legacy Project 点击Browse按钮 4.选择要打开的例子目录 5.打开*.dsn文件 6.点击Import 7.导入成功 点击运行即可

【innovus基础】- 对某根线单独route

在某些特殊需求场景&#xff0c;我们可能需要对某些net进行单独的route&#xff0c;方法如下&#xff1a; 1、打开design browser&#xff0c;选择对应net&#xff1a;&#xff08;或者使用selectNet命令&#xff09; 2、Route → nano Route → 勾选selectNet only 可以看到…

【Linux】network网络配置

目录 1、介绍2、网络配置【1】查看【2】说明 3、工作流程【1】启动以太网接口【2】关闭接口时反向执行 4、现代替换方案 1、介绍 linux中network网络服务的核心配置位于/etc/sysconfig/network-scripts/目录下。它们共同构成了网络接口的管理框架&#xff0c;负责处理网络接口…

深入解析 Taro 项目结构:从入门到精通

在现代前端开发中&#xff0c;跨平台开发框架变得越来越重要。Taro 作为一款由京东凹凸实验室推出的多端统一开发框架&#xff0c;支持编译到微信小程序、支付宝小程序、百度小程序、H5、React Native 等多个平台&#xff0c;极大地提高了开发效率。然而&#xff0c;要充分发挥…

零基础开始的网工之路第二十一天------系统安全基线和系统加固

目录 一、系统安全基线 1、账户与认证安全 2、文件与目录权限 3、SSH服务安全 4、网络与服务配置 5、日志与审计 6、内核参数加固 7、更新与补丁 8、安全模块配置 9、SUID/SGID文件检查 10、默认权限控制&#xff08;umask&#xff09; 二、系统安全加固 1、账户与…

Log4j 和 Log4j2的比较

以下是 Log4j&#xff08;通常指 Log4j 1.x&#xff09;与 Log4j2 的核心对比分析&#xff0c;结合架构、性能、功能及适用场景&#xff0c;帮助开发者做出合理选择&#xff1a; &#x1f4ca; 一、架构与设计 特性Log4j 1.xLog4j2分析架构模型单模块设计&#xff0c;耦合度高…

说说 Springboot 的启动流程?

Spring Boot 的启动流程是一个相对复杂但有序的过程&#xff0c;它涉及多个组件和步骤的协同工作。以下是 Spring Boot 启动流程的详细解析&#xff1a; 一、初始化阶段 启动入口 Spring Boot 应用的启动入口通常是一个包含 main 方法的类&#xff0c;该类上标注了 SpringBoot…

从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页

如果php.ini已经加入了如下的内容还是报错 &#xff1a; upload_max_filesize 1024M post_max_size 1024M 那就是因为阿帕奇导致&#xff1a;

10、java语法糖

编译期处理&#xff1a;语法糖&#xff08;即java编译器把。java的源码编译成。class字节码的过程中&#xff0c;自动生成和转换的一些代码&#xff0c;主要是为了减轻程序员的负担&#xff0c;算是java编译器给我们的一个额外福利-给糖吃&#xff09; 默认构造器&#xff1a;…