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

Posted 前端薛小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,人生永无坎坷!

以上是关于Vue根据富文本内容生成目录的主要内容,如果未能解决你的问题,请参考以下文章

Vue加载显示富文本内容

vue-quill-editor富文本编辑器使用步骤

tinymce富文本编辑器

tinymce富文本编辑器

vue安装富文本编辑器报错

跨平台应用开发进阶(五十一):HTML5(富文本内容)连续数字字母不自动换行问题分析及解决