v-md-editor高级使用之自定义目录

​ 官方给出的目录设置参见:https://code-farmer-i.github.io/vue-markdown-editor/zh/senior/toc.html#%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE

​ 在做实际使用中往往可能需要将目录结构独立出来,经过近一天的研究终于明白其实现逻辑,并将目录结构独立出来,支持独立渲染,独立处理目录点击事件,同时也兼容原来的点击事件处理逻辑。具体如下:

效果对比图

在这里插入图片描述

具体实现如下:

<!-- 注意组件的常规属性省略掉了 -->
<a-layout-sider >
  <a-tabs >
    <a-tab-pane key="1" tab="文件" >
      <!-- 省略 -->
    </a-tab-pane>
    <a-tab-pane key="2" tab = "大纲">
      <ScrollContainer>
        <!-- 1.渲染目录的代码,基本就是复制的源码,样式什么的都是用的其本身的
					关键点:a.定义目录项的点击事件handleNavClick
								 b.计算出目录项 fileTitles
				-->
        <ul class="v-md-editor__toc-nav">
          <li :style="{paddingLeft: `${indent * (item.indent)}px`}"
              @click="handleNavClick(item)"
              class="v-md-editor__toc-nav-item"
              v-for="item in fileTitles">
            <span class="v-md-editor__toc-nav-title">{{ item.title }}</span>
          </li>
        </ul>
      </ScrollContainer>
    </a-tab-pane>
  </a-tabs>
</a-layout-sider>
<a-layout-content >
  <div style="width: 100%;height:100%;"> 
    <!-- 2.mode使用纯预览模式 这个也影响点击事件的处理-->
    <v-md-editor mode="preview" ref="mdEditorRef"></v-md-editor>
  </div>
</a-layout-content>

<script lang="ts" setup >
  const fileTitles = ref<Array<any>>([]);
  const mdEditorRef = ref();
  
  // b.计算出目录项 fileTitles
  const updateToc = ()=>{
        const noteEditorObj = mdEditorRef.value;
    		// 注意:若不是纯预览模式,这个方法会出问题,没有这个没有具体研究。
    		// 计算目录项使用的是其原来的方式,所以没有兼容问题。
        let anchors = noteEditorObj.getPreviewScrollContainer().document.querySelectorAll(noteEditorObj.anchorsSelector);
        let titles = Array.from(anchors).filter(function (title) {
            return !!(title as any).innerText.trim();
        });
        if (!titles.length) {
            return;
        }

        let hTags = Array.from(new Set(titles.map(function (title) {
            return (title as any).tagName;
        }))).sort();
        titles = titles.map(function (el) {
            return {
                title: (el as any).innerText,
                lineIndex: (el as any).getAttribute("data-v-md-line"),
                indent: hTags.indexOf((el as any).tagName)
            };
        });
        fileTitles.value.splice(0);
        fileTitles.value.push(...titles); // 最终计算出目录项
    }
  
  // a.定义目录项的点击事件handleNavClick
  const handleNavClick = (currentNav)=>{
        console.log("currentNav",currentNav);
        const noteEditorObj = mdEditorRef.value;
    		// 取预览模式下滚动容器,非预览模式下获取的方式可能有差异.
        const previewScroller = noteEditorObj.$refs.previewScroller.$el.querySelector('.scrollbar__wrap');
        let target = noteEditorObj.$el.querySelector("[data-v-md-line=\"" + currentNav.lineIndex + "\"]");
    		// 调用原始的方式滚动的对应位置.
        noteEditorObj.$refs.preview.scrollToTarget({target: target,onScrollEnd:false,scrollContainer:previewScroller});
    };
</script>

总结实现步骤其实就两步:

  1. 计算出目录数据项
  2. 重新写目录项点击事件。

而以上两步其实要与其原生保持一致,所以需要找到其源码在复制过来进行响应的调整。在此基础上我们就可以在目录上做我们自己的处理了,如目录渲染的位置及样式,点击事件增加自己的业务逻辑等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web开发:ibatis的使用笔记

一、简介 ibatis是一个基于SQL映射支持Java和.NET的持久层框架&#xff1a; 1.如下所示id是对应程序的statement&#xff0c;resultClass需要填写SQL查询到的字段对应的类的命名空间类名&#xff08;DAO.QueryForList<实体类>&#xff09;&#xff0c;以此完成持久层和…

数据可视化作用探析

数据可视化是一种将数据转化为图表、图形或其他视觉形式的过程&#xff0c;旨在更直观、更易于理解地展示数据信息。它不仅仅是对数据的简单呈现&#xff0c;更是一种利用视觉化手段帮助人们理解数据、发现模式、分析趋势和做出决策的强大工具。今天&#xff0c;我就从可视化从…

电子元器件-电阻

电阻 采样限流定时保护上拉 链接: 另类方式讲电阻&#xff01; 采样 应用场景&#xff0c;如我们在调节汽车座椅的过程中&#xff0c;如果座椅的行程达到尽头&#xff0c;此时控制座椅运动的电机就会停止&#xff0c;因而导致电机的电流非常大。如果正常运转的电流为1A&#…

【AI】模型结构可视化工具Netron应用

