ãããã€ããŒãã¿ãŒã³ãçšããå¹ççãªReact Contextã®äœ¿çšæ³ãæ¢ããŸããReactã¢ããªã±ãŒã·ã§ã³ã«ãããããã©ãŒãã³ã¹ãåã¬ã³ããªã³ã°ãã°ããŒãã«ãªç¶æ 管çã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãããã
React Contextã®æé©åïŒãããã€ããŒãã¿ãŒã³ã®å¹çæ§
React Contextã¯ãã°ããŒãã«ãªç¶æ ã管çããã¢ããªã±ãŒã·ã§ã³å šäœã§ããŒã¿ãå ±æããããã®åŒ·åãªããŒã«ã§ããããããæ éã«èæ ®ããªããšãããã©ãŒãã³ã¹ã®åé¡ãç¹ã«äžèŠãªåã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ããããŸãããã®ããã°èšäºã§ã¯ãReact Contextã®äœ¿çšæ³ãæé©åããæ¹æ³ãæãäžããå¹çæ§ãšãã¹ããã©ã¯ãã£ã¹ãåäžãããããã®ãããã€ããŒãã¿ãŒã³ã«çŠç¹ãåœãŠãŸãã
React Contextã®çè§£
React Contextã®æ žå¿ã¯ãã³ã³ããŒãã³ãããªãŒãéããŠãåã¬ãã«ã§æåã§propsãæž¡ãããšãªãããŒã¿ãæž¡ãæ¹æ³ãæäŸããããšã§ããããã¯ããŠãŒã¶ãŒèªèšŒã¹ããŒã¿ã¹ãããŒãèšå®ãã¢ããªã±ãŒã·ã§ã³æ§æãªã©ãå€ãã®ã³ã³ããŒãã³ãããã¢ã¯ã»ã¹ããå¿ èŠãããããŒã¿ã«ç¹ã«äŸ¿å©ã§ãã
React Contextã®åºæ¬æ§é ã«ã¯ã3ã€ã®äž»èŠãªèŠçŽ ãå«ãŸããŸãïŒ
- Contextãªããžã§ã¯ãïŒ
React.createContext()ã䜿çšããŠäœæãããŸãããã®ãªããžã§ã¯ãã¯Providerã³ã³ããŒãã³ããšConsumerã³ã³ããŒãã³ããä¿æããŸãã - ProviderïŒ åã³ã³ããŒãã³ãã«ã³ã³ããã¹ãã®å€ãæäŸããã³ã³ããŒãã³ãã§ããã³ã³ããã¹ãããŒã¿ã«ã¢ã¯ã»ã¹ããå¿ èŠãããã³ã³ããŒãã³ããã©ããããŸãã
- ConsumerïŒãŸãã¯useContextããã¯ïŒïŒ Providerã«ãã£ãŠæäŸãããã³ã³ããã¹ãã®å€ã䜿çšããã³ã³ããŒãã³ãã§ãã
以äžã«ããã®æŠå¿µã説æããããã®ç°¡åãªäŸã瀺ããŸãïŒ
// Create a context
const ThemeContext = React.createContext('light');
function App() {
return (
<ThemeContext.Provider value='dark'>
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
function ThemedButton() {
const theme = React.useContext(ThemeContext);
return (
<button style={{ backgroundColor: theme === 'dark' ? 'black' : 'white', color: theme === 'dark' ? 'white' : 'black' }}>
Button
</button>
);
}
åé¡ç¹ïŒäžèŠãªåã¬ã³ããªã³ã°
React Contextã«é¢ããäž»ãªããã©ãŒãã³ã¹äžã®æžå¿µã¯ãProviderã«ãã£ãŠæäŸãããå€ã倿Žããããšãã«çºçããŸããå€ãæŽæ°ããããšã倿Žãããå€ãçŽæ¥äœ¿çšããŠããªãå Žåã§ããã³ã³ããã¹ãã䜿çšãããã¹ãŠã®ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããŸããããã¯ãå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯é倧ãªããã«ããã¯ãšãªããããã©ãŒãã³ã¹ã®äœäžããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®æªåã«ã€ãªããå¯èœæ§ããããŸãã
ã³ã³ããã¹ããããã€ãã®ããããã£ãæã€å€§ããªãªããžã§ã¯ããä¿æããŠããã·ããªãªãèããŠã¿ãŸãããããã®ãªããžã§ã¯ãã®1ã€ã®ããããã£ã ãã倿Žãããå Žåã§ãã倿ŽãããŠããªãä»ã®ããããã£ã«ã®ã¿äŸåããŠããã³ã³ããŒãã³ãã§ãã£ãŠããã³ã³ããã¹ãã䜿çšãããã¹ãŠã®ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããŸããããã¯éåžžã«éå¹ççã§ãã
解決çïŒãããã€ããŒãã¿ãŒã³ãšæé©åãã¯ããã¯
ãããã€ããŒãã¿ãŒã³ã¯ãã³ã³ããã¹ãã管çããããã©ãŒãã³ã¹ãæé©åããããã®æ§é åãããæ¹æ³ãæäŸããŸããããã«ã¯ãããã€ãã®äž»èŠãªæŠç¥ãå«ãŸããŸãïŒ
1. ã³ã³ããã¹ãã®å€ãã¬ã³ããŒããžãã¯ããåé¢ãã
Providerãã¬ã³ããªã³ã°ããã³ã³ããŒãã³ãå ã§çŽæ¥ã³ã³ããã¹ãã®å€ãäœæããããšã¯é¿ããŠãã ãããããã«ãããã³ã³ããŒãã³ãã®ç¶æ ã倿ŽãããŠãã³ã³ããã¹ãã®å€èªäœã«ã¯åœ±é¿ããªãå Žåã«ãäžèŠãªåã¬ã³ããªã³ã°ãé²ãããšãã§ããŸãã代ããã«ãå¥ã®ã³ã³ããŒãã³ãã颿°ãäœæããŠã³ã³ããã¹ãã®å€ã管çãããããProviderã«æž¡ããŸãã
äŸïŒæé©ååïŒéå¹çïŒ
function App() {
const [theme, setTheme] = React.useState('light');
return (
<ThemeContext.Provider value={{ theme, toggleTheme: () => setTheme(theme === 'light' ? 'dark' : 'light') }}>
<Toolbar />
</ThemeContext.Provider>
);
}
ãã®äŸã§ã¯ãAppã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããããã³ïŒäŸãã°ãããŒããšã¯ç¡é¢ä¿ãªç¶æ
倿Žã«ããå ŽåïŒãæ°ãããªããžã§ã¯ã{ theme, toggleTheme: ... }ãäœæããããã¹ãŠã®ã³ã³ã·ã¥ãŒããŒãåã¬ã³ããªã³ã°ãããåå ãšãªããŸããããã¯éå¹çã§ãã
äŸïŒæé©ååŸïŒå¹ççïŒ
function ThemeProvider({ children }) {
const [theme, setTheme] = React.useState('light');
const value = React.useMemo(
() => ({
theme,
toggleTheme: () => setTheme(theme === 'light' ? 'dark' : 'light')
}),
[theme]
);
return (
<ThemeContext.Provider value={value}>
{children}
</ThemeContext.Provider>
);
}
function App() {
return (
<ThemeProvider>
<Toolbar />
</ThemeProvider>
);
}
ãã®æé©åãããäŸã§ã¯ãvalueãªããžã§ã¯ãã¯React.useMemoã䜿çšããŠã¡ã¢åãããŠããŸããããã«ããããªããžã§ã¯ãã¯themeã®ç¶æ
ã倿Žããããšãã«ã®ã¿åäœæãããŸããã³ã³ããã¹ãã䜿çšããã³ã³ããŒãã³ãã¯ãããŒããå®éã«å€æŽããããšãã«ã®ã¿åã¬ã³ããªã³ã°ãããŸãã
2. useMemoã䜿çšããŠã³ã³ããã¹ãã®å€ãã¡ã¢åãã
useMemoããã¯ã¯ãäžèŠãªåã¬ã³ããªã³ã°ãé²ãããã«éåžžã«éèŠã§ããããã«ãããã³ã³ããã¹ãã®å€ãã¡ã¢åãããã®äŸåé¢ä¿ã倿Žããããšãã«ã®ã¿æŽæ°ãããããã«ä¿èšŒã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã§ã®åã¬ã³ããªã³ã°ã®æ°ã倧å¹
ã«åæžãããŸãã
äŸïŒuseMemoã®äœ¿çš
const AuthContext = React.createContext();
function AuthProvider({ children }) {
const [user, setUser] = React.useState(null);
const contextValue = React.useMemo(() => ({
user,
login: (userData) => {
setUser(userData);
},
logout: () => {
setUser(null);
}
}), [user]); // Dependency on 'user' state
return (
<AuthContext.Provider value={contextValue}>
{children}
</AuthContext.Provider>
);
}
ãã®äŸã§ã¯ãcontextValueã¯ã¡ã¢åãããŠããŸããããã¯userã®ç¶æ
ã倿Žããããšãã«ã®ã¿æŽæ°ãããŸããããã«ãããèªèšŒã³ã³ããã¹ãã䜿çšããã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãããŸãã
3. ç¶æ ã®å€æŽãåé¢ãã
ã³ã³ããã¹ãå
ã§è€æ°ã®ç¶æ
ãæŽæ°ããå¿
èŠãããå Žåã¯ãå®çšçã§ããã°ãããããå¥ã
ã®ã³ã³ããã¹ãProviderã«åå²ããããšãæ€èšããŠãã ãããããã«ãããåã¬ã³ããªã³ã°ã®ç¯å²ãéå®ãããŸãããããã¯ãProviderå
ã§useReducerããã¯ã䜿çšããŠãé¢é£ããç¶æ
ãããå¶åŸ¡ãããæ¹æ³ã§ç®¡çããããšãã§ããŸãã
äŸïŒè€éãªç¶æ
管çã«useReducerã䜿çšãã
const AppContext = React.createContext();
function appReducer(state, action) {
switch (action.type) {
case 'SET_USER':
return { ...state, user: action.payload };
case 'SET_LANGUAGE':
return { ...state, language: action.payload };
default:
return state;
}
}
function AppProvider({ children }) {
const [state, dispatch] = React.useReducer(appReducer, {
user: null,
language: 'en',
});
const contextValue = React.useMemo(() => ({
state,
dispatch,
}), [state]);
return (
<AppContext.Provider value={contextValue}>
{children}
</AppContext.Provider>
);
}
ãã®ã¢ãããŒãã§ã¯ãé¢é£ãããã¹ãŠã®ç¶æ
倿Žãåäžã®ã³ã³ããã¹ãå
ã«ä¿æãã€ã€ãuseReducerã䜿çšããŠè€éãªç¶æ
ããžãã¯ã管çããããšãã§ããŸãã
4. React.memoãŸãã¯React.useCallbackã§ã³ã³ã·ã¥ãŒããŒãæé©åãã
Providerã®æé©åã¯éèŠã§ãããåã
ã®ã³ã³ã·ã¥ãŒããŒã³ã³ããŒãã³ããæé©åã§ããŸããReact.memoã䜿çšããŠãpropsã倿ŽãããŠããªãå Žåã«é¢æ°ã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãé²ããŸããReact.useCallbackã䜿çšããŠãåã³ã³ããŒãã³ãã«propsãšããŠæž¡ãããã€ãã³ããã³ãã©é¢æ°ãã¡ã¢åããããããäžèŠãªåã¬ã³ããªã³ã°ãåŒãèµ·ãããªãããã«ããŸãã
äŸïŒReact.memoã®äœ¿çš
const ThemedButton = React.memo(function ThemedButton() {
const theme = React.useContext(ThemeContext);
return (
<button style={{ backgroundColor: theme === 'dark' ? 'black' : 'white', color: theme === 'dark' ? 'white' : 'black' }}>
Button
</button>
);
});
ThemedButtonãReact.memoã§ã©ããããããšã«ããããã®propsã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ãããŸãïŒãã®å Žåãæç€ºçã«æž¡ãããŠããªããããThemeContextã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ãããŸãïŒã
äŸïŒReact.useCallbackã®äœ¿çš
function MyComponent() {
const [count, setCount] = React.useState(0);
const increment = React.useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []); // No dependencies, function always memoized.
return <CounterButton onClick={increment} />;
}
const CounterButton = React.memo(({ onClick }) => {
console.log('CounterButton re-rendered');
return <button onClick={onClick}>Increment</button>;
});
ãã®äŸã§ã¯ãincrement颿°ã¯React.useCallbackã䜿çšããŠã¡ã¢åãããŠãããããCounterButtonã¯onClickããããã£ã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ãããŸãããã®é¢æ°ãã¡ã¢åããããMyComponentå
ã§å®çŸ©ãããå Žåãã¬ã³ããªã³ã°ã®ãã³ã«æ°ãã颿°ã€ã³ã¹ã¿ã³ã¹ãäœæãããCounterButtonã®åã¬ã³ããªã³ã°ã匷å¶ãããŸãã
5. å€§èŠæš¡ã¢ããªã±ãŒã·ã§ã³ã®ããã®ã³ã³ããã¹ãåå²
éåžžã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã³ããã¹ããããå°ãããããçŠç¹ã®çµãããã³ã³ããã¹ãã«åå²ããããšãæ€èšããŠãã ããããã¹ãŠã®ã°ããŒãã«ãªç¶æ ãå«ãåäžã®å·šå€§ãªã³ã³ããã¹ããæã€ä»£ããã«ãèªèšŒããŠãŒã¶ãŒèšå®ãã¢ããªã±ãŒã·ã§ã³èšå®ãªã©ãç°ãªãé¢å¿äºã«å¯ŸããŠå¥ã ã®ã³ã³ããã¹ããäœæããŸããããã«ãããåã¬ã³ããªã³ã°ãåé¢ããå šäœçãªããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããã¯ãReact Context APIã«ããããã€ã¯ããµãŒãã¹ã®ãããªãã®ã§ãã
äŸïŒå€§ããªã³ã³ããã¹ãã®åå²
// Instead of a single context for everything...
const AppContext = React.createContext();
// ...create separate contexts for different concerns:
const AuthContext = React.createContext();
const ThemeContext = React.createContext();
const SettingsContext = React.createContext();
ã³ã³ããã¹ããåå²ããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã®äžã€ã®é åã§ã®å€æŽããç¡é¢ä¿ãªé åã§ã®åã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ãäœããªããŸãã
å®äžçã®äŸãšã°ããŒãã«ãªèæ ®äºé
ãããã®æé©åãã¯ããã¯ãå®äžçã®ã·ããªãªã§ã©ã®ããã«é©çšããããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãšå€æ§ãªãŠãŒã¹ã±ãŒã¹ãèæ ®ããªãããããã€ãã®å®è·µçãªäŸãèŠãŠã¿ãŸãããïŒ
äŸ1ïŒåœéåïŒi18nïŒã³ã³ããã¹ã
å€ãã®ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã¯ãè€æ°ã®èšèªãšæåèšå®ããµããŒãããå¿ èŠããããŸããReact Contextã䜿çšããŠãçŸåšã®èšèªãšããŒã«ãªãŒãŒã·ã§ã³ããŒã¿ã管çã§ããŸããéžæãããèšèªã®å€æŽããã¢ããªã±ãŒã·ã§ã³å šäœã§ã¯ãªããããŒã«ã©ã€ãºãããããã¹ãã衚瀺ããã³ã³ããŒãã³ãã®ã¿ãåã¬ã³ããªã³ã°ããããã«ããããšãçæ³çã§ãããããæé©åã¯éåžžã«éèŠã§ãã
å®è£ ïŒ
- çŸåšã®èšèªïŒäŸïŒãenãããfrãããesãããjaãïŒãä¿æããããã®
LanguageContextãäœæããŸãã - çŸåšã®èšèªãšããã倿Žãã颿°ã«ã¢ã¯ã»ã¹ããããã®
useLanguageããã¯ãæäŸããŸãã React.useMemoã䜿çšããŠãçŸåšã®èšèªã«åºã¥ããŠããŒã«ã©ã€ãºãããæååãã¡ã¢åããŸããããã«ãããç¡é¢ä¿ãªç¶æ ã倿Žããããšãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
äŸïŒ
const LanguageContext = React.createContext();
function LanguageProvider({ children }) {
const [language, setLanguage] = React.useState('en');
const translations = React.useMemo(() => {
// Load translations based on the current language from an external source
switch (language) {
case 'fr':
return { hello: 'Bonjour', goodbye: 'Au revoir' };
case 'es':
return { hello: 'Hola', goodbye: 'Adiós' };
default:
return { hello: 'Hello', goodbye: 'Goodbye' };
}
}, [language]);
const value = React.useMemo(() => ({
language,
setLanguage,
t: (key) => translations[key] || key, // Simple translation function
}), [language, translations]);
return (
<LanguageContext.Provider value={value}>
{children}
</LanguageContext.Provider>
);
}
function useLanguage() {
return React.useContext(LanguageContext);
}
ããã§ã翻蚳ãããããã¹ããå¿
èŠãªã³ã³ããŒãã³ãã¯ãuseLanguageããã¯ã䜿çšããŠtïŒç¿»èš³ïŒé¢æ°ã«ã¢ã¯ã»ã¹ã§ããèšèªã倿Žããããšãã«ã®ã¿åã¬ã³ããªã³ã°ãããŸããä»ã®ã³ã³ããŒãã³ãã¯åœ±é¿ãåããŸããã
äŸ2ïŒããŒãåãæ¿ãã³ã³ããã¹ã
ããŒãã»ã¬ã¯ã¿ãŒã®æäŸã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§äžè¬çãªèŠä»¶ã§ããThemeContextãšé¢é£ãããããã€ããŒãå®è£
ããŸããuseMemoã䜿çšããŠãthemeãªããžã§ã¯ããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã®ç¶æ
ã倿Žããããšãã§ã¯ãªããããŒãã倿Žããããšãã«ã®ã¿æŽæ°ãããããã«ããŸãã
ãã®äŸã¯ãå
ã«ç€ºããããã«ãæé©åã®ããã®useMemoãšReact.memoã®ãã¯ããã¯ã瀺ããŠããŸãã
äŸ3ïŒèªèšŒã³ã³ããã¹ã
ãŠãŒã¶ãŒèªèšŒã®ç®¡çã¯é »ç¹ã«è¡ãããã¿ã¹ã¯ã§ããAuthContextãäœæããŠããŠãŒã¶ãŒã®èªèšŒç¶æ
ïŒäŸïŒãã°ã€ã³æžã¿ãŸãã¯ãã°ã¢ãŠãæžã¿ïŒã管çããŸããèªèšŒç¶æ
ãšé¢æ°ïŒloginãlogoutïŒã«React.useMemoã䜿çšããŠæé©åããããããã€ããŒãå®è£
ããã³ã³ã·ã¥ãŒããŒã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
å®è£ ã«é¢ããèæ ®äºé ïŒ
- ã°ããŒãã«ãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒ ã¢ããªã±ãŒã·ã§ã³å šäœã®ããããŒãããã²ãŒã·ã§ã³ããŒã«ãŠãŒã¶ãŒåºæã®æ å ±ã衚瀺ããŸãã
- å®å šãªããŒã¿ãã§ããïŒ ãã¹ãŠã®ãµãŒããŒãµã€ããªã¯ãšã¹ããä¿è·ããèªèšŒããŒã¯ã³ãšçŸåšã®ãŠãŒã¶ãŒã«äžèŽããèªå¯ãæ€èšŒããŸãã
- åœé察å¿ïŒ ãšã©ãŒã¡ãã»ãŒãžãšèªèšŒãããŒãçŸå°ã®èŠå¶ã«æºæ ããããŒã«ã©ã€ãºãããèšèªããµããŒãããããã«ããŸãã
ããã©ãŒãã³ã¹ãã¹ããšã¢ãã¿ãªã³ã°
æé©åãã¯ããã¯ãé©çšããåŸã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããã¹ãããã³ã¢ãã¿ãªã³ã°ããããšãäžå¯æ¬ ã§ãã以äžã«ããã€ãã®æŠç¥ã瀺ããŸãïŒ
- React DevTools ProfilerïŒ React DevTools Profilerã䜿çšããŠãäžèŠã«åã¬ã³ããªã³ã°ãããŠããã³ã³ããŒãã³ããç¹å®ããŸãããã®ããŒã«ã¯ãã³ã³ããŒãã³ãã®ã¬ã³ããŒããã©ãŒãã³ã¹ã«é¢ããè©³çŽ°ãªæ å ±ãæäŸããŸãããHighlight Updatesããªãã·ã§ã³ã䜿çšãããšã倿Žäžã«åã¬ã³ããªã³ã°ããããã¹ãŠã®ã³ã³ããŒãã³ãã確èªã§ããŸãã
- ããã©ãŒãã³ã¹ã¡ããªã¯ã¹ïŒ First Contentful PaintïŒFCPïŒãTime to InteractiveïŒTTIïŒãªã©ã®äž»èŠãªããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãç£èŠããŠãæé©åããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«äžãã圱é¿ãè©äŸ¡ããŸããLighthouseïŒChrome DevToolsã«çµ±åïŒãªã©ã®ããŒã«ã¯ã貎éãªæŽå¯ãæäŸããŸãã
- ãããã¡ã€ãªã³ã°ããŒã«ïŒ ãã©ãŠã¶ã®ãããã¡ã€ãªã³ã°ããŒã«ãå©çšããŠãã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ãç¶æ ã®æŽæ°ãªã©ãããŸããŸãªã¿ã¹ã¯ã«è²»ããããæéãæž¬å®ããŸããããã«ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- ãã³ãã«ãµã€ãºåæïŒ æé©åããã³ãã«ãµã€ãºã®å¢å ã«ã€ãªãããªãããã«ããŸãããã³ãã«ã倧ãããšãèªã¿èŸŒã¿æéã«æªåœ±é¿ãåãŒãå¯èœæ§ããããŸããwebpack-bundle-analyzerãªã©ã®ããŒã«ã¯ããã³ãã«ãµã€ãºã®åæã«åœ¹ç«ã¡ãŸãã
- A/Bãã¹ãïŒ ããŸããŸãªæé©åã¢ãããŒããA/Bãã¹ãããŠãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã§æã倧ããªããã©ãŒãã³ã¹åäžããããããã¯ããã¯ã倿ããããšãæ€èšããŸãã
ãã¹ããã©ã¯ãã£ã¹ãšå®è·µçãªæŽå¯
èŠçŽãããšãReact Contextãæé©åããããã®äž»èŠãªãã¹ããã©ã¯ãã£ã¹ãšããããžã§ã¯ãã§å®è£ ããããã®å®è·µçãªæŽå¯ã以äžã«ç€ºããŸãïŒ
- åžžã«ãããã€ããŒãã¿ãŒã³ã䜿çšããïŒ ã³ã³ããã¹ãã®å€ã®ç®¡çãå¥ã®ã³ã³ããŒãã³ãã«ã«ãã»ã«åããŸãã
useMemoã§ã³ã³ããã¹ãã®å€ãã¡ã¢åããïŒ äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸããã³ã³ããã¹ãã®å€ã¯ããã®äŸåé¢ä¿ã倿Žããããšãã«ã®ã¿æŽæ°ããŸãã- ç¶æ
ã®å€æŽãåé¢ããïŒ åã¬ã³ããªã³ã°ãæå°éã«æããããã«ã³ã³ããã¹ããåå²ããŸããè€éãªç¶æ
ã管çããããã«
useReducerãæ€èšããŸãã React.memoãšReact.useCallbackã§ã³ã³ã·ã¥ãŒããŒãæé©åããïŒ ã³ã³ã·ã¥ãŒããŒã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ãåäžãããŸãã- ã³ã³ããã¹ãã®åå²ãæ€èšããïŒ å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç°ãªãé¢å¿äºã«å¯ŸããŠã³ã³ããã¹ããåå²ããŸãã
- ããã©ãŒãã³ã¹ããã¹ãããã³ã¢ãã¿ãªã³ã°ããïŒ React DevToolsããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã«ããã¯ãç¹å®ããŸãã
- 宿çã«ã¬ãã¥ãŒãšãªãã¡ã¯ã¿ãªã³ã°ãè¡ãïŒ æé©ãªããã©ãŒãã³ã¹ãç¶æããããã«ãã³ãŒããç¶ç¶çã«è©äŸ¡ããã³ãªãã¡ã¯ã¿ãªã³ã°ããŸãã
- ã°ããŒãã«ãªèŠç¹ïŒ ç°ãªãã¿ã€ã ãŸãŒã³ããã±ãŒã«ããã¯ãããžãŒãšã®äºææ§ã確ä¿ããããã«æŠç¥ãé©å¿ãããŸããããã«ã¯ãi18nextãreact-intlãªã©ã®ã©ã€ãã©ãªã䜿çšããèšèªãµããŒãã®æ€èšãå«ãŸããŸãã
ãããã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšä¿å®æ§ãå€§å¹ ã«åäžãããäžçäžã®ãŠãŒã¶ãŒã«ããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸããæåããæé©åãåªå ããã³ãŒããç¶ç¶çã«èŠçŽããŠæ¹åã®äœå°ãããé åãæ¢ããŠãã ãããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®æé·ã«äŒŽãã¹ã±ãŒã©ããªãã£ãšããã©ãŒãã³ã¹ã確ä¿ãããŸãã
çµè«
React Contextã¯ãReactã¢ããªã±ãŒã·ã§ã³ã§ã°ããŒãã«ãªç¶æ
ã管çããããã®åŒ·åã§æè»ãªæ©èœã§ããæœåšçãªããã©ãŒãã³ã¹ã®èœãšã穎ãçè§£ããé©åãªæé©åãã¯ããã¯ãåãããããã€ããŒãã¿ãŒã³ãå®è£
ããããšã§ãåªé
ã«ã¹ã±ãŒã«ããå
ç¢ã§å¹ççãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããuseMemoãReact.memoãReact.useCallbackããã³ã³ããã¹ãèšèšã®æ
éãªæ€èšãšãšãã«æŽ»çšããããšã§ãåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸããããã«ããã¯ãç¹å®ããŠå¯ŸåŠããããã«ãåžžã«ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããã¹ãããã³ã¢ãã¿ãªã³ã°ããããšãå¿ããªãã§ãã ãããReactã®ã¹ãã«ãšç¥èãé²åããã«ã€ããŠããããã®æé©åãã¯ããã¯ã¯ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ããã©ãŒãã³ã¹ãé«ããä¿å®æ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã®äžå¯æ¬ ãªããŒã«ãšãªãã§ãããã