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

vue3项目实践心得-多次渲染同一svg + 理解v-if、transition、dom加载之间的顺序

🧡🧡需求🧡🧡

未点击查看答案按钮时,步骤3面板未展示内容(v-if控制)
在这里插入图片描述

点击查看答案按钮后,通过graphviz绘制并展示状态转换图,渲染在步骤2中,同时步骤3的v-if变为true,渲染出内容并且也渲染展示这张图
在这里插入图片描述

🧡🧡遇到的问题🧡🧡

  • 渲染重复性:前端通过vue-graphviz库 使用svg渲染 后端传来的dot_str,从而绘制出这张svg状态转换图,问题出现在项目中需要展示两个同样svg,由于它们的id相同,根据共享原则,导致只渲染了一个
  • 渲染时机:涉及v-if、transition、添加dom节点的操作,时机不对导致步骤3的svg图渲染不出来

🧡🧡解决思路🧡🧡

  • 对于渲染重复性问题:利用cloneNode函数,复制一个新的svg,从而添加dom节点
	 const svg = viz.renderSVGElement(draw_dot['NFA'][0])
	 const svgClone = svg.cloneNode(true)
	 NFAs.value[0].appendChild(svg)
	 NFAs.value[1].appendChild(svgClone)
  • 对于渲染时机:掌握vue3 transition文档中描述的enter钩子,应当确保v-if渲染后的dom生成后,再调用渲染函数(添加svg dom),之后再开始进行transiton过渡
    在这里插入图片描述
const handleStep3_TransEnter = (el:Element, done:()=>void) => {
    // console.log(NFAs.value)
    // console.log('step333333333333333333')
    
    if(!step3_open.value) return done()
    // console.log(222)
    // 此时元素已插入 DOM
    nextTick().then(() => {
      // console.log(NFAs.value)
      // 确保 ref 已收集
      if (NFAs.value.length >= 2) {
        instance().then(viz => {
          const svg = viz.renderSVGElement(draw_dot['NFA'][0])
          const svgClone = svg.cloneNode(true)
          
          NFAs.value[0].appendChild(svg)
          NFAs.value[1].appendChild(svgClone)
          draw_dot['NFA'][1] = true
        })
      }
    })
}

http://www.kler.cn/a/552391.html

相关文章:

  • 详解AbstractQueuedSynchronizer(AQS)源码
  • ubantu安装skywalking10.0.0
  • 人工智能 - 脑机融合:人类脑组织操控机器人,具身智能时代的革命性突破
  • Java编程语言:从基础到高级应用的全面探索
  • 构建高效矩阵系统:技术与策略全解析(可OEM)
  • 萃取的实现(三)
  • 【CSS】部分div禁用tailwindcss
  • 【Linux】(32)详解命名管道 | 日志管理 | 进程池2.0
  • WordPress自助建站全攻略
  • 快速排序C++模板,面试常考需背熟
  • 初探ai利用图片生成前端代码
  • 无人机飞手培训机构招生宣传技术详解
  • langchain本地知识库问答机器人集成本地知识库
  • vue前端可视化大屏页面适配方案
  • torch使用心得
  • pyqt 调用颜色选择器
  • 蚁剑(AutSword)的下载安装与报错解决
  • 【git】通过 rebase 合并分支
  • Python高级语法之urllib
  • MAVSDK - Custom Mavlink处理