2017-02-15 6 views
6

Ich kann nicht herausfinden, wie meine Componenet-Render-Funktion bei Änderung des Werts this.props.user ausgeführt wird. Anfangs ist der Wert this.props.user Null, aber Sekunden später wird ein tatsächlicher Wert angezeigt. Unten zeige ich die Kindkomponente. Die übergeordnete Komponente ordnet den Geschäftsstatus den Props zu und übergibt sie an die untergeordnete Komponentenklasse.Reagieren Sie mit componentWillReceiveProps, um die Komponente erneut zu rendern

export class UserInfoComponent extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {user: this.props.user} 
    } 

    componentWillReceiveProps(){ 
    this.setState({user: this.props.user}) 
    } 

    render() { 
    if(this.state.user) 
    return (
     <h1>{this.state.user.firstName}</h1> 
    ); 

    return (
     <h1>loading</h1> 
    ) 
    } 
} 

Antwort

18

componentWillReceiveProps erhält nextProps als Argument. Mit dem Code, den Sie gerade haben, setzen Sie den Benutzer einfach auf seinen aktuellen Status zurück. Sie müssen das angegebene Argument nextProps verwenden.

export class UserInfoComponent extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {user: this.props.user} 
    } 

    componentWillReceiveProps(nextProps){ 
    this.setState({user: nextProps.user}) 
    } 

    render() { 
    if(this.state.user) 
    return (
     <h1>{this.state.user.firstName}</h1> 
    ); 

    return (
     <h1>loading</h1> 
    ) 
    } 
} 
+0

Warum den Status verwenden? Requisitenwechsel führen bereits zum erneuten Rendern der Komponente. – FurkanO

+0

Der Hauptunterschied hier ist, dass sie im Beispiel der Fragesteller ihre eingegangenen Requisiten in ihren eigenen internen Zustand umwandeln. Dies passiert nur einmal, wenn die Komponente so gerendert wird, dass "this.state.user", auf das verwiesen wird, immer auf den ersten Wert verweist, der jemals übergeben wurde, da dies während der Konstruktion der Komponente passiert. 'componentWillReceiveProps' aktualisiert den Zustand, wenn die Elternkomponente neue Requisiten übergeben hat, aber das passiert nicht auf natürliche Weise und warum das Umwandeln von Requisiten in einen Zustand ist normalerweise ein Anti-Muster – finalfreq

+0

Mein Punkt ist zu sagen, Sie müssen Requisitenänderungen nicht hören um eine Komponente neu zu rendern. Fragender könnte das nicht wissen. Ich habe nicht nach dem Unterschied gefragt. – FurkanO

Verwandte Themen