2013-12-10 9 views
15

Sono stato in difficoltà per un paio di giorni, cercando di capire il modo "reagire" per farlo.Come gestire lo stato in un componente ad albero in reactjs

Fondamentalmente, ho un albero, un elenco di liste (di elenchi ...) che possono essere annidate arbitrariamente, e voglio un componente che visualizzerà questo e consentirà anche il riarrangiamento.

Ecco miei dati:

var data = [{ 
     id: 1 
    }, { 
     id: 2, children: [ 
     { 
      id: 3, children: [{id: 6}] 
     }, { 
      id: 4 
     }, { 
      id: 5 
     }] 
    }] 

Il mio primo passo era quello di avere solo un singolo componente "albero" che costruisce le liste nidificate di elementi DOM nella sua funzione render (look at the code here). In realtà ha funzionato abbastanza bene per un piccolo numero di elementi, ma voglio essere in grado di supportare centinaia di elementi, e c'era un costo di re-rendering molto alto quando un elemento veniva spostato all'interno dell'albero (~ 600ms quando c'erano poche centinaia elementi).

Quindi penso che avrò ciascun "nodo" dell'albero come istanza di questo componente. Ma ecco la mia domanda (scusa per la lunga introduzione):

Se ciascun nodo esegue query dinamiche per l'elenco, gli ID figli provengono da un "database" centrale e lo memorizzano nello stato? O il nodo più in alto carica l'intero albero e passa tutto attraverso i sostegni?

Sto ancora provando a pensare a come lo stato & deve essere gestito da & diviso.

Grazie

+1

Tutto è un albero qui, giusto?È possibile riutilizzare il componente Tree per renderlo Tree child invece di considerarne uno di primo livello. Non ho provato il rendering ricorsivo, ma dovrebbe funzionare. Per ogni componente Tree, renderizza i suoi figli immediati e passa quei bambini ai loro figli, ecc. Inoltre, assicurati di impostare l'attributo 'key' sui componenti in un ciclo in modo che React possa tenerne traccia. –

+0

oh l'attributo "chiave"? Non l'avevo visto da nessuna parte nei documenti. Lo proverò –

+0

L'attributo "chiave" non è evidente, ma è citato in [Bambini dinamici] (http://facebook.github.io/react/docs/multiple-components.html#dynamic-children) dei documenti di Components. –

risposta

23

ho voluto provare la struttura ad albero con Reagire e si avvicinò con un componente semplice che nasconde i sottostrati quando si fa clic su <h5>. Tutto è un TreeNode. È simile a quello che stavi pensando?

Si può vedere in azione in questo JSFiddle: http://jsfiddle.net/ssorallen/XX8mw/

TreeNode.jsx:

var TreeNode = React.createClass({ 
    getInitialState: function() { 
    return { 
     visible: true 
    }; 
    }, 
    render: function() { 
    var childNodes; 
    if (this.props.node.childNodes != null) { 
     childNodes = this.props.node.childNodes.map(function(node, index) { 
     return <li key={index}><TreeNode node={node} /></li> 
     }); 
    } 

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

    return (
     <div> 
     <h5 onClick={this.toggle}> 
      {this.props.node.title} 
     </h5> 
     <ul style={style}> 
      {childNodes} 
     </ul> 
     </div> 
    ); 
    }, 
    toggle: function() { 
    this.setState({visible: !this.state.visible}); 
    } 
}); 

bootstrap.jsx:

var tree = { 
    title: "howdy", 
    childNodes: [ 
    {title: "bobby"}, 
    {title: "suzie", childNodes: [ 
     {title: "puppy", childNodes: [ 
     {title: "dog house"} 
     ]}, 
     {title: "cherry tree"} 
    ]} 
    ] 
}; 

React.render(
    <TreeNode node={tree} />, 
    document.getElementById("tree") 
); 
+0

All'inizio non riesco a passare l'intero albero, ti dispiacerebbe vedere la mia domanda? Http: //stackoverflow.com/questions/37935756/how-to-implement-a-self-contained- componente-in-reagire-redux – Mithril

5

sembra che sarebbe più bello di passare tutto giù come oggetti di scena, in modo da evitare che si dalla difficoltà di gestione individuale inserzione/delezione. Inoltre, come dicevano i commenti, gli attributi key impediscono una grande quantità di re-rendering non necessario.

È possibile controllare questo collegamento: http://facebook.github.io/react/blog/2013/11/05/thinking-in-react.html. Descrive il tipo di dilemma che stai avendo e come affrontarlo.

(Casualmente, ho fatto un albero di reagire vista qualche tempo fa:. https://github.com/chenglou/react-treeview Prendete quello che volete da esso!)

Problemi correlati