react 更新节点流程

react 更新节点流程

  1. 在进入页面,调用react.render方法接收jsx代码并且显示在界面中

  2. 实现界面更新,需要拿新节点和旧节点进行对比,找出差异部分,更新到页面中,实现页面的最小 化更新

  3. 在创建节点时候,新添加一个属性存储对应的virtual dom,
    在diff中,判断旧的virtual dom是否存在,
    节点类型相同时候
    如果不是旧节点,根据type推断是文本还是元素,文本使用updateTextNode更新内容,元素使用updateNodeElement方法进行更新节点,内部删除之前的事件处理函数,循环对象判断是不是新属性存不存在,属性被删除更新
    在diff中还需要循环递归调用diff方法对比对应的子元素和旧节点
    节点类型不同时候不需要进行比对,根据新的type类型和旧type类型不同且新dom的type不是function判断,
    只需要新的virtual dom对象生成新的dom对象,使用新的dom替换旧的dom就可以,使用createDOMElement方法

    在进行节点对比时,遵循同级节点比较,执行深度优先的顺序

  4. 节点删除在节点对比完成之后,然后分析那些节点需要被删除,删除的是一个范围,
    删除的就是在节点对比完成之后,旧节点多余新节点说明需要被删除
    在diff后,使用oldDOM.childNodes获取旧节点数量对比新的节点length

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 `bpmn-js` 库来显示 BPMN 流程图,并且结合 `bpmn-js-highlight` 插件来高亮当前节点。 首先,你需要安装 `bpmn-js` 和 `bpmn-js-highlight` 两个库: ``` npm install bpmn-js bpmn-js-highlight ``` 然后在你的 React 项目中引入它们: ```javascript import BpmnModeler from 'bpmn-js/lib/Modeler'; import BpmnViewer from 'bpmn-js/lib/Viewer'; import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'; import 'bpmn-js/dist/assets/diagram-js.css'; import 'bpmn-js-highlight/styles/highlight.css'; import bpmnHighlight from 'bpmn-js-highlight'; ``` 其中,`BpmnModeler` 是用于编辑 BPMN 流程图的组件,`BpmnViewer` 是用于显示 BPMN 流程图的组件。 接着在你的 React 组件中使用它们: ```javascript import React, { useEffect, useRef } from 'react'; const BpmnViewerComponent = ({ xml, activeElementId }) => { const containerRef = useRef(null); const viewerRef = useRef(null); useEffect(() => { if (containerRef.current) { viewerRef.current = new BpmnViewer({ container: containerRef.current, additionalModules: [ bpmnHighlight ] }); } }, []); useEffect(() => { if (viewerRef.current && xml) { viewerRef.current.importXML(xml, (err) => { if (err) { console.log('Error rendering BPMN', err); } else { const canvas = viewerRef.current.get('canvas'); const overlays = viewerRef.current.get('overlays'); canvas.zoom('fit-viewport'); if (activeElementId) { const element = viewerRef.current.get('elementRegistry').get(activeElementId); if (element) { overlays.add(activeElementId, 'highlight'); overlays.remove({ type: 'highlight', id: activeElementId }); } } } }); } }, [xml, activeElementId]); return ( <div className="bpmn-container" ref={containerRef}></div> ); }; ``` 其中,`xml` 是 BPMN 流程图的 XML 字符串,`activeElementId` 是要高亮的节点的 ID。 在 `useEffect` 中,我们初始化了 `BpmnViewer` 并且将其实例存储在 `viewerRef` 中。然后在第二个 `useEffect` 中,我们使用 `viewerRef.current.importXML` 方法来加载 BPMN 流程图,并且根据 `activeElementId` 高亮指定的节点。 最后,我们在组件中使用 `BpmnViewerComponent` 来显示 BPMN 流程图: ```jsx <BpmnViewerComponent xml={xml} activeElementId={activeElementId} /> ``` 其中,`xml` 和 `activeElementId` 是从组件的 props 中获取的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值