2017-05-15 1 views
0

私はAPIエンドポイントをヒットするためにajax呼び出しを使用して現在のユーザーを取得する関数を作成しています。これは匿名ユーザーまたは実際のユーザーかもしれません。 initial変数はコンストラクタで使用されている場合はtrueに設定され、他の場所で使用される場合はfalseに設定されます。これが適切なやり方であるのか、コードがクリーンなのか分かりません。例:setStateとit.stateを切り替えるためにイニシャルを使用して、反応で正しい方法を指定していますか?現在のユーザーを取得する反応関数を簡素化

loadCurrentUser(initial = false) { 
$.ajax({ 
    type: 'GET', 
    url: 'accounts/api/users/current', 
}).done((responseData) => { 
    const data = responseData.data; 
    const isAuthenticated = data.is_authenticated; 
    let stateData; 
    if (isAuthenticated) { 
    stateData = { 
     displayName: data.display_name, 
     reputationPoint: data.reputation_point, 
    }; 
    } else { 
    stateData = { 
     displayName: null, 
     reputationPoint: null, 
    }; 
    } 

    if (initial) { 
    this.state = stateData; 
    } else { 
    this.setState(stateData); 
    } 
}); 
} 

答えて

0

これは、このように単純化することができます。

state = {displayName: null, reputationPoint: null} 

componentWillMount() { 
    this.loadCurrentUser() 
} 

loadCurrentUser() { 
$.ajax({ 
    type: 'GET', 
    url: '/accounts/api/users/current', 
}).done(responseData => { 
    const {is_authenticated, display_name, reputation_point} = responseData.data; 
    if (is_authenticated) { 
    this.setState({ 
     displayName: display_name, 
     reputationPoint: reputation_point, 
    }); 
    } 
}); 
} 

主に、それは、コンストラクタレベルに初期値を設定し、それが空の/ NULL値であるとすることは常に良い考えです。必要に応じてどこからでもsetStateに電話することができます。さもなければ、非同期AJAX要求がうまくいくかもしれないので、this.state.displayNameまたは何かを参照するところではどこでもエラーが発生します。

+0

私の質問にお答えいただきありがとうございます! componentWillMountのloadCurrentUserとコンストラクタのloadCurrentUserを呼び出す方法の違いは何ですか? –

+0

コールを延期するだけです。 'componentWillMount'で呼び出されるまでに、すべての小道具と初期状態が設定されていました。そうでなければ私はほとんど同じです。 – Babar

関連する問題