[Vue3 + TS + Vite] TipTap中遍历文档树所有节点,存储并设置所有标题

const load_headings = () => {
  const headings = [] as any[]
  if (!editor.value) return
  const transaction = editor.value.state.tr
  if (!transaction) return

/**
descendants 是一个用于遍历文档树中所有节点的方法。
它是一个迭代器,
可以用来访问文档中的每一个节点,包括文本节点和容器节点。

node 是当前遍历到的节点,
pos 是节点在文档中的位置,
而 parent 是节点的父节点

node.type.name 可以用来获取节点的类型名称,
node.textContent(或 node.text 对于纯文本节点)
则可以用来获取节点的文本内容。
**/
  editor.value?.state.doc.descendants((node, pos, parent) => {
    if (node.type.name === 'heading') {
      const start = pos
      const end = pos + node.content.size
      const id = `heading-${headings.length + 1}`
      if (node.attrs.id !== id) {
      	//使用事务来更新该节点的属性
      	//指定节点类型留空(undefined),只是更新节点的属性
        transaction?.setNodeMarkup(pos, undefined, {
          ...node.attrs,
          //添加或覆盖 id 属性
          id
        })
      }
	  //将标题的相关信息添加到 headings 数组中
      headings.push({
        level: node.attrs.level,
        text: node.textContent,
        start,
        end,
        id
      })
    }
  })

  //告诉编辑器不要将此事务添加到历史中
  transaction?.setMeta('addToHistory', false)
  //不要触发常规的视图更新(为了避免不必要的 UI 渲染)
  transaction?.setMeta('preventUpdate', true)
  //提交事务,这会应用所有的更改到文档状态
  editor.value?.view.dispatch(transaction)
  //将收集到的标题信息更新到全局状态或存储中
  use_editor_store.setHeadings(headings)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值