2017-11-08 1 views
0

Ich mache eine rekursive Treeview mit Checkboxen mit React JS. Ich möchte ein Formular erstellen und senden, um die überprüften Werte zu erhalten, aber ich bekomme nicht, wo die Schaltfläche "Senden" in das Formular eingefügt werden soll. Bis jetzt generiert mein Code eine Übergabeschaltfläche mit jedem Knoten.Schaltfläche "Senden" in rekursiver Treeview in React JS

toggle =() => { 
    this.setState(
     {visible: !this.state.visible} 
    ); 
    }; 

    render() { 
    var childNodes; 

    if (this.props.node.childNodes != null) { 
     childNodes = this.props.node.childNodes.map(function(node, index) { 
     return <li key={index}><Treeview node={node} /></li> 
     }); 
    } 

    var style; 
    if (!this.state.visible) { 
     style = {display: "none"}; 
    } 

    return (
     <form> 
     <label> 
      {this.props.node.title} 
      <input type="checkbox" onClick={this.toggle}/> 
     </label> 
     <ul style={style}> 
      {childNodes} 
     </ul> 
     <input type="submit" value="Submit"/> 
     </form> 
    ); 
    } 
+0

Was ist das Problem mit der Eingabe einreichen aufweist, wo es derzeit ist? – tenor528

+0

Es erstellt Submit-Schaltflächen mit jedem Baumknoten. Ich versuche am Ende der Baumansicht noch einen Teil des Formulars abschicken zu wollen. – zimmer

+0

Was ist TreeView? Ist das die Komponente, die wir betrachten? Wenn ja, sieht es so aus, als würden Sie ein rekursives Rendering durchführen. Wenn das der Fall ist, benötigen Sie entweder einen Weg (wie eine Stütze), um den Übergabeknopf zu rendern, oder Sie können die Überprüfungen nur rekursiv ausführen und das Formular und das Senden außerhalb von allem. – tenor528

Antwort

0

Ich denke, es gibt zwei Möglichkeiten zu tun, was Sie wollen. Eine (Ex 1) würde eine Struktur mit zwei Komponenten/Methoden haben, eine für die Form und eine andere für die rekursive Checkbox-Struktur.

Eine andere (Ex 2) würde sein, Requisiten zu verwenden, um einige Teile bedingt zu rendern.

Ex 1

function TreeView (props) { 
    var childNodes; 

    if (props.node.childNodes != null) { 
    childNodes = props.node.childNodes.map(function(node, index) { 
     return <li key={index}><Treeview node={node} /></li> 
    }); 
    } 

    var style; 
    if (!props.visible) { 
    style = {display: "none"}; 
    } 

    return (
    <ul style={style}> 
     {childNodes} 
    </ul> 
); 
} 

class Form extends React.Component { 
    constructor (props) { 
    super(props); 
    this.toggle = this.toggle.bind(this); 
    } 

    toggle() { 
    this.setState(
     {visible: !this.state.visible} 
    ); 
    }; 

    render() { 
    return (
     <form> 
     <label> 
      {this.props.node.title} 
      <input type="checkbox" onClick={this.toggle}/> 
     </label> 

     <TreeView node={props.node} visible={this.state.visible} /> 

     <input type="submit" value="Submit"/> 
     </form> 
    ); 
    } 
} 

Ex 2

class Treeview extends React.Component { 
    constructor (props) { 
    super(props); 
    this.toggle = this.toggle.bind(this); 
    } 

    toggle() { 
    this.setState(
     {visible: !this.state.visible} 
    ); 
    }; 

    render() { 
    var childNodes; 

    if (this.props.node.childNodes != null) { 
     childNodes = this.props.node.childNodes.map(function(node, index) { 
     return <li key={index}><Treeview node={node} childTree /></li> 
     }); 
    } 

    var style; 
    if (!this.state.visible) { 
     style = {display: "none"}; 
    } 

    if (this.props.childTree) { 
     return (
     <ul> 
      {childNodes} 
     </ul> 
    ) 
    } else { 
     return (
     <form> 
      <label> 
      {this.props.node.title} 
      <input type="checkbox" onClick={this.toggle}/> 
      </label> 
      <ul style={style}> 
      {childNodes} 
      </ul> 
      <input type="submit" value="Submit"/> 
     </form> 
    ); 
    } 
    } 
} 
+0

Vielen Dank. Ich habe den zweiten Ansatz versucht, weil ich Form in der gleichen Reaktionskomponente mache, aber ich bin irgendwie immer noch Knöpfe mit jedem Knoten – zimmer

+1

Hoppla gab es einen Tippfehler. Ich habe das 'This' vergessen. Ich habe das Beispiel aktualisiert, um 'if (this.props.childTree)' zu sagen. Stellen Sie sicher, dass Sie die 'childTree'-Stütze in Ihrem rekursiven Render' 'Treeview-Knoten = {node} chidTree />' hinzufügen – tenor528