林小愚 發表於 2020-6-30 13:18:00

JsPlumb在react的使用方法及介绍

<h1 align="center"><strong>JsPlumb<span style="font-family: 宋体">在</span><span style="font-family: Calibri">react</span><span style="font-family: 宋体">的使用方法及介绍</span></strong></h1>
<h2><strong>一.相关资料来源:</strong></h2>
<p>1.<span style="text-decoration: underline">https://bitqiang.gitbooks.io/jsplumb/content/Chapter1_IMPORTS_AND_SETUP/</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;——— &nbsp;&nbsp;&nbsp;一个翻译一半就不能打开的文档</p>
<p>2.<span style="text-decoration: underline">https://github.com/wangduanduan/jsplumb-chinese-tutorial&nbsp;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;——— &nbsp;&nbsp;&nbsp;一个事件方法很全的网站(推荐)</p>
<p>3.<span style="text-decoration: underline">https://wdd.js.org/jsplumb-chinese-tutorial/#/&nbsp; </span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;——— &nbsp;&nbsp;&nbsp;一个事件方法很全的网站(同上)</p>
<p><span>4.https://www.cnblogs.com/Bryran/p/3950122.html&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>————— &nbsp;&nbsp;&nbsp;<span style="font-family: Calibri">jq ui </span><span style="font-family: 宋体">拖动</span></p>
<h2>二.<strong>引用库:</strong></h2>
<p><span style="font-family: 宋体">版本:</span>2.13.3</p>
<p>库:<span style="text-decoration: underline">https://github.com/jsplumb/jsplumb</span></p>
<p><span style="font-family: 宋体">链接:</span><span style="text-decoration: underline">https://pan.baidu.com/s/1EvftCI5gXRvoL6pNRenSpQ&nbsp;</span></p>
<p><span style="font-family: 宋体">提取码:</span>z2t4</p>
<p>React &nbsp;vue :&nbsp; &nbsp; npm&nbsp; &nbsp;i&nbsp; &nbsp;jsplumb</p>
<p><span style="font-family: 宋体">注意:低版本需要引用</span>jq <span style="font-family: 宋体">以及</span><span style="font-family: Calibri">jq-ui</span><span style="font-family: 宋体">,此版本不需要</span></p>
<h2>三.<strong><span style="font-family: 宋体">在</span>React<span style="font-family: 宋体">使用方法:</span></strong></h2>
<ol>
<li>
<h3><span style="font-family: 宋体">在我的</span>react<span style="font-family: 宋体">项目中,分菜单栏和画布,菜单栏是可拖动子菜单,将菜单拖到画布上,在画布上进行对子菜单项目的操作,大概是这样:</span></h3>
<h5><span style="font-family: 宋体"><img src="https://img2020.cnblogs.com/blog/1506521/202006/1506521-20200630124325887-1631724974.png" alt="" width="688" height="297" loading="lazy"></span></h5>
</li>
<li>
<h3><span style="font-family: 宋体">在使用过程中,应为拖动事件,和画图事件都是要先有</span>dom<span style="font-family: 宋体">节点</span><span style="font-family: Calibri">,</span><span style="font-family: 宋体">所以,一定要有节点的时候再注册相应的监听事件:</span></h3>
</li>
</ol>
<h4>&nbsp; &nbsp; &nbsp; &nbsp; a.&nbsp; &nbsp; React<span style="font-family: 宋体">项目中要在 </span><span style="font-family: Calibri">componentDidMount() </span><span style="font-family: 宋体">生命周期后开始操作,因为是单页面应用,要保证当前页面渲染完成后注册</span><span style="font-family: Calibri">jsplumb</span><span style="font-family: 宋体">实例,离开后要销毁实例所以</span></h4>
<div class="cnblogs_code">
<pre>let idePageJsPlumstance=<span style="color: rgba(0, 0, 0, 1)">’’;
</span><span style="color: rgba(0, 128, 0, 1)">    //</span><span style="color: rgba(0, 128, 0, 1)">初始化</span>
<span style="color: rgba(0, 0, 0, 1)">    componentDidMount() {
      idePageJsPlumstance </span>= jsPlumb.getInstance() <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关键函数 注册jsplumb实例</span>
      idePageJsPlumstance.setContainer ('flow-main')<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置面板</span>
<span style="color: rgba(0, 0, 0, 1)">    },
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">离开</span>
<span style="color: rgba(0, 0, 0, 1)">    componentWillUnmount() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (idePageJsPlumstance) {
            idePageJsPlumstance.clear() </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">清空</span>
<span style="color: rgba(0, 0, 0, 1)">      }
},</span></pre>
</div>
<h4>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;b.&nbsp; &nbsp; &nbsp;在左侧子菜单渲染完后要注册拖拽事件,这里用的是jq ui&nbsp;拖动 不熟悉的可以搜下jq ui&nbsp;&nbsp;这里这样写的:</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">给span注册拖动事件</span>
$('#flow-btns').find('span'<span style="color: rgba(0, 0, 0, 1)">).draggable({
                helper: </span>'clone',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拖动样式</span>
                zIndex: 11<span style="color: rgba(0, 0, 0, 1)">,
                scope: </span>'flowMainCanvas',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关键参数</span>
            })</pre>
