createContext

createContext γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒζδΎ›γΎγŸγ―θͺ­γΏε–γ‚Šγ§γγ‚‹γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’δ½œζˆγ™γ‚‹γŸγ‚οΏ½?閒数です。

const SomeContext = createContext(defaultValue)

γƒͺフゑレンス

createContext(defaultValue)

createContext γ‚’γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ε€–ιƒ¨γ§ε‘Όγ³ε‡Ίγ—γ¦γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’δ½œζˆγ—γΎγ™γ€‚

import { createContext } from 'react';

const ThemeContext = createContext('light');

さらに例を見る

εΌ•ζ•°

  • defaultValue: γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–るときに、そ�?上�?ツγƒͺγƒΌε†…γ§ε―ΎεΏœγ™γ‚‹γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγƒ—γƒ­γƒγ‚€γƒ€γŒγͺγ„ε ΄εˆγ«γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆγŒζŒγ€ε€€γ§γ™γ€‚γƒ‡γƒ•γ‚©γƒ«γƒˆε€€γŒεΏ…θ¦γͺγ„ε ΄εˆγ― null γ‚’ζŒ‡οΏ½?οΏ½γ—γΎγ™γ€‚γƒ‡γƒ•γ‚©γƒ«γƒˆε€€γ―γ€Œζœ€εΎŒοΏ½?手�?οΏ½γ€γ¨γ—γ¦δ½Ώγ‚γ‚Œγ‚‹γ‚ˆγ†γ«ζ„ε›³γ•γ‚Œγ¦γ„γΎγ™γ€‚γ“γ‚Œγ―ι™ηš„γͺε€€γ§γ‚γ‚Šγ€ζ™‚ι–“γŒη΅ŒιŽγ—γ¦γ‚‚ε€‰εŒ–γ—γΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

createContext γ―γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆθ‡ͺδ½“γ―ζƒ…ε ±γ‚’ζŒγ£γ¦γ„γΎγ›γ‚“γ€‚δ»–οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ©οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹γ‹γ€γΎγŸγ―ζδΎ›γ™γ‚‹γ‹γ‚’θ‘¨γ—γΎγ™γ€‚ι€šεΈΈγ€δΈŠδ½οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ SomeContext.Provider γ‚’δ½Ώη”¨γ—γ¦γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’ζŒ‡οΏ½?�し、下位�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ useContext(SomeContext) γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚ŠγΎγ™γ€‚γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ«γ―γ„γγ€γ‹οΏ½?γƒ—γƒ­γƒ‘γƒ†γ‚£γŒγ‚γ‚ŠγΎγ™οΌš

  • SomeContext.Provider γ§γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?倀を提供できます。
  • SomeContext.Consumer γ―γ€γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’θͺ­γΏε–γ‚‹γŸγ‚οΏ½?ζ–Ήζ³•γ§γ™γŒγ€γ‚γΎγ‚Šδ½Ώη”¨γ•γ‚ŒγΎγ›γ‚“γ€‚

SomeContext.Provider

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγƒ—γƒ­γƒγ‚€γƒ€γ§γƒ©γƒƒγƒ—γ™γ‚‹γ¨γ€ε†…ιƒ¨οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ε―Ύγ—γ¦γ“οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’ζŒ‡οΏ½?�できます。

function App() {
const [theme, setTheme] = useState('light');
// ...
return (
<ThemeContext.Provider value={theme}>
<Page />
</ThemeContext.Provider>
);
}

props

  • value: こ�?プロバむダ�?ε†…ε΄οΌˆζ·±γ•γ«ι–’γ‚γ‚‰γšοΌ‰γ«γ‚γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹ιš›γ«γ€ζΈ‘γ—γŸγ„ε€€γ§γ™γ€‚γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?倀は任意�?εž‹γ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γƒ—γƒ­γƒγ‚€γƒ€ε†…γ§ useContext(SomeContext) γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ„γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€γγ‚Œγ‚ˆγ‚ŠδΈŠδ½γ‹γ€ζœ€γ‚‚ε†…ε΄γ«γ‚γ‚‹ε―ΎεΏœγ™γ‚‹γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγƒ—γƒ­γƒγ‚€γƒ€οΏ½? value γ‚’ε—γ‘ε–γ‚ŠγΎγ™γ€‚

