2017-02-15 3 views
1

Ich habe ein Kind Komponente Tabelle, dass jedes Mal seine Zustandsänderungen gemacht werden muss, sondern auch, manchmal, wenn neue Requisiten aus dem übergeordneten ankommen;ReactJS Komponente Entscheidung Requisiten oder Zustand verwenden zu machen

Die Tabelle Komponente soll wiederverwendbar sein und behandelt seinen eigenen Zustand. Wenn sich die Breite ändert, benutze ich setState (newTableWidth), um die Tabelle neu zu rendern (so weit, so gut).

Die Mutter app Projekt ist derjenige, der die Tabelle Komponente erstellt und passiert Anfangsbreite.

Das Problem: Nach Änderungen in der übergeordneten App (oder in verschiedenen Unterkomponenten), ich mag den props.tableWidth aktualisieren und neu rendern Tabelle. Aber es gibt andere Szenarien, in denen Projekt rendert Tabelle ohne Aktualisierung der props.tableWidth.

Wie kann Tabelle wissen, wann sich mit den Requisiten zu rendern und wann selbst mit dem Zustand zu rendern?

Code-Beispiel:

class Table extends React.Component { 
    constructor(props) { 
     this.state = { 
      tableWidth: this.props.tableWidth 
      columnOrder 
     }; 
    } 
    onWidthChange(newWidth){ 
    this.setState({tableWidth:newWidth}) 
    } 

} 

class Project extends React.Component { 
render(){ 
    if (this.onChangeTableWidth()){ 
     let width = this.calculateTableWidth(); 
    } 
    <Table tableWidth = {width}/> 
} 
} 

Antwort

0

reagieren wird automatisch machen wieder, wenn Requisiten oder Zustandsänderungen, so dass Sie sich darüber keine Sorgen. Sie können die Lifecycle-Methode componentWillReceiveProps(nextProps) verwenden, um Ihren Status mit der neuen über Props empfangenen Breite zu aktualisieren. Verwenden Sie dazu einfach setState(...).

+0

aber was ist, wenn es keine Änderung in Requisiten gibt, aber ich möchte _Table_ Requisiten anstelle von Zustand verwenden? zum Beispiel: ich mache _Table_ mit Requisiten: table = 100 nun geändert _Table_ seinen Zustand zu table = 200 und jetzt _Project_ Komponente ausgelöst onChangeTableWidth() und muß _Table_ wieder macht wieder mit table = 100 in diesem Fall Requisiten änderte sich nicht so meine tableWidth wird 200 sein und nicht 100 –

+1

Ich würde sagen, nur Container (Eltern) Komponente verantwortlich für die Änderung der Tabelle Width, zum Beispiel übergeben eine Funktion über Requisiten, die als 'onChangeTableWidth (Breite)' handeln würde Handler, und halten Sie die Breite im Container, oder zumindest immer die Breite, die Sie über Funktionsparameter erhalten haben. Auf diese Weise gibt es nur eine Wahrheitsquelle, nämlich die Containerkomponente, und es gibt niemals Verwirrung darüber, auf welche Weise die Breite festgelegt wurde, da sie immer noch auf die gleiche Weise aktualisiert wird. Wie bereits erwähnt, könnten Sie jedoch auch einen Mechanismus zur Zustandsverwaltung verwenden. Ich empfehle Ihnen, Redux oder Mobx zu betrachten. –

1

Wenn sich die übergeordnete Komponente dafür entscheidet, neue Requisiten in die untergeordnete Komponente zu übernehmen, muss die untergeordnete Komponente übernommen werden. Wenn es Konflikte zwischen Requisiten und Staat gibt, gewinnen Requisiten und der Staat muss zurückgesetzt werden. Ich vermute, dass ein globaler Zustand dieses Problem gelöst hat, aber ich verstehe aus Ihrer Frage, dass Sie einige Zustände in Unterkomponenten einkapseln. Wenn also die Elternkomponente Requisiten mit Requisiten, die die aktuellen Unterkomponenten enthalten, bringen möchte, kann sie die Unterkomponente fragen und die Requisiten umformen.

Verwandte Themen