javascript – 在ReactJs中使用GoJs

我试图在React Js中为NLP / POS-tagger项目创建一个解析器树.我发现GoJs提供了一个很酷的解析器树 GoJs-parser-tree,但是我找不到react js实现的文档.我尝试了一些例子,但我无法使用它反应继承我的代码,我需要在反应中使用它
<!DOCTYPE html>
<html>
<head>
<title>Parse Tree</title>
<Meta name="description" content="A collapsible tree layout with all of the leaf nodes at the same layer." />
  <!-- Copyright 1998-2016 by Northwoods Software Corporation. -->
  <Meta charset="UTF-8">
  <script src="go.js"></script>
  <link href="../assets/css/goSamples.css" rel="stylesheet" type="text/css" />  <!-- you don't need to use this -->
  <script src="goSamples.js"></script>  <!-- this is only for the GoJS Samples framework -->
  <script id="code">
    function init() {
      if (window.goSamples) goSamples();  // init for these samples -- you don't need to call this
      var $= go.GraphObject.make;  // for conciseness in defining templates
      myDiagram =
        $(go.Diagram,"myDiagramDiv",{
            allowCopy: false,allowDelete: false,allowMove: false,initialContentAlignment: go.Spot.Center,initialAutoScale: go.Diagram.Uniform,layout:
              $(FlatTreeLayout,// custom Layout,defined below
                { angle: 90,compaction: go.TreeLayout.CompactionNone }),"undoManager.isEnabled": true
          });

      myDiagram.nodeTemplate =
        $(go.Node,"Vertical",{ selectionObjectName: "BODY" },$(go.Panel,"Auto",{ name: "BODY" },$(go.Shape,"RoundedRectangle",new go.Binding("fill"),new go.Binding("stroke")),$(go.TextBlock,{ font: "bold 12pt Arial,sans-serif",margin: new go.Margin(4,2,2) },new go.Binding("text"))
          ),// this is underneath the "BODY"
            { height: 15 },// always this height,even if the TreeExpanderButton is not visible
            $("TreeExpanderButton")
          )
        );

      myDiagram.linkTemplate =
        $(go.Link,{ strokeWidth: 1.5 }));

      // set up the nodeDataArray,describing each part of the sentence
      var nodeDataArray = [
        { key: 1,text: "Sentence",fill: "#f68c06",stroke: "#4d90fe" },{ key: 2,text: "NP",stroke: "#4d90fe",parent: 1 },{ key: 3,text: "DT",fill: "#ccc",parent: 2 },{ key: 4,text: "A",fill: "#f8f8f8",parent: 3 },{ key: 5,text: "JJ",{ key: 6,text: "rare",parent: 5 },{ key: 7,{ key: 8,text: "black",parent: 7 },{ key: 9,text: "NN",{ key: 10,text: "squirrel",parent: 9 },{ key: 11,text: "VP",{ key: 12,text: "VBZ",parent: 11 },{ key: 13,text: "has",parent: 12 },{ key: 14,{ key: 15,text: "VBN",parent: 14 },{ key: 16,text: "become",parent: 15 },{ key: 17,{ key: 18,parent: 17 },{ key: 19,parent: 18 },{ key: 20,text: "a",parent: 19 },{ key: 21,{ key: 22,text: "regular",parent: 21 },{ key: 23,{ key: 24,text: "visitor",parent: 23 },{ key: 25,text: "PP",{ key: 26,text: "TO",parent: 25 },{ key: 27,text: "to",parent: 26 },{ key: 28,{ key: 29,parent: 28 },{ key: 30,parent: 29 },{ key: 31,{ key: 32,text: "suburban",parent: 31 },{ key: 33,{ key: 34,text: "garden",parent: 33 },{ key: 35,text: ".",{ key: 36,parent: 35 }
      ]

      // create the Model with data for the tree,and assign to the Diagram
      myDiagram.model =
        $(go.TreeModel,{ nodeDataArray: nodeDataArray });
    }

    // Customize the TreeLayout to position all of the leaf nodes at the same vertical Y position.
    function FlatTreeLayout() {
      go.TreeLayout.call(this);  // call base constructor
    }
    go.Diagram.inherit(FlatTreeLayout,go.TreeLayout);

    // This assumes the TreeLayout.angle is 90 -- growing downward
    /** @override */
    FlatTreeLayout.prototype.commitLayout = function() {
      go.TreeLayout.prototype.commitLayout.call(this);  // call base method first
      // find maximum Y position of all Nodes
      var y = -Infinity;
      this.network.vertexes.each(function(v) {
          y = Math.max(y,v.node.position.y);
        });
      // move down all leaf nodes to that Y position,but keeping their X position
      this.network.vertexes.each(function(v) {
          var node = v.node;
          if (node.isTreeLeaf) {
            node.position = new go.Point(node.position.x,y);
          }
        });
    };
    // end FlatTreeLayout
  </script>
</head>
<body onload="init()">
<div id="sample">
  <h3>GoJS Parse Tree</h3>
  <div id="myDiagramDiv" style="border: solid 1px black; width:100%; height:500px"></div>
  <p>A <em>parse tree</em> is an ordered,rooted tree representing the structure of a sentence,broken down to parts-of-speech.</p>
  <p>
    This diagram uses a custom <a>TreeLayout</a> called <b>FlatTreeLayout</b> that places all leaf nodes at the same Y position.
    It also makes use of a <b>TreeExpanderButton</b> on the node template. See the <a href="../intro/buttons.html">Intro page on Buttons</a> for more GoJS button information.
  </p>
  <p>
    The abbreviations used in this diagram are:
    <ul>
      <li><b>NP</b>,a noun phrase</li>
      <li><b>VP</b>,a verb phrase</li>
      <li><b>PP</b>,a prepositional phrase</li>
      <li><b>DT</b>,a determiner</li>
      <li><b>JJ</b>,an adjective</li>
      <li><b>NN</b>,a common noun</li>
      <li><b>VBZ</b>,a third person singular present verb</li>
      <li><b>VBN</b>,a past participle verb</li>
    </ul>
  </p>
</div>
</body>
</html>

这个我尝试使用它时得到的代码作出反应

import React,{Component} from 'react';
import go from 'gojs';
const goObj = go.GraphObject.make;

export default class GoJs extends Component {
  constructor (props) {
    super (props);

    this.renderCanvas = this.renderCanvas.bind (this);

    this.state = {myModel: null,myDiagram: null}
  }

  renderCanvas () {
    let model = goObj (go.TreeModel);
    let diagram = goObj (go.Diagram,this.refs.goJsDiv,{initialContentAlignment: go.Spot.Center});
    this.setState({myModel: model,myDiagram: diagram},() => {
        model.nodeDataArray = this.props.data;
        diagram.model = model;
        this.setState({myModel: model,myDiagram: diagram});
      }
    );
  }

  componentDidMount () {
    this.renderCanvas ();
  }

  componentWillUpdate (prevProps) {
    if (this.props.data !== prevProps.data) {
      console.log ('Updating');
      const model = this.state.myModel;
      const diagram = this.state.myDiagram;
      model.nodeDataArray = this.props.data;
      diagram.model = model;
      this.setState({myModel: model,myDiagram: diagram});
    }
  }

  render () {
    return <div ref="goJsDiv" style={{'width': '500px','height': '500px','backgroundColor': '#DAE4E4'}}></div>;
  }
}

GoJs.propTypes = { data: React.PropTypes.string.isrequired };
GoJs.defaultProps = { data: '[]' };

我无法弄清楚什么是丢失的,而我从这里得到的输出是一团糟.

解决方法

在这里和那里花了几个小时更改代码后,我设法制作了所需的内容,这是我的最终代码
import React,myDiagram: null}
  }

  renderCanvas () {

  function FlatTreeLayout () {
     go.TreeLayout.call(this);  // call base constructor
   }
   go.Diagram.inherit(FlatTreeLayout,go.TreeLayout);

   // This assumes the TreeLayout.angle is 90 -- growing downward
   /** @override */
   FlatTreeLayout.prototype.commitLayout = function () {
     go.TreeLayout.prototype.commitLayout.call(this);  // call base method first
     // find maximum Y position of all Nodes
     var y = -Infinity;
     this.network.vertexes.each(function(v) {
         y = Math.max(y,v.node.position.y);
       });
     // move down all leaf nodes to that Y position,but keeping their X position
     this.network.vertexes.each(function(v) {
         var node = v.node;
         if (node.isTreeLeaf) {
           node.position = new go.Point(node.position.x,y);
         }
       });
   };

    let model = goObj (go.TreeModel);
    let diagram = goObj (go.Diagram,{
               allowCopy: false,layout:
                 goObj(FlatTreeLayout,defined below
                   { angle: 90,"undoManager.isEnabled": true
             });

             diagram.nodeTemplate = goObj(go.Node,goObj(go.Panel,goObj(go.Shape,goObj(go.TextBlock,new go.Binding("text"))
                      ),// this is underneath the "BODY"
                        { height: 15 },even if the TreeExpanderButton is not visible
                        goObj("TreeExpanderButton")
                      )
                    );

             diagram.linkTemplate = goObj(go.Link,{ strokeWidth: 1.5 }));

    this.setState({myModel: model,myDiagram: diagram});
      }
    );

  }



  componentDidMount () {
    this.renderCanvas ();
  }

  componentWillUpdate (prevProps) {
    if (this.props.data !== prevProps.data) {
      console.log ('Updating');
      const model = this.state.myModel;
      const diagram = this.state.myDiagram;
      model.nodeDataArray = this.props.data;
      diagram.model = model;
      this.setState({myModel: model,'backgroundColor': '#DAE4E4'}}></div>;
  }
}

GoJs.propTypes = { data: React.PropTypes.string.isrequired };
GoJs.defaultProps = { data: '[]' };

由于它是一个dum组件,我们必须通过props从父组件传递数据.

来自父组件

render(){
     return(
       <div>
         <PTagBox data={nodeDataArray}/>
       </div>
     );
   }

其中PTagBox是哑或子组件

相关文章

事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支持第三个参数...
js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其他强类型语言...
什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源...
@ &quot;TOC&quot; 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是须知的必须有...
搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图, :视图模...
首先我们需要一个html代码的框架如下: 我们的目的是实现ul中的内容进行横向的一点一点滚动。ul中的内容...