SomeContext.Consumer

useContext γŒε­˜εœ¨γ™γ‚‹ε‰γ«γ―γ€γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹ε€γ„ζ–Ήζ³•γŒγ‚γ‚ŠγΎγ—γŸοΌš

function Button() {
// 🟑 Legacy way (not recommended)
return (
<ThemeContext.Consumer>
{theme => (
<button className={theme} />
)}
</ThemeContext.Consumer>
);
}

こ�?ε€γ„ζ–Ήζ³•γ―γΎγ ε‹•δ½œγ—γΎγ™γŒγ€ζ–°γ—γζ›Έγ‹γ‚ŒγŸγ‚³γƒΌγƒ‰γ― useContext() γ‚’δ½Ώγ£γ¦γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹γΉγγ§γ™οΌš

function Button() {
// βœ… Recommended way
const theme = useContext(ThemeContext);
return <button className={theme} />;
}

props

  • children: 閒数です。React は、useContext() γ¨εŒγ˜γ‚’γƒ«γ‚΄γƒͺγ‚Ίγƒ γ«γ‚ˆγ£γ¦οΏ½?οΏ½γΎγ‚‹ηΎεœ¨οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆε€€γ§ι–’ζ•°γ‚’ε‘Όγ³ε‡Ίγ—γ€γοΏ½?ι–’ζ•°γ‹γ‚‰θΏ”γ•γ‚Œγ‚‹η΅ζžœγ‚’γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚θ¦ͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰οΏ½?γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆγŒε€‰ζ›΄γ•γ‚Œγ‚‹γ¨γ€React はこ�?閒数を再�?οΏ½θ‘Œγ—γ€UI を更新します。

使用法

γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?作成

γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’εˆ©η”¨γ™γ‚‹γ“γ¨γ§γ€ζ˜Žη€Ίηš„γ« props γ‚’ζΈ‘γ•γšγ«γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ζ·±γγΎγ§ζƒ…ε ±γ‚’ζΈ‘γ™γ“γ¨γŒγ§γγΎγ™γ€‚

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?倖部で createContext γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ€γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ 1 γ€γΎγŸγ―θ€‡ζ•°ε€‹δ½œζˆγ—γΎγ™γ€‚

import { createContext } from 'react';

const ThemeContext = createContext('light');
const AuthContext = createContext(null);

createContext γ―γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚γγ‚Œγ‚’ useContext() γ«ζΈ‘γ™γ“γ¨γ§γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹γ“γ¨γŒγ§γγΎγ™οΌš

function Button() {
const theme = useContext(ThemeContext);
// ...
}

function Profile() {
const currentUser = useContext(AuthContext);
// ...
}

γƒ‡γƒ•γ‚©γƒ«γƒˆγ§γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒε—γ‘ε–γ‚‹ε€€γ―γ€γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’δ½œζˆγ™γ‚‹γ¨γγ«ζŒ‡οΏ½?οΏ½γ—γŸγƒ‡γƒ•γ‚©γƒ«γƒˆοΏ½?倀にγͺγ‚ŠγΎγ™γ€‚γ—γ‹γ—γ€γƒ‡γƒ•γ‚©γƒ«γƒˆοΏ½?倀は決して倉わらγͺγ„γŸγ‚γ€γ“γ‚Œθ‡ͺ体では役に立けませんね。

γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆγŒδΎΏεˆ©γͺοΏ½?γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰ε‹•ηš„γͺε€€γ‚’ζδΎ›γ§γγ‚‹γ‹γ‚‰γ§γ™οΌš

function App() {
const [theme, setTheme] = useState('dark');
const [currentUser, setCurrentUser] = useState({ name: 'Taylor' });

// ...

return (
<ThemeContext.Provider value={theme}>
<AuthContext.Provider value={currentUser}>
<Page />
</AuthContext.Provider>
</ThemeContext.Provider>
);
}

