2015-03-11 4 views
7

Ho una barra di avanzamento che sto creando in React.js e Zurb Foundation che vorrei riflettere sullo stato corrente. Capisco che in principio posso impostare la larghezza con qualcosa di simile:React.js: come fare in modo che gli stili in linea aggiornino automaticamente la barra di avanzamento sul cambio di stato

render: function() { 
    var spanPercent = (this.props.a - this.props.b)/this.props.a + '%'; 
    var spanStyle = { 
     width: spanPercent 
    }; 
    return (
     <div className="progress"> 
      <span className="meter" style={spanStyle}></span> 
     </div> 
    ); 
} 

tuttavia, quando il valore di puntelli variazioni dovute ad un cambiamento di stato, lo stile in linea non aggiorna anche se il valore puntelli modifiche . Esiste una best practice per fare ciò, come usare un callback o posizionare il codice da qualche altra parte? Gradirei qualsiasi aiuto!

+0

"quando il valore di puntelli variazioni dovute ad un cambiamento di stato" --- cosa significa in concreto? – zerkms

+0

Mi spiace, voglio dire che i dati dal database da cui questo.props.a viene impostato cambia. Aggiungerò anche ottimisticamente il valore di this.props.a prima che la chiamata ajax ritorni – bryant

+1

Normalmente è possibile sottoscrivere tali modifiche e utilizzare 'setState' per modificare lo stato. – zerkms

risposta

7

Una soluzione consiste nel mettere una chiave della percentuale sull'elemento che si desidera aggiornare. In questo modo quando reagisci controlla per vedere cosa è cambiato nel DOM vede che la chiave è cambiata e quindi ricostruirà il DOM per l'elemento.

vedi esempio qui sotto:

render: function() { 
    var spanPercent = (this.props.a - this.props.b)/this.props.a + '%'; 
    var spanStyle = { 
      width: spanPercent 
     }; 
    return (
     <div className="progress"> 
     <span key={spanPercent} className="meter" style={spanStyle}></span> 
     </div> 
); 

}

+2

Does React non controlla le modifiche degli attributi di stile nella sua differita DOM o qualcosa del genere? Questa risposta funziona per me, ma sono ancora confuso sul motivo per cui questo comportamento è presente. – ccnokes

+0

@ccnokes Sono d'accordo. Sembrano dissuaderti dall'aggiornamento manuale, ma poi ottieni risultati strani come questo che ti fanno diffidare del framework. –