2017-11-17 1 views
2

Ich habe eine Komponente, die eine API-Anforderung zum Abrufen bestimmter Informationen unter componentDidMount() erfordert. Diese Abrufanforderung beruht auf Informationen, die in einem Zustand gespeichert sind, den ich über die Funktionen ComponentWillMount() aufgerufen habe.In WillMount() nicht verfügbarer Status in DidMount()

Meine willMount() läuft, dann habe ich meine render() Methode, aber der Status wurde nicht festgelegt, und so dann trifft es didMount() aber schlägt fehl, weil die Daten noch nicht im Status sind. Wo gehe ich falsch?

Edit: Alle Funktionen werden im Konstruktor (nicht dargestellt) gebunden

componentWillMount() { 
    this.enforceEmployeeAuth(); 
    this.loadEmployeeInfo(); 
    } 

    componentDidMount() { 
    this.fetchSurveyFields(); 
    } 

    // Initial check to confirm if the user should be allowed to access any information. 
    enforceEmployeeAuth() { 
    // Get request to confirm that the current user is of type EMPLOYEE 
    API.get("user/employee_auth", {}, (res) => { 
     // Employee Auth: True if employee, else false 
     this.setState({ 
     employee_auth: res.employee_auth, 
     }); 
    }); 
    } 

    // Load up relevant information for currentUser/employee 
    loadEmployeeInfo() { 
    API.get("client/currentEmployee", {}, function(res) { 
     this.setState({ 
     employee    : res.employee, 
     employee_company  : res.employee_company, 
     }) 
    }.bind(this)); 
    } 

    fetchSurveyFields() { 
    debugger 
    API.get('client/survey', { 
     survey: this.state.employee_company.survey_name 
    }, function(res) { 
     debugger 
    }) 
    } 

    render() { 

    debugger 

    return (
     <h2 className="text-charcoal text-left">Employee Rubric</h2> 
    ) 
    } 
+0

wirst du für die Ergebnisse der .get warten müssen, wieder zu kommen, bevor Sie die Daten verwenden können – Cruiser

+0

Haben u prüfen, ob Zustand Methode richtig eingestellt mit Daten innerhalb loadEmployeeInfo(), wenn sie aufgerufen wurde von ComponentWillMount() -Methode –

+0

Ich überprüfte den Fluss mit Debuggern. Es ist wie folgt: 'willMount()' -> führt Funktionen .... 'render()' -> keine Statusaktualisierung ... 'didMount()' -> Zustand wird noch nicht geändert und die Funktion wird fehlschlagen .... 'render()' -> erste Zustandsänderung wird gerendert .... 'render()' -> zweite Zustandsänderung wird gerendert –

Antwort

1

Ihre Funktionen stützen sich auf asynchrone Anforderungen, die bedeuten, dass sie den Staat mit Anfragen die Ergebnisse gesetzt, nachdem sie zurückgekehrt sind, wenn das macht Sinn.

In der Rendermethode überprüfen Sie die Gültigkeit Ihres Status und geben null zurück, wenn sie ungültig ist. Die Rendermethode wird beim nächsten Setzen des Status erneut aufgerufen (d. H. Wenn Ihre Anforderungen erfolgreich sind, da der Status in ihren Callbacks festgelegt ist).

0

Sie können das Autorisierungstoken als Prop von einer übergeordneten Komponente übergeben und dann den componentWillReceiveProps-Hook verwenden, um die Anfrage an die API zu senden?

2

Sie sollten die Versprechen speichern, die von beiden API-Aufrufen zurückgegeben werden. Und dann auf Auflösung von denen in ComponentDidMount, sollten Sie api für fetchSurveyFields aufrufen. Gefällt Ihnen dieses

componentWillMount() { 
    this.promises = []; 

    this.promises.push(this.enforceEmployeeAuth()); 
    this.promises.push(this.loadEmployeeInfo()); 
    } 

    componentDidMount() { 
    Promise.all(this.promises) 
     .then(([resp1, resp2]) => { 
     //You can see here if you still wanna set state. 
     this.fetchSurveyFields(); 
     }); 

    } 

    // Initial check to confirm if the user should be allowed to access any information. 
    enforceEmployeeAuth() { 
    // Get request to confirm that the current user is of type EMPLOYEE 
    API.get("user/employee_auth", {}, (res) => { 
     // Employee Auth: True if employee, else false 
     this.setState({ 
     employee_auth: res.employee_auth, 
     }); 
    }); 
    } 

    // Load up relevant information for currentUser/employee 
    loadEmployeeInfo() { 
    API.get("client/currentEmployee", {}, function(res) { 
     this.setState({ 
     employee    : res.employee, 
     employee_company  : res.employee_company, 
     }) 
    }.bind(this)); 
    } 

    fetchSurveyFields() { 
    debugger 
    API.get('client/survey', { 
     survey: this.state.employee_company.survey_name 
    }, function(res) { 
     debugger 
    }) 
    } 

    render() { 

    debugger 

    return (
     <h2 className="text-charcoal text-left">Employee Rubric</h2> 
    ) 
    } 
Verwandte Themen