γ“γ‚Œγ§γ€Page γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨γοΏ½?内部�?すべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€γ©γ‚“γͺγ«ζ·±γγ¦γ‚‚γ€ζΈ‘γ•γ‚ŒγŸγ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’γ€Œθ¦‹γ‚‹γ€γ“γ¨γŒγ§γγΎγ™γ€‚ζΈ‘γ•γ‚ŒγŸγ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γŒε€‰ζ›΄γ•γ‚Œγ‚‹γ¨γ€React γ―γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ε†γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚

γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?θͺ­γΏε–γ‚Šγ¨ζδΎ›γ€δΎ‹γ«γ€γ„γ¦γ•γ‚‰γ«θͺ­γ‚€


フゑむルから�?γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?γ‚€γƒ³γƒγƒΌγƒˆγ¨γ‚¨γ‚―γ‚ΉγƒγƒΌγƒˆ

η•°γͺγ‚‹γƒ•γ‚‘γ‚€γƒ«γ«γ‚γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒεŒγ˜γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ«γ‚’γ‚―γ‚»γ‚Ήγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γ“γ¨γŒγ‚ˆγγ‚γ‚ŠγΎγ™γ€‚γοΏ½?γŸγ‚γ€δΈ€θˆ¬ηš„γ«γ―εˆ₯γƒ•γ‚‘γ‚€γƒ«γ§γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’οΏ½?�言します。他�?γƒ•γ‚‘γ‚€γƒ«γ§γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’εˆ©η”¨γ§γγ‚‹γ‚ˆγ†γ«γ™γ‚‹γŸγ‚γ«γ€export ζ–‡γ‚’δ½Ώη”¨γ§γγΎγ™οΌš

// Contexts.js
import { createContext } from 'react';

export const ThemeContext = createContext('light');
export const AuthContext = createContext(null);

δ»–οΏ½?フゑむルで�?οΏ½θ¨€γ•γ‚ŒγŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€import 文を使用して、こ�?γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’θͺ­γΏε–γ£γŸγ‚Šγ€ζδΎ›γ—γŸγ‚Šγ™γ‚‹γ“γ¨γŒγ§γγΎγ™οΌš

// Button.js
import { ThemeContext } from './Contexts.js';

function Button() {
const theme = useContext(ThemeContext);
// ...
}
// App.js
import { ThemeContext, AuthContext } from './Contexts.js';

function App() {
// ...
return (
<ThemeContext.Provider value={theme}>
<AuthContext.Provider value={currentUser}>
<Page />
</AuthContext.Provider>
</ThemeContext.Provider>
);
}

γ“γ‚Œγ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚€γƒ³γƒγƒΌγƒˆγ¨γ‚¨γ‚―γ‚ΉγƒγƒΌγƒˆγ¨εŒζ§˜γ«ε‹•δ½œγ—γΎγ™γ€‚


γƒˆγƒ©γƒ–γƒ«γ‚·γƒ₯ーティング

γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’ε€‰ζ›΄γ™γ‚‹ζ–Ήζ³•γŒθ¦‹γ€γ‹γ‚‰γͺい

こ�?γ‚ˆγ†γͺγ‚³γƒΌγƒ‰γ―γƒ‡γƒ•γ‚©γƒ«γƒˆοΏ½?γ‚³γƒ³γƒ†γ‚―γ‚ΉγƒˆοΏ½?ε€€γ‚’ζŒ‡οΏ½?οΏ½γ—γΎγ™οΌš

const ThemeContext = createContext('light');

こ�?ε€€γ―ζ±Ίγ—γ¦ε€‰γ‚γ‚ŠγΎγ›γ‚“γ€‚React γ―γ€ε―ΎεΏœγ™γ‚‹γƒ—γƒ­γƒγ‚€γƒ€γ‚’δΈŠδ½οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§θ¦‹γ€γ‘γ‚‰γ‚Œγͺγ„ε ΄εˆγ«οΏ½?み、こ�?倀をフォールバックとして使用します。

γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγ‚’ζ™‚ι–“οΏ½?η΅ŒιŽγ¨γ¨γ‚‚γ«ε€‰εŒ–γ•γ›γ‚‹γ«γ―γ€state γ‚’θΏ½εŠ γ—γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γ‚³γƒ³γƒ†γ‚―γ‚Ήγƒˆγƒ—γƒ­γƒγ‚€γƒ€γ§γƒ©γƒƒγƒ—γ—γΎγ™γ€‚