javascript – 在ReactJs中使用GoJs

前端之家收集整理的这篇文章主要介绍了javascript – 在ReactJs中使用GoJs前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在React Js中为NLP / POS-tagger项目创建一个解析器树.我发现GoJs提供了一个很酷的解析器树 GoJs-parser-tree,但是我找不到react js实现的文档.我尝试了一些例子,但我无法使用它反应继承我的代码,我需要在反应中使用它
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Parse Tree</title>
  5. <Meta name="description" content="A collapsible tree layout with all of the leaf nodes at the same layer." />
  6. <!-- Copyright 1998-2016 by Northwoods Software Corporation. -->
  7. <Meta charset="UTF-8">
  8. <script src="go.js"></script>
  9. <link href="../assets/css/goSamples.css" rel="stylesheet" type="text/css" /> <!-- you don't need to use this -->
  10. <script src="goSamples.js"></script> <!-- this is only for the GoJS Samples framework -->
  11. <script id="code">
  12. function init() {
  13. if (window.goSamples) goSamples(); // init for these samples -- you don't need to call this
  14. var $= go.GraphObject.make; // for conciseness in defining templates
  15. myDiagram =
  16. $(go.Diagram,"myDiagramDiv",{
  17. allowCopy: false,allowDelete: false,allowMove: false,initialContentAlignment: go.Spot.Center,initialAutoScale: go.Diagram.Uniform,layout:
  18. $(FlatTreeLayout,// custom Layout,defined below
  19. { angle: 90,compaction: go.TreeLayout.CompactionNone }),"undoManager.isEnabled": true
  20. });
  21.  
  22. myDiagram.nodeTemplate =
  23. $(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"))
  24. ),// this is underneath the "BODY"
  25. { height: 15 },// always this height,even if the TreeExpanderButton is not visible
  26. $("TreeExpanderButton")
  27. )
  28. );
  29.  
  30. myDiagram.linkTemplate =
  31. $(go.Link,{ strokeWidth: 1.5 }));
  32.  
  33. // set up the nodeDataArray,describing each part of the sentence
  34. var nodeDataArray = [
  35. { 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 }
  36. ]
  37.  
  38. // create the Model with data for the tree,and assign to the Diagram
  39. myDiagram.model =
  40. $(go.TreeModel,{ nodeDataArray: nodeDataArray });
  41. }
  42.  
  43. // Customize the TreeLayout to position all of the leaf nodes at the same vertical Y position.
  44. function FlatTreeLayout() {
  45. go.TreeLayout.call(this); // call base constructor
  46. }
  47. go.Diagram.inherit(FlatTreeLayout,go.TreeLayout);
  48.  
  49. // This assumes the TreeLayout.angle is 90 -- growing downward
  50. /** @override */
  51. FlatTreeLayout.prototype.commitLayout = function() {
  52. go.TreeLayout.prototype.commitLayout.call(this); // call base method first
  53. // find maximum Y position of all Nodes
  54. var y = -Infinity;
  55. this.network.vertexes.each(function(v) {
  56. y = Math.max(y,v.node.position.y);
  57. });
  58. // move down all leaf nodes to that Y position,but keeping their X position
  59. this.network.vertexes.each(function(v) {
  60. var node = v.node;
  61. if (node.isTreeLeaf) {
  62. node.position = new go.Point(node.position.x,y);
  63. }
  64. });
  65. };
  66. // end FlatTreeLayout
  67. </script>
  68. </head>
  69. <body onload="init()">
  70. <div id="sample">
  71. <h3>GoJS Parse Tree</h3>
  72. <div id="myDiagramDiv" style="border: solid 1px black; width:100%; height:500px"></div>
  73. <p>A <em>parse tree</em> is an ordered,rooted tree representing the structure of a sentence,broken down to parts-of-speech.</p>
  74. <p>
  75. This diagram uses a custom <a>TreeLayout</a> called <b>FlatTreeLayout</b> that places all leaf nodes at the same Y position.
  76. 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.
  77. </p>
  78. <p>
  79. The abbreviations used in this diagram are:
  80. <ul>
  81. <li><b>NP</b>,a noun phrase</li>
  82. <li><b>VP</b>,a verb phrase</li>
  83. <li><b>PP</b>,a prepositional phrase</li>
  84. <li><b>DT</b>,a determiner</li>
  85. <li><b>JJ</b>,an adjective</li>
  86. <li><b>NN</b>,a common noun</li>
  87. <li><b>VBZ</b>,a third person singular present verb</li>
  88. <li><b>VBN</b>,a past participle verb</li>
  89. </ul>
  90. </p>
  91. </div>
  92. </body>
  93. </html>

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

  1. import React,{Component} from 'react';
  2. import go from 'gojs';
  3. const goObj = go.GraphObject.make;
  4.  
  5. export default class GoJs extends Component {
  6. constructor (props) {
  7. super (props);
  8.  
  9. this.renderCanvas = this.renderCanvas.bind (this);
  10.  
  11. this.state = {myModel: null,myDiagram: null}
  12. }
  13.  
  14. renderCanvas () {
  15. let model = goObj (go.TreeModel);
  16. let diagram = goObj (go.Diagram,this.refs.goJsDiv,{initialContentAlignment: go.Spot.Center});
  17. this.setState({myModel: model,myDiagram: diagram},() => {
  18. model.nodeDataArray = this.props.data;
  19. diagram.model = model;
  20. this.setState({myModel: model,myDiagram: diagram});
  21. }
  22. );
  23. }
  24.  
  25. componentDidMount () {
  26. this.renderCanvas ();
  27. }
  28.  
  29. componentWillUpdate (prevProps) {
  30. if (this.props.data !== prevProps.data) {
  31. console.log ('Updating');
  32. const model = this.state.myModel;
  33. const diagram = this.state.myDiagram;
  34. model.nodeDataArray = this.props.data;
  35. diagram.model = model;
  36. this.setState({myModel: model,myDiagram: diagram});
  37. }
  38. }
  39.  
  40. render () {
  41. return <div ref="goJsDiv" style={{'width': '500px','height': '500px','backgroundColor': '#DAE4E4'}}></div>;
  42. }
  43. }
  44.  
  45. GoJs.propTypes = { data: React.PropTypes.string.isrequired };
  46. GoJs.defaultProps = { data: '[]' };

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