</div>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(255, 0, 0, 1)">&nbsp; &nbsp; &nbsp; Scope&nbsp; //<span style="font-family: 宋体">关键参数,被拖动子菜单和拖动到面板要对应相同</span></span></p>
<h4>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.&nbsp; &nbsp;<span style="font-family: 宋体">在面板中,要获取位置生成新的</span>dom <span style="font-family: 宋体">对新</span><span style="font-family: Calibri">dom</span><span style="font-family: 宋体">注册事件</span><span style="font-family: Calibri">, </span><span style="font-family: 宋体">(此处以简写,具体方式根据实际项目来做)</span></h4>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">样式</span>
let endAllPointStyle=<span style="color: rgba(0, 0, 0, 1)">{
      endpoint: </span>'Dot', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">端点的形状</span>
      isSource: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否可以拖动(作为连线起点)</span>
      isTarget: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否可以放置(连线终点)</span>
<span style="color: rgba(0, 0, 0, 1)">}<br><span style="color: rgba(51, 153, 102, 1)">//画图</span>
$(</span>'#flow-main'<span style="color: rgba(0, 0, 0, 1)">).droppable ({
      scope: </span>'flowMainCanvas'<span style="color: rgba(0, 0, 0, 1)">,
      drop: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( event, ui ) {
      let left </span>=<span style="color: rgba(0, 0, 0, 1)"> parseInt ( ui.offset.left)
      let top </span>=<span style="color: rgba(0, 0, 0, 1)"> parseInt ( ui.offset.top)
      let id </span>=<span style="color: rgba(0, 0, 0, 1)"> ‘node12’
      let dom </span>= “&lt;span id=’+id+’ &gt;’+ui.helper.context.dataset.text+’&lt;/span&gt;”
      $ (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">).append (dom)
      dom.css (</span>'left', left).css ('top'<span style="color: rgba(0, 0, 0, 1)">, top)
      idePageJsPlumstance.addEndpoint ( id, {
          anchor:</span>"LeftMiddle"<span style="color: rgba(0, 0, 0, 1)">
      }, endAllPointStyle)
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册端点拖桶</span>
<span style="color: rgba(0, 0, 0, 1)">      idePageJsPlumstance.draggable ( id)
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注册节点拖动</span>
      $ ('#' +<span style="color: rgba(0, 0, 0, 1)"> id).draggable ({
             containment:</span>"parent"<span style="color: rgba(0, 0, 0, 1)">,
       })
}
})</span></pre>
</div>
<p>&nbsp;</p>
<h4>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d.&nbsp; &nbsp; &nbsp;同时要对线做一些事件,这里有</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接线的右键单击事件</span>
idePageJsPlumstance.bind ('contextmenu', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( conn, e ) {
      e.preventDefault ()
      e.stopPropagation ()
   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ....</span>
<span style="color: rgba(0, 0, 0, 1)">})

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接线的单击事件</span>
idePageJsPlumstance.bind ('mousedown', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( conn, e ) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ....</span>
<span style="color: rgba(0, 0, 0, 1)">})

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">开始拖动新连接时</span>
idePageJsPlumstance.bind ('beforeDrag', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( info ){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ....</span>
<span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 结束拖动新连接时</span>
idePageJsPlumstance.bind ('beforeDrop', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( info ){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ....</span>
<span style="color: rgba(0, 0, 0, 1)">}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接事件 注册线的参数</span>
idePageJsPlumstance.bind ('connection', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> ( info ) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ...</span>
<span style="color: rgba(0, 0, 0, 1)">})

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 开始拖动现有连接</span>
idePageJsPlumstance.bind('beforeStartDetach',<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (conn){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">/// ....</span>
<span style="color: rgba(0, 0, 0, 1)">})

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">页面线的dom</span>
const connectors =<span style="color: rgba(0, 0, 0, 1)">idePageJsPlumstance.getAllConnections ()

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除点,线 节点</span>
<span style="color: rgba(0, 0, 0, 1)">idePageJsPlumstance.detach(con)
idePageJsPlumstance.remove(id)
idePageJsPlumstance.removeAllEndpoints(id)</span></pre>
</div>
<p>&nbsp;</p>
<h3>3.&nbsp;&nbsp;<span style="font-family: 宋体">储存和 回显 重新代码生成操作</span></h3>
<p>&nbsp; a .&nbsp; 储存的话,先将拖动的新增节点信息保存,<span style="font-family: 宋体">比如</span>left 、id、 top <span style="font-family: 宋体">固定信息保存</span></p>
<p>&nbsp;<span style="font-family: 宋体">再将线保存</span> <span style="font-family: 宋体">线有五个参数</span> <span style="font-family: 宋体">通过遍历</span>idePageJsPlumstance.getAllConnections() //<span style="font-family: 宋体">线数据获取,保存线的</span><span style="font-family: Calibri">id、 sourceId、targetId </span><span style="font-family: 宋体">还有点锚点的起止位置参数</span></p>
<p>&nbsp; b .&nbsp; 重新代码生成&nbsp; &nbsp;&nbsp;<span style="font-family: 宋体">还原节点后</span></p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>idePageJsPlumstance.ready (<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
   idePageJsPlumstance.connect ({
            source: startKey,
            target:endKe,
            anchors: ,
            endpoint: </span>'Dot'<span style="color: rgba(0, 0, 0, 1)">,
            isSource: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            isTarget: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
   })
})</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;再注册相应的拖拽事件</p>
<h2>四.<strong>总结:</strong></h2>
<ol>
<li><span style="font-family: 宋体">代码回显时候显示连接线</span> <span style="font-family: 宋体">用</span>jsPlumb.connect()<span style="font-family: 宋体">,</span></li>
<li>在项目中每个锚点是层级关系,层级叠加要处理好,</li>
<li>在拖拽事件中,生成点,再连线,注意好相关顺序,顺序不一样,影响不一样,</li>
<li>有些事件参数不起作用,需要代码控制。</li>
<li><span style="font-family: 宋体">自带</span>zoom <span style="font-family: 宋体">要和位置等相结合使用,避免冒泡</span></li>
</ol>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    转载标明来路-博客园,
联系方式1763907618@qq.com<br><br>
来源:https://www.cnblogs.com/wangyongping/p/13213179.html
頁: [1]
查看完整版本: JsPlumb在react的使用方法及介绍