ログインしたユーザーに関するデータを保持するために、新しいReact=コンテキストを使用しようとしています。
それを行うには、LoggedUserContext.js:
というファイルにコンテキストを作成します
import React from 'react';
export const LoggedUserContext = React.createContext(
);
そして確かに、今ここで私がするように、コンシューマーを使用して他のコンポーネントの上記コンテキストにアクセスできます:
<LoggedUserContext.Consumer>
{user => (
(LoggedUserContext.name) ? LoggedUserContext.name : 'Choose a user or create one';
)}
</LoggedUserContext.Consumer>
しかし、明らかに、このシステムが役立つためには、ログイン後にコンテキストを変更して、ユーザーのデータを保持できるようにする必要があります。 axiosを使用してREST APIを呼び出しています。取得したデータを自分のコンテキストに割り当てる必要があります。
axios.get(`${SERVER_URL}/users/${this.state.id}`).then(response => { /*What should I do here?*/});
Reactのドキュメントにはそれを行う方法はありませんが、ログインしたユーザーの情報を保持することは、コンテキストについて考えていたユースケースの1つであるとさえ言及しています:
コンテキストは、Reactコンポーネント、現在の認証済みユーザーなど、テーマ、または優先言語のツリーに対して「グローバル」と見なせるデータを共有するように設計されています。たとえば、次のコードでは、Buttonコンポーネントのスタイルを設定するために、「テーマ」プロップを手動で処理します。
どうすればそれができますか?
Context
を使用するには、値を取るProvider
が必要です。その値はコンポーネントの状態から取得され、更新される可能性があります
例えば
class App extends React.Component {
state = {
isAuth: false;
}
componentDidMount() {
APIcall().then((res) => { this.setState({isAuth: res}) // update isAuth })
}
render() {
<LoggedUserContext.Provider value={this.state.isAuth}>
<Child />
</LoggedUserContext.Provider>
}
}
ダイナミックコンテキスト に関するセクションで説明しています
プロバイダーコンポーネントで消費コンポーネントをラップします。
import React from 'react';
const SERVER_URL = 'http://some_url.com';
const LoggedUserContext = React.createContext();
class App extends React.Component {
state = {
user: null,
id: 123
}
componentDidMount() {
axios.get(`${SERVER_URL}/users/${this.state.id}`).then(response => {
const user = response.data.user; // I can only guess here
this.setState({user});
});
}
render() {
return (
<LoggedUserContext.Provider value={this.state.user}>
<LoggedUserContext.Consumer>
{user => (
(user.name) ? user.name : 'Choose a user or create one';
)}
</LoggedUserContext.Consumer>
</LoggedUserContext.Provider>
);
}
}
私はそれをさらに明確にするために完全な例を示しました(テストされていません)。より良いコンポーネント構成の例については、 ドキュメント を参照してください。