2016-08-04 8 views
3

Ich habe eine Komponente, deren Status als Property an eine untergeordnete Komponente übergeben wird. Ich habe festgestellt, dass die Child-Komponente nicht neu gerendert wird, selbst wenn der Status des Parents geändert wird.Aktualisieren der untergeordneten Komponente über die Änderung von Requisiten aus dem übergeordneten Element in React

auf der offiziellen Basierend Reagieren Dokumentation shouldComponentUpdate zur Nutzung:

„Das erste Mal, wenn die innere Komponente gerendert wird, wird es. {Foo: ‚bar‘} als Wert prop Wenn der Benutzer klickt Auf dem Anker wird der Status der übergeordneten Komponente auf {value: {foo: 'barbar' }} aktualisiert, was den Prozess des erneuten Renderns der inneren Komponente auslöst, der {foo: 'barbar'} erhält neuer Wert für die Requisite

Das Problem ist, dass seit dem p arent und innere Komponenten teilen sich einen Verweis auf das gleiche Objekt, wenn das Objekt in Zeile 2 der onClick Funktion mutiert wird, wird die prop die innere Komponente geändert haben. Also, wenn der Neu-Rendering-Prozess gestartet wird und sollte componentUpdate aufgerufen wird, wird this.props.value.foo gleich nextProps.value.foo sein, da in der Tat this.props.value das gleiche Objekt wie verweist nextProps.value.

Demzufolge kann, da wir die Änderung auf der Stütze vermissen und kurze Schaltung die Wieder Rendering-Prozess, wird die UI nicht von ‚bar‘ aktualisiert werden zu ‚Barbar‘.“

wenn ich nicht shouldComponentUpdate verwenden können, wie würde ich das Kind Komponente zwingen, aus dem Eltern auf der Grundlage einer Änderung von Requisiten rerender?

geordnete Komponente

ich das Kind Komponente basiert wollen auf der boolean rerender gegeben zu showDropzone.

 <Dropzone 
     onDrop={this.onDrop} 
     clearFile = {this.clearFile} 
     showDropzone = {this.state.filePresent}/> 

Kinder Komponente

export default class Dropzone extends Component { 
    constructor(props) { 
    super(props); 
    } 

    render() { 
    const { onDrop } = this.props; 
    const {showDropzone} = this.props; 
    const {clearFile} = this.props; 

    return (
     <div className="file-adder"> 
      <div className="preview"> 
      {{showDropzone}? 
      <Dropzone 
       onDrop={onDrop} 
       ref="dropzone"> 
      </Dropzone>   
      :<button type="button" 
      className="btn btn-primary" 
      onClick={clearFile}> 
      Clear File</button>} 
     </div> 
    </div> 
    ); 
    } 
} 
+0

Sind Sie sicher, dass die Benennung korrekt ist? Die untergeordnete Komponente heißt Dropzone, aber ihre Renderfunktion rendert auch ein Kind . – wintvelt

Antwort

0

In geordnete Komponente haben Sie "showZone" anstelle von "showDropzone" verwendet.

Danke

+0

danke! Das war ein kleiner Fehler meinerseits Ich habe es versucht und es funktioniert immer noch nicht – lost9123193

+0

Möchten Sie diesen Zustand auf Button klicken Klicken Sie auf "clearFile"? – Rakesh

+0

Der Status showZone wird in der übergeordneten Komponente auf "True" und "False" aktualisiert. Ich kann die Elternstaaten aktualisieren. Mein Problem ist in der untergeordneten Komponente, nur die Komponente zeigt. Die Schaltfläche zum Löschen der Datei wird nie angezeigt, obwohl ich {{showDropzone}? um zu überprüfen, ob showDropzone wahr oder falsch ist – lost9123193

Verwandte Themen