フックの使用
フックは16.8.0で導入されたため、次のコードには16.8.0の最小バージョンが必要です(クラスコンポーネントの例については下にスクロールしてください)。CodeSandboxデモ
1.動的コンテキストの親状態を設定する
まず、コンシューマーに渡すことができる動的なコンテキストを作成するために、親の状態を使用します。これにより、信頼できる唯一の情報源が確実に得られます。たとえば、私の親アプリは次のようになります。
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
language
状態で保存されています。後でコンテキストを介して両方language
とsetter関数setLanguage
を渡します。
2.コンテキストの作成
次に、次のような言語コンテキストを作成しました。
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
ここでは、language
( 'en')のデフォルトとsetLanguage
、コンテキストプロバイダーからコンシューマーに送信される関数を設定しています。これらはデフォルトにすぎず、親でプロバイダーコンポーネントを使用するときにそれらの値を提供しますApp
。
注:LanguageContext
フックを使用する場合でも、クラスベースのコンポーネントを使用する場合でも、同じままです。
3.コンテキストコンシューマーの作成
言語スイッチャーに言語を設定させるには、コンテキストを介して言語セッター機能にアクセスできる必要があります。次のようになります。
const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
ここでは、言語を「jp」に設定しているだけですが、このための言語を設定する独自のロジックがある場合があります。
4.プロバイダーで消費者を包む
次に、言語スイッチャーコンポーネントをでレンダリングし、LanguageContext.Provider
コンテキストを介してより深いレベルに送信する必要のある値を渡します。これが私の親がApp
どのように見えるかです:
const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
<LanguageContext.Provider value={value}>
<h2>Current Language: {language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
};
これで、言語スイッチャーがクリックされるたびに、コンテキストが動的に更新されます。
CodeSandboxデモ
クラスコンポーネントの使用
最新のコンテキストAPIはReact16.3で導入され、動的なコンテキストを持つための優れた方法を提供します。次のコードには、16.3.0の最小バージョンが必要です。CodeSandboxデモ
1.動的コンテキストの親状態を設定する
まず、コンシューマーに渡すことができる動的なコンテキストを作成するために、親の状態を使用します。これにより、信頼できる唯一の情報源が確実に得られます。たとえば、私の親アプリは次のようになります。
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
language
あなたは状態ツリーの外側に保つことが言語setterメソッドと共に状態で保存されています。
2.コンテキストの作成
次に、次のような言語コンテキストを作成しました。
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
ここでは、language
( 'en')のデフォルトとsetLanguage
、コンテキストプロバイダーからコンシューマーに送信される関数を設定しています。これらはデフォルトにすぎず、親でプロバイダーコンポーネントを使用するときにそれらの値を提供しますApp
。
3.コンテキストコンシューマーの作成
言語スイッチャーに言語を設定させるには、コンテキストを介して言語セッター機能にアクセスできる必要があります。次のようになります。
class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
ここでは、言語を「jp」に設定しているだけですが、このための言語を設定する独自のロジックがある場合があります。
4.プロバイダーで消費者を包む
次に、言語スイッチャーコンポーネントをでレンダリングし、LanguageContext.Provider
コンテキストを介してより深いレベルに送信する必要のある値を渡します。これが私の親がApp
どのように見えるかです:
class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
render() {
return (
<LanguageContext.Provider value={this.state}>
<h2>Current Language: {this.state.language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
}
}
これで、言語スイッチャーがクリックされるたびに、コンテキストが動的に更新されます。
CodeSandboxデモ