当前位置: 首页 > news >正文

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.定义目录项的点击事件handleNavClickb.计算出目录项 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.计算出目录项 fileTitlesconst 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.定义目录项的点击事件handleNavClickconst 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. 重新写目录项点击事件。

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

相关文章:

  • SpringBoot 3.0 升级之 Swagger 升级
  • 鸿蒙小车之多任务调度实验
  • jetpack compose 学习(2)
  • Linux操作系统:开源的计算机革命
  • Ray RLlib User Guides:模型,处理器和动作分布
  • Java之方法引用
  • MySQL事务与MVCC详解
  • LeetCode Hot100 25.K个一组翻转链表
  • AI日报:麻省理工学院专家呼吁扩大人工智能治理和监管
  • Verilog Systemverilog define宏定义
  • web前端之中文输入法导致的高频事件、addEventListener、compositionstart、compositionend
  • HPM6750系列--第九篇 GPIO详解(基本操作)
  • Github与Gitlab
  • CentOS 7 部署 dnsmasq
  • jpa 修改信息拦截
  • [译]前端离线指南(上)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • JS 面试题总结
  • PAT A1092
  • Promise初体验
  • ReactNative开发常用的三方模块
  • spring cloud gateway 源码解析(4)跨域问题处理
  • TCP拥塞控制
  • yii2权限控制rbac之rule详细讲解
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 后端_MYSQL
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 听说你叫Java(二)–Servlet请求
  • 写给高年级小学生看的《Bash 指南》
  • 学习JavaScript数据结构与算法 — 树
  • 【云吞铺子】性能抖动剖析(二)
  • 移动端高清、多屏适配方案
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (转) 深度模型优化性能 调参
  • (转)h264中avc和flv数据的解析
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)可以带来幸福的一本书
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net 流——流的类型体系简单介绍
  • .NetCore项目nginx发布
  • .NET学习教程二——.net基础定义+VS常用设置
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [Apio2012]dispatching 左偏树
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [go] 策略模式
  • [IE技巧] 让IE 以全屏模式启动
  • [LeetCode]-使用特殊算法的题目-2
  • [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治