解决方法

在这里和那里花了几个小时更改代码后,我设法制作了所需的内容,这是我的最终代码
  1. import React,myDiagram: null}
  2. }
  3.  
  4. renderCanvas () {
  5.  
  6. function FlatTreeLayout () {
  7. go.TreeLayout.call(this); // call base constructor
  8. }
  9. go.Diagram.inherit(FlatTreeLayout,go.TreeLayout);
  10.  
  11. // This assumes the TreeLayout.angle is 90 -- growing downward
  12. /** @override */
  13. FlatTreeLayout.prototype.commitLayout = function () {
  14. go.TreeLayout.prototype.commitLayout.call(this); // call base method first
  15. // find maximum Y position of all Nodes
  16. var y = -Infinity;
  17. this.network.vertexes.each(function(v) {
  18. y = Math.max(y,v.node.position.y);
  19. });
  20. // move down all leaf nodes to that Y position,but keeping their X position
  21. this.network.vertexes.each(function(v) {
  22. var node = v.node;
  23. if (node.isTreeLeaf) {
  24. node.position = new go.Point(node.position.x,y);
  25. }
  26. });
  27. };
  28.  
  29. let model = goObj (go.TreeModel);
  30. let diagram = goObj (go.Diagram,{
  31. allowCopy: false,layout:
  32. goObj(FlatTreeLayout,defined below
  33. { angle: 90,"undoManager.isEnabled": true
  34. });
  35.  
  36. diagram.nodeTemplate = goObj(go.Node,goObj(go.Panel,goObj(go.Shape,goObj(go.TextBlock,new go.Binding("text"))
  37. ),// this is underneath the "BODY"
  38. { height: 15 },even if the TreeExpanderButton is not visible
  39. goObj("TreeExpanderButton")
  40. )
  41. );
  42.  
  43. diagram.linkTemplate = goObj(go.Link,{ strokeWidth: 1.5 }));
  44.  
  45. this.setState({myModel: model,myDiagram: diagram});
  46. }
  47. );
  48.  
  49. }
  50.  
  51.  
  52.  
  53. componentDidMount () {
  54. this.renderCanvas ();
  55. }
  56.  
  57. componentWillUpdate (prevProps) {
  58. if (this.props.data !== prevProps.data) {
  59. console.log ('Updating');
  60. const model = this.state.myModel;
  61. const diagram = this.state.myDiagram;
  62. model.nodeDataArray = this.props.data;
  63. diagram.model = model;
  64. this.setState({myModel: model,'backgroundColor': '#DAE4E4'}}></div>;
  65. }
  66. }
  67.  
  68. GoJs.propTypes = { data: React.PropTypes.string.isrequired };
  69. GoJs.defaultProps = { data: '[]' };

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

来自父组件

  1. render(){
  2. return(
  3. <div>
  4. <PTagBox data={nodeDataArray}/>
  5. </div>
  6. );
  7. }

其中PTagBox是哑或子组件

猜你在找的JavaScript相关文章