Vue根据富文本内容生成目录

页面内容根据v-html渲染,读取标签并生成目录树,最终使用el-tree展示

 首先贴一个生成树结构的代码,网上Copy得来

toTree(data){
    // 删除 所有 children,以防止多次调用
    data.forEach(function (item) {
      delete item.children;
    });

    // 将数据存储为 以 id 为 KEY 的 map 索引数据列
    var map = {};
    data.forEach(function (item) {
      map[item.id] = item;
    });
    var val = [];
    data.forEach(function (item) {
      // 以当前遍历项的pid,去map对象中找到索引的id
      var parent = map[item.p_id];
      // 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
      if (parent) {
        (parent.children || (parent.children = [])).push(item);
      } else {
        //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
        val.push(item);
      }
    });
    return val;
  }

然后封装生成Dom树的方法

/**
     * 生成目录
     * */
    makeToc(){
      if(process.client){
        this.$nextTick(() => {
          // 定义参与目录生成的标签
          const tocTags = ["H1","H2","H3","H4","H5","H6"];

          // 目录树结果
          const tocArr = [];

          // 获取所有标题标签
          const headDoms = Array.from(this.$refs.aContent.childNodes).filter(item => tocTags.includes(item.tagName));

          // 遍历标题标签
          headDoms.forEach((item,index,arr) => {
            // 给标题添加id
            item.id = `h-${index + 1}`;
            // 获取当前节点前面的节点
            let prevs = arr.filter((i,j) => j < index);
            // 过滤前面的节点为合理节点
            // 如 h3节点前  只能为 h1 h2 h3
            prevs = prevs.filter(i => tocTags.filter((i,j) => j <= tocTags.findIndex(i => i == item.tagName)).includes(i.tagName));
            // 对前面的节点进行排序,距离自身节点近的排在前面
            // 如 div > p > span > img  当前为img
            // 常规获取节点为 [div,p,span,img]
            // 排序后获取节点为 [img,span,p,div]
            prevs = prevs.sort((a,b) => -(a.id.replace('h-','')) - b.id.replace('h-',''));
            // 查询距离自身节点最近的不同于当前标签的节点
            const prev = prevs.find(i => i.tagName != item.tagName);

            tocArr.push({
              id:index + 1,// 抛出id
              tag:item.tagName,// 抛出标签名称
              label:item.innerText,// 抛出标题
              p_id:item.tagName == "H1" ? 0 : Number(prev.id.replace("h-",'')),// 抛出父级id
            })
          })

          // 使用上述方法生成树 最后在el-tree的data中使用 tocData即可
          this.tocData = this.toTree(tocArr);
        })
      }
    },

toTree方法基本不用改,makeToc方法少量改动即可! 

 嘿,愿你代码永无bug,人生永无坎坷!

嘿,愿你代码永无bug,人生永无坎坷!

嘿,愿你代码永无bug,人生永无坎坷!

嘿,愿你代码永无bug,人生永无坎坷!

嘿,愿你代码永无bug,人生永无坎坷!

嘿,愿你代码永无bug,人生永无坎坷!

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Vue3中实现富文本目录树的方法如下: 1. 首先,你需要安装并引入一个适用于Vue3的富文本编辑器插件,例如tinymce或quill。 2. 在Vue组件中,使用该富文本编辑器插件,并将其绑定到一个数据属性上,例如`content`。 3. 在组件中,创建一个用于存储目录树的数据属性,例如`treeData`。 4. 监听`content`数据属性的变化,当内容发生变化时,解析富文本内容,提取标题和对应的层级关系,生成目录树数据。 5. 在组件的模板中,使用递归组件或者循环遍历的方式,将目录树数据渲染成目录树的结构。 下面是一个示例代码: ```vue <template> <div> <div class="editor"> <rich-text-editor v-model="content" @change="handleContentChange"></rich-text-editor> </div> <div class="tree"> <tree-node :data="treeData"></tree-node> </div> </div> </template> <script> import RichTextEditor from 'tinymce' // 富文本编辑器插件 import TreeNode from './TreeNode.vue' // 目录树节点组件 export default { components: { RichTextEditor, TreeNode }, data() { return { content: '', // 富文本内容 treeData: [] // 目录树数据 } }, methods: { handleContentChange() { // 解析富文本内容生成目录树数据 // 这里需要根据具体的富文本编辑器插件进行解析 // 提取标题和对应的层级关系,生成目录树数据 // 将生成目录树数据赋值给treeData } } } </script> ``` 请注意,上述代码中的`rich-text-editor`和`tree-node`是示意组件,你需要根据具体的富文本编辑器插件和目录树组件进行替换。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端薛小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值