随着AI模型的发展&#xff0c;模型的结构也变得越来越复杂&#xff0c;理解起来越来越困难&#xff0c;这时候能够画一张结构图就好了&#xff0c;就像我们在开发过程中用到的UML类图&#xff0c;能够直观看出不同层之间的关系&#xff0c;于是Netron就来了。 Netron支持神经网…

在qemu平台使用gdb调试程序

1、使用gdb在qemu上调试程序 1.1、第一步&#xff1a;在qemu上运行程序并开启gdb server qemu-system-riscv64 -nographic -machine virt -m 128M -smp 1 -kernel …/bin/test.elf -s -S 1.2、第二步&#xff1a;使用gdb客户端连接gdb server -x&#xff1a;指定gdb的配置文件…

EnlightenGAN论文阅读笔记

EnlightenGAN论文阅读笔记 论文是2019年IEEE的EnlightenGAN: Deep Light Enhancement without Paired Supervision.这篇论文是低光增强领域无监督学习的开山之作。 论文链接如下&#xff1a;arxiv.org/pdf/1906.06972.pdf 文章目录 EnlightenGAN论文阅读笔记出发点**出发点1**&…

竞赛保研 python图像检索系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python图像检索系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c…

【LeetCode刷题笔记(5)】【Python】【盛最多水的容器】【双指针】【中等】

文章目录 盛最多水的容器算法题描述示例示例 1示例 2 提示题意拆解 解决方案&#xff1a;【双指针】运行结果复杂度分析 结束语 盛最多水的容器 盛最多水的容器 算法题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (…

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

点赋网络科技:为什么喝咖啡的人更易获得成功?

喝咖啡的人更易获得成功&#xff0c;这一说法并非空穴来风。事实上&#xff0c;许多成功的人士会坦诚地告诉你&#xff0c;他们每天都会饮用咖啡以激发思维和提高工作效率。下面&#xff0c;湖北点赋网络科技将从咖啡的作用、研究数据和成功人士的经验&#xff0c;三个方面来阐…

鸿蒙HarmonyOS开发用什么语言

1.网上流行一句有中国底蕴的话&#xff1a;鸿蒙系统方舟框架盘古大模型。都方舟框架了肯定主推的是ArkUI框架。其实还能使用C、Java和Js开发。 2.从API8开始&#xff0c;Java语言已经从鸿蒙开发剔除了&#xff0c;而官方推荐的是ArkTs.下图是ArkTS与TS、JS的关系。 ArkTs 是TS的…

物联网AI 物联网平台学习之概述

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 万物简单IOT是一个集物联网教育、企业SaaS私有化部署的物联网服务平台&#xff0c;它集成了设备管理、数据安全通信、消息订阅、规则引擎等一系列物联网核心能力&#xff0c;支持设备数据上云以及海量设备数…

RK3568/RV1126/RV1109/RV1106 ISP调试方案

最近一直在做瑞芯微rv1126的开发&#xff0c;由于项目性质&#xff0c;与camera打的交道比较多&#xff0c;包括图像的采集&#xff0c;ISP处理&#xff0c;图像处理&#xff0c;H.264/H.265编解码等各个方面吧。学到了不少&#xff0c;在学习的过程中&#xff0c;也得到了不少…

Linux的权限(二)

目录 前言 文件类型和访问权限&#xff08;事物属性&#xff09; 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …

Linux的重定向

Linux中的重定向是将程序的输入流或输出流从默认的位置改变到指定的位置。可以使用特殊的符号来实现重定向操作。&#xff08;文中command代表命令&#xff09; &#xff08;1&#xff09;重定向命令列表 命令 说明 command > file …

DevEco Studio中配置代码片段

进入设置&#xff08;快捷键CtrlAltS&#xff09; 选择Editor > Live Templates 添加片段 其中 $END$ 代表光标首次出现位置 一定要选择适用语言&#xff01;&#xff01;&#xff01; 最后Apply > OK 即可&#xff0c;输入快捷命令回车即可快速生成代码片段。

【Anaconda】Ubuntu anaconda使用(新建环境、最小化安装Tensorflow, CUDA对应关系)

Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09; 文章目录 Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09;使用conda打包虚拟环境查看已创建的环境删除虚拟环境命令下运行.ipynb文件 清华源地址&#xff1a; https:…

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC&#xff1a;耗时极其不正常, 峰值200次&#xff0c;耗时7sFULL GC&#xff1a;不正常,次数为1但是频繁&#xff0c;STW 5s慢查询&#xff1a;存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…

小红书商品详情API:电商助力

一、引言 随着互联网的普及和电商行业的快速发展&#xff0c;消费者对于商品信息的获取方式也在不断变化。小红书作为一款以内容分享为主的社交电商平台&#xff0c;吸引了大量用户。为了满足用户对商品信息的快速获取需求&#xff0c;小红书提供了商品详情API接口。本文将探讨…

Linux 基本语句_15_Tcp并发服务器

原理&#xff1a; 利用父子进程。父进程接收客户端的连接请求&#xff0c;子进程处理客户端的数据处理操作&#xff0c;两者各施其职。最终实现能够多个客户端连接一个服务端的操作。 代码&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/…