翻譯|使用教程|編輯:楊鵬連|2021-06-17 11:11:29.140|閱讀 441 次
概述:本教程演示了如何使用 flexbox 布局來(lái)排列 React 圖表庫(kù)附帶的各種圖表控件。我們將安排的控件是 DiagramView 、NodeListView、Ruler、Overview、Zoomer和Ruler。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
MindFusion.Diagramming for WinForms是一個(gè)能幫助你創(chuàng)建工作流和進(jìn)程圖表的.NET控件;數(shù)據(jù)庫(kù)實(shí)體關(guān)系圖表;組織圖表;對(duì)象層次和關(guān)系圖表;圖表和樹(shù)。它是基于對(duì)象-圖表框,表格和箭頭類(lèi)型,將其歸類(lèi)分派給其他并結(jié)合成復(fù)雜的結(jié)構(gòu)。該控件提供超過(guò)預(yù)先定義的50多種圖表框,如自定義設(shè)計(jì)樣式和對(duì)圖表框著色等。MindFusion.Diagramming for WinForms現(xiàn)已加入在線訂購(gòu),Standard Single Developer版本原價(jià)2848現(xiàn)在搶購(gòu)立享優(yōu)惠只需2345,立即查看詳情>>
點(diǎn)擊下載MindFusion.Diagramming for WinForms最新試用版
本教程演示了如何使用 flexbox 布局來(lái)排列 React 圖表庫(kù)附帶的各種圖表控件。我們將安排的控件是 DiagramView 、NodeListView、Ruler、Overview、Zoomer和Ruler。這是最終應(yīng)用程序的屏幕截圖:
 
	我們使用可從//www.npmjs.com/package/diagram-library-react獲得的 React 框架和 MindFusion 圖庫(kù)構(gòu)建我們的項(xiàng)目。
一、初始項(xiàng)目設(shè)置
	我們打開(kāi)一個(gè)終端并導(dǎo)航到我們要?jiǎng)?chuàng)建應(yīng)用程序的文件夾。我們使用 create-react-app 來(lái)初始化一個(gè)空的 React 應(yīng)用程序:
npx create-react-app flex-diagram正如您一樣,我們將應(yīng)用程序命名為 flex-diagram。初始 React 設(shè)置完成后,我們安裝圖表:
npm install diagram-library-react一旦我們完成了,我們就可以開(kāi)始編寫(xiě)我們的應(yīng)用程序了。我們添加一個(gè)新的 JavaScript 文件,我們將其命名為 DiagramApp.js。在其中我們首先導(dǎo)入默認(rèn)的 React 命名空間并聲明 Component 類(lèi)的成員導(dǎo)入。然后我們?cè)诿Q“mf”下聲明 MindFuson 圖表庫(kù)的默認(rèn)導(dǎo)入。最后,我們聲明我們打算使用的控件類(lèi)的成員導(dǎo)入:DiagramView、Overview、NodeListView、ZoomControl 和 Ruler:
import React, { Component } from 'react';
import mf from 'diagram-library';
import { DiagramView, Overview, NodeListView, ZoomControl, Ruler } from 'diagram-library-react';
然后我們可以創(chuàng)建我們的類(lèi) DagramApp,它擴(kuò)展了組件。我們需要一個(gè)構(gòu)造函數(shù),所以我們聲明一個(gè)。在其中我們創(chuàng)建了一個(gè)Diagram類(lèi)的實(shí)例,它代表了圖表。請(qǐng)注意,這不是用于呈現(xiàn)圖表的 React 類(lèi)的 DiagramView。這是交互式圖表,實(shí)際上是由DiagramView 渲染的。class DiagramApp extends Component {
  constructor(props) {
    super(props);
    // create the diagram
    var diagram = new mf.Diagramming.Diagram();
    ...........................
然后我們創(chuàng)建一個(gè)ShapeNode實(shí)例數(shù)組,它將被NodeListView控件使用。同樣,NodeListView是一個(gè)呈現(xiàn)節(jié)點(diǎn)的 UI 組件,但它不會(huì)創(chuàng)建它們。它們作為參數(shù)提供給它。var nodes = [];
    var shapes = ["Actor", "RoundRect", "Triangle", "Decision"];
    for (var i = 0; i < shapes.length; ++i) {
      var node = new mf.Diagramming.ShapeNode(diagram);
      node.setText(shapes[i]);
      node.setShape(shapes[i]);
      nodes.push(node);
 }
我們僅使用ShapeNode -s的 id-s 創(chuàng)建一個(gè)數(shù)組,我們也將其用作它們的標(biāo)簽。您可以在//www.mindfusion.eu/onlinehelp/jsdiagram/index.htm?CC_refTable_of_Predefined_Shapes_4.htm檢查可用的預(yù)定義ShapeNode -s的 id-s 。
	最后,我們需要在 React 狀態(tài)中存儲(chǔ)圖表,以及節(jié)點(diǎn)和形狀 id-s。當(dāng)我們?yōu)槲覀兊膽?yīng)用程序創(chuàng)建 HTML 時(shí),我們將需要它們。在 React 中,訪問(wèn)類(lèi)變量的方式是將它們存儲(chǔ)在狀態(tài)中。
    this.state = {
      diagram: diagram,
      nodes: nodes,
      captions: shapes
    };
二、使用 CSS 和 Flexbox 布局排列 UI
我們的 flexbox 布局具有以下結(jié)構(gòu):
 
	.container{
  display: flex;
  flex: 1 1 100%;
  min-height: 500px;
  flex-flow: row nowrap;
  background-color: azure;
  }
容器中的第一項(xiàng)是我們要將概覽和NodeListView控件放在一起的垂直列。此列需要保持固定大小。當(dāng)用戶調(diào)整頁(yè)面大小時(shí),我們不希望它調(diào)整大小。當(dāng)可用空間發(fā)生變化時(shí),必須調(diào)整中間的圖表。我們稱該列為“l(fā)eft-sidebar”并將其“flex-flow”設(shè)置為 column。如果可用空間太短,我們?cè)俅问褂?no wrap 來(lái)停止將兩個(gè)控件并排放置的布局。我們還將此元素的寬度固定為 200 像素,這很適合我們的控件。.left-sidebar{
  flex: 0 0 200px;
  display: flex;
  flex-flow: column nowrap;
  background-color: beige;
  }
我們希望概覽和NodeListView控件占用空間的方式有所不同。概覽需要固定的空間。我們希望為 NodeListView 提供額外的空間。這就是為什么我們?cè)偬砑右环N樣式來(lái)應(yīng)用它:.item {
  align-self: stretch;
  background-color:lightpink;
  flex: 1 1 300px;  
  }
我們將 1 作為 flex-grow 和 flex-shrink 的值,表示我們希望調(diào)整此元素的大小,而不是右列中的其他項(xiàng)目。
	我們現(xiàn)在準(zhǔn)備處理中間的圖表。在這里,重要的是要指出該元素將伸展以占據(jù)所有可用位置。而且,當(dāng)空間變小時(shí),必須收縮的就是這個(gè)項(xiàng)目:
.center-area {
     align-self: stretch;
     background-color:chartreuse;
     flex: 10 10 500px;
     max-height: 800px;
     overflow: hidden;
}
我們?yōu)?flex-grow 和 'flex-shrink' 屬性設(shè)置大值,并將 flex-basis 設(shè)置為 500 像素。我們必須將圖表的高度限制為 800 像素,因?yàn)樗赡軙?huì)變得很長(zhǎng)。'align-self' 的重要屬性,它應(yīng)用于由 flexbox 容器排列的項(xiàng)目,而不是容器本身。在這里,我們使用此屬性告訴圖表在空間可用時(shí)自行拉伸。隱藏溢出屬性以避免在大圖中呈現(xiàn)不必要的滾動(dòng)條。
	最后,右側(cè)邊欄將托管縮放控件。它類(lèi)似于左側(cè)邊欄,但它沒(méi)有像 NodeListView 這樣的“特殊”項(xiàng)。Zoom 控件是一個(gè)固定大小的 UI 控件,不需要特殊處理。如果窗口太大,我們只需要確保沒(méi)有額外的空間被轉(zhuǎn)移到它上面:
.right-sidebar{
  flex: 0 0 50px;
  background-color: lavender;  
  }
這是我們需要定義的最后一個(gè)元素的最后一個(gè)樣式。現(xiàn)在我們準(zhǔn)備將這些樣式應(yīng)用到真正的 React 組件并安排它們。
三、“渲染”方法
	我們?cè)谛碌?DiagramApp React 組件的 'render' 方法中聲明的第一件事是一些屬性:
 var props = {
      "id": "diagram1",
      "linkHeadShapeSize": 2,
      "routeLinks": true,
      "roundedLinks": true,
      "backBrush": "#e0e9e9"
    };
這些是Diagram實(shí)例的屬性,我們將通過(guò) JavaScrpt 展開(kāi)運(yùn)算符提供它們。然后在 return 語(yǔ)句中我們首先聲明容器 div 元素。它的風(fēng)格是“容器”。在其中我們聲明了左側(cè)邊欄,它將包含概覽和 NodeListView。我們也聲明它們:return (      
        <div className="container">
         
            <div className="left-sidebar">
           
              <Overview diagram={this.state.diagram}></Overview>  
  <NodeListView className="item" 
                nodes={this.state.nodes}
                captions={this.state.captions}
              ></NodeListView>        
             
             
            </div>            
        </div>      
    );
該概述被綁定到圖中,我們堅(jiān)持國(guó)家目標(biāo)。該NodeListView需要與節(jié)點(diǎn)和標(biāo)題列表,如果我們要加強(qiáng)對(duì)節(jié)點(diǎn)字幕。我們想要并且我們已經(jīng)將節(jié)點(diǎn)和標(biāo)題存儲(chǔ)在狀態(tài)中。
	之后輪到圖表。它將占據(jù)中心區(qū)域,它的類(lèi)是“中心區(qū)域”。除了圖表之外,我們還將使用標(biāo)尺控件。我們首先放置它并將圖表嵌套在其中。我們使用擴(kuò)展運(yùn)算符將屬性分配給圖表,我們?cè)诜椒ㄩ_(kāi)始時(shí)初始化了這些屬性。
<div className="center-area">              
            <Ruler style={{ width: "100%", height:"800px" }}>
                <DiagramView diagram={this.state.diagram} 
                  {...props}
                  />
            </Ruler>
            </div>
最后,我們聲明右側(cè)邊欄,其中包含縮放控件。Zoom 控件還需要綁定到一個(gè)圖表實(shí)例,我們使用 state 來(lái)獲取對(duì)我們圖表的引用:          <div className="right-sidebar">
          <ZoomControl diagram={this.state.diagram}></ZoomControl>        
        </div>
這樣我們的組件就準(zhǔn)備好了。我們只需要將它放在 index.js 而不是默認(rèn)的 App 組件中:import DiagramApp from './DiagramApp';
ReactDOM.render(
 
    ,
  document.getElementById('root')
);
我們可以用npm start然后您可以在本地主機(jī)的端口 3000 上看到您的應(yīng)用程序。
對(duì)于技術(shù)問(wèn)題,請(qǐng)使用 JS Diagram 論壇:https : //mindfusion.eu/Forum/YaBB.pl?board=jsdiag_disc
	關(guān)于 JavaScript 圖表:這個(gè)原生 JavaScript 庫(kù)使開(kāi)發(fā)人員能夠創(chuàng)建和自定義任何類(lèi)型的圖表、決策樹(shù)、流程圖、類(lèi)層次結(jié)構(gòu)、圖形、譜系樹(shù)、BPMN 圖等等。該控件提供豐富的事件集、眾多自定義選項(xiàng)、動(dòng)畫(huà)、圖形操作、樣式和主題。您有 100 多個(gè)預(yù)定義節(jié)點(diǎn)、表節(jié)點(diǎn)和 15 多種自動(dòng)布局算法。在//mindfusion.eu/javascript-diagram.html 上了解有關(guān) JavaScript 圖表的更多信息。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: