Reactã®experimental_useContextSelectorããã¯ã«ã€ããŠæ·±ãæãäžããè€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããããã©ãŒãã³ã¹æé©åãšå¹ççãªç¶æ 管çãžã®ã¡ãªãããæ¢ããŸããã³ã³ããŒãã³ããå¿ èŠãšããããŒã¿ã®ã¿ãã³ã³ããã¹ãããéžæããäžèŠãªåã¬ã³ããªã³ã°ãé²ãæ¹æ³ãåŠã³ãŸãããã
React experimental_useContextSelector: ãã现ãããªã³ã³ããã¹ãå©çš
Reactã®Context APIã¯ãæç€ºçãªããããããªãªã³ã°ãªãã§ã¢ããªã±ãŒã·ã§ã³å šäœã«ç¶æ ãšãããããå ±æããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸããããããããã©ã«ãã®Context APIã®å®è£ ã¯ãç¹ã«ã³ã³ããã¹ãå€ãé »ç¹ã«å€æŽãããå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããããšããããŸããã³ã³ããŒãã³ããã³ã³ããã¹ãã®ããäžéšã«ã®ã¿äŸåããŠããå Žåã§ããã³ã³ããã¹ãå€ã®å€æŽã¯ããã®ã³ã³ããã¹ããå©çšãããã¹ãŠã®ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããäžå¿ èŠãªåã¬ã³ããªã³ã°ãããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ã€ãªããå¯èœæ§ããããŸãã
ãã®å¶éã«å¯ŸåŠãããããReactã¯experimental_useContextSelector
ããã¯ãå°å
¥ããŸããïŒååã瀺ãéããçŸåšã¯å®é𿮵éã§ãïŒããã®ããã¯ã䜿çšãããšãã³ã³ããŒãã³ããå¿
èŠãªã³ã³ããã¹ãã®ç¹å®ã®éšåã®ã¿ã賌èªã§ããã³ã³ããã¹ãã®ä»ã®éšåã倿ŽãããŠãåã¬ã³ããªã³ã°ãé²ããŸãããã®ã¢ãããŒãã«ãããäžèŠãªã³ã³ããŒãã³ãã®æŽæ°åæ°ãæžããããšã§ããã©ãŒãã³ã¹ã倧å¹
ã«æé©åããŸãã
åé¡ã®çè§£: åŸæ¥ã®Context APIãšåã¬ã³ããªã³ã°
experimental_useContextSelector
ã«ã€ããŠè©³ãã説æããåã«ãæšæºã®Context APIã«ãããæœåšçãªããã©ãŒãã³ã¹ã®åé¡ãäŸã§ç€ºããŸãããããŠãŒã¶ãŒæ
å ±ãèšå®ãèªèšŒã¹ããŒã¿ã¹ãä¿åããã°ããŒãã«ãªãŠãŒã¶ãŒã³ã³ããã¹ããèããŠã¿ãŸãã
const UserContext = React.createContext({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
function App() {
const [user, setUser] = React.useState({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
const updateUser = (newUser) => {
setUser(newUser);
};
return (
);
}
function Profile() {
const { userInfo } = React.useContext(UserContext);
return (
{userInfo.name}
Email: {userInfo.email}
Country: {userInfo.country}
);
}
function Settings() {
const { preferences, updateUser } = React.useContext(UserContext);
const toggleTheme = () => {
updateUser({
...user,
preferences: { ...preferences, theme: preferences.theme === 'light' ? 'dark' : 'light' },
});
};
return (
Theme: {preferences.theme}
);
}
ãã®ã·ããªãªã§ã¯ãProfile
ã³ã³ããŒãã³ãã¯userInfo
ããããã£ã®ã¿ã䜿çšããSettings
ã³ã³ããŒãã³ãã¯preferences
ããã³updateUser
ããããã£ã䜿çšããŸããSettings
ã³ã³ããŒãã³ããããŒããæŽæ°ããpreferences
ãªããžã§ã¯ãã«å€æŽãçããå ŽåãProfile
ã³ã³ããŒãã³ãã¯preferences
ã«å
šãäŸåããŠããªãã«ãããããããåã¬ã³ããªã³ã°ãããŸããããã¯ãReact.useContext
ãã³ã³ããŒãã³ããã³ã³ããã¹ãå€å
šäœã«è³Œèªãããããã§ãããã®ãããªäžèŠãªåã¬ã³ããªã³ã°ã¯ã倿°ã®ã³ã³ããã¹ãæ¶è²»è
ãæã€ããè€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠãé倧ãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãšãªãå¯èœæ§ããããŸãã
experimental_useContextSelectorã®å°å ¥: éžæçãªã³ã³ããã¹ãå©çš
experimental_useContextSelector
ããã¯ã¯ãã³ã³ããŒãã³ããå¿
èŠãªã³ã³ããã¹ãã®ç¹å®ã®éšåã®ã¿ãéžæã§ããããã«ããããšã§ããã®åé¡ã®è§£æ±ºçãæäŸããŸãããã®ããã¯ã¯2ã€ã®åŒæ°ãåããŸãã
- ã³ã³ããã¹ããªããžã§ã¯ãïŒ
React.createContext
ã§äœæãããã®ïŒã - ã³ã³ããã¹ãå€å šäœãåŒæ°ãšããŠåãåããã³ã³ããŒãã³ããå¿ èŠãšããç¹å®ã®å€ãè¿ãã»ã¬ã¯ã¿ãŒé¢æ°ã
ã³ã³ããŒãã³ãã¯ãéžæãããå€ã倿Žãããå Žåã®ã¿åã¬ã³ããªã³ã°ãããŸãïŒå³å¯ãªç䟡æ§===
ã䜿çšïŒãããã«ããã以åã®äŸãæé©åããProfile
ã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ãããšãã§ããŸãã
experimental_useContextSelectorã䜿çšããäŸã®ãªãã¡ã¯ã¿ãªã³ã°
experimental_useContextSelector
ã䜿çšããŠãåã®äŸããªãã¡ã¯ã¿ãªã³ã°ããæ¹æ³ã次ã«ç€ºããŸãã
import { unstable_useContextSelector as useContextSelector } from 'use-context-selector';
const UserContext = React.createContext({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
function App() {
const [user, setUser] = React.useState({
userInfo: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
},
preferences: {
theme: 'light',
language: 'en-US',
notificationsEnabled: true
},
isAuthenticated: false
});
const updateUser = (newUser) => {
setUser(newUser);
};
return (
);
}
function Profile() {
const userInfo = useContextSelector(UserContext, (context) => context.userInfo);
return (
{userInfo.name}
Email: {userInfo.email}
Country: {userInfo.country}
);
}
function Settings() {
const preferences = useContextSelector(UserContext, (context) => context.preferences);
const updateUser = useContextSelector(UserContext, (context) => context.updateUser);
const toggleTheme = () => {
updateUser({
...user,
preferences: { ...preferences, theme: preferences.theme === 'light' ? 'dark' : 'light' },
});
};
return (
Theme: {preferences.theme}
);
}
ãã®ãªãã¡ã¯ã¿ãªã³ã°ãããäŸã§ã¯ãProfile
ã³ã³ããŒãã³ãã¯useContextSelector
ã䜿çšããŠã³ã³ããã¹ãããuserInfo
ããããã£ã®ã¿ãéžæããŠããŸãããããã£ãŠãSettings
ã³ã³ããŒãã³ããããŒããæŽæ°ããŠããuserInfo
ããããã£ã¯å€æŽãããªããããProfile
ã³ã³ããŒãã³ãã¯åã¬ã³ããªã³ã°ãããŸãããåæ§ã«ãSettings
ã³ã³ããŒãã³ãã¯å¿
èŠãªpreferences
ãšupdateUser
ããããã£ã®ã¿ãéžæããããã«ããã©ãŒãã³ã¹ãæé©åããŸãã
éèŠãªæ³šæç¹: unstable_useContextSelector
ã¯use-context-selector
ããã±ãŒãžããã€ã³ããŒãããããšãå¿ããªãã§ãã ãããååã瀺ãéãããã®ããã¯ã¯ãŸã å®é𿮵éã§ãããä»åŸã®ReactãªãªãŒã¹ã§å€æŽãããå¯èœæ§ããããŸããuse-context-selector
ããã±ãŒãžã¯å§ããã®ã«è¯ãéžæè¢ã§ããããã®æ©èœãå®å®çã«ãªã£ãéã«ReactããŒã ããã®API倿Žã®å¯èœæ§ã«æ³šæããŠãã ããã
experimental_useContextSelectorã䜿çšããã¡ãªãã
- ããã©ãŒãã³ã¹ã®åäž: éžæãããã³ã³ããã¹ãå€ã倿Žãããå Žåã«ã®ã¿ã³ã³ããŒãã³ããæŽæ°ããããšã§ãäžèŠãªåã¬ã³ããªã³ã°ãåæžããŸããããã¯ãã³ã³ããã¹ãããŒã¿ãé »ç¹ã«å€æŽãããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«æçã§ãã
- ãã现ãããªå¶åŸ¡: ã³ã³ããŒãã³ããã³ã³ããã¹ãã®ã©ã®éšåã賌èªãããã«ã€ããŠãæ£ç¢ºãªå¶åŸ¡ãæäŸããŸãã
- ã³ã³ããŒãã³ãããžãã¯ã®ç°¡çŽ å: ã³ã³ããŒãã³ãã¯ç¹å®ã®äŸåé¢ä¿ã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ããããããã³ã³ããŒãã³ãã®æŽæ°ã«ã€ããŠæšè«ãããããªããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- ã»ã¬ã¯ã¿ãŒé¢æ°ã®ããã©ãŒãã³ã¹: ã»ã¬ã¯ã¿ãŒé¢æ°ãããã©ãŒãã³ã¹ã«åªããŠããããšã確èªããè€éãªèšç®ãé«ã³ã¹ããªæäœãé¿ããŠãã ãããã»ã¬ã¯ã¿ãŒé¢æ°ã¯ã³ã³ããã¹ãã倿Žããããã³ã«åŒã³åºãããããããã®ããã©ãŒãã³ã¹ãæé©åããããšãéèŠã§ãã
- ã¡ã¢å: ã»ã¬ã¯ã¿ãŒé¢æ°ããåºãšãªãããŒã¿ã倿ŽãããŠããªããŠããåŒã³åºããããã³ã«æ°ãããªããžã§ã¯ããé
åãè¿ãå Žåãã³ã³ããŒãã³ãã¯åã¬ã³ããªã³ã°ãããŸããé¢é£ããããŒã¿ãå®éã«å€æŽãããå Žåã«ã®ã¿ã»ã¬ã¯ã¿ãŒé¢æ°ãæ°ããå€ãè¿ãããã«ãã¡ã¢åæè¡ïŒäŸ:
React.useMemo
ãReselectã®ãããªã©ã€ãã©ãªïŒã®äœ¿çšãæ€èšããŠãã ããã - ã³ã³ããã¹ãå€ã®æ§é : ç¡é¢ä¿ãªããŒã¿ãåæã«å€æŽãããå¯èœæ§ãæå°éã«æãããããªæ¹æ³ã§ã³ã³ããã¹ãå€ãæ§é åããããšãæ€èšããŠãã ãããäŸãã°ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã®ç°ãªãåŽé¢ãå¥ã ã®ã³ã³ããã¹ãã«åããããšãã§ããŸãã
- ä»£æ¿æ¡: ã¢ããªã±ãŒã·ã§ã³ã®è€éãã«å¿ããŠãReduxãZustandãJotaiãªã©ã®ä»£æ¿ã®ç¶æ 管çãœãªã¥ãŒã·ã§ã³ãæ€èšããŠãã ããããããã®ã©ã€ãã©ãªã¯ãã°ããŒãã«ç¶æ ã®ç®¡çãšããã©ãŒãã³ã¹ã®æé©åã®ããã®ããé«åºŠãªæ©èœãæäŸããŸãã
- å®éšçãªã¹ããŒã¿ã¹:
experimental_useContextSelector
ããŸã å®é𿮵éã§ããããšãèªèããŠãããŠãã ãããAPIã¯å°æ¥ã®ReactãªãªãŒã¹ã§å€æŽãããå¯èœæ§ããããŸããuse-context-selector
ããã±ãŒãžã¯å®å®ããä¿¡é Œæ§ã®é«ãå®è£ ãæäŸããŸãããã³ã¢APIã®æœåšçãªå€æŽã«ã€ããŠã¯åžžã«Reactã®æŽæ°ãç£èŠããŠãã ããã
å®éã®äŸãšãŠãŒã¹ã±ãŒã¹
ããã§ã¯ãexperimental_useContextSelector
ãç¹ã«åœ¹ç«ã€å®éã®äŸãããã€ã玹ä»ããŸãã
- ããŒã管ç: ã«ã¹ã¿ãã€ãºå¯èœãªããŒããæã€ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
experimental_useContextSelector
ã䜿çšããŠãã³ã³ããŒãã³ããçŸåšã®ããŒãèšå®ã®ã¿ã賌èªã§ããããã«ããä»ã®ã¢ããªã±ãŒã·ã§ã³èšå®ã倿Žããããšãã®åã¬ã³ããªã³ã°ãé²ãããšãã§ããŸããäŸãã°ãã°ããŒãã«ã«ç°ãªãã«ã©ãŒããŒãããŠãŒã¶ãŒã«æäŸããEã³ããŒã¹ãµã€ããèããŠã¿ãŸããããè²ã®ã¿ã衚瀺ããã³ã³ããŒãã³ãïŒãã¿ã³ãèæ¯ãªã©ïŒã¯ãã³ã³ããã¹ãå ã®theme
ããããã£ã®ã¿ã賌èªãããŠãŒã¶ãŒã®é貚èšå®ã倿Žãããå Žåãªã©ã®äžèŠãªåã¬ã³ããªã³ã°ãåé¿ããŸãã - åœéå (i18n): å€èšèªã¢ããªã±ãŒã·ã§ã³ã§ç¿»èš³ã管çããå Žåã
experimental_useContextSelector
ã䜿çšããŠãã³ã³ããŒãã³ããçŸåšã®ãã±ãŒã«ãŸãã¯ç¹å®ã®ç¿»èš³ã®ã¿ã賌èªã§ããããã«ããããšãã§ããŸããäŸãã°ãã°ããŒãã«ãªãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ãããåäžã®æçš¿ã®ç¿»èš³ïŒäŸïŒè±èªããã¹ãã€ã³èªãžïŒã倿Žãããå Žåããã®ç¹å®ã®æçš¿ã®ç¿»èš³ã®ã¿ã倿Žãããã®ã§ããã°ããã¥ãŒã¹ãã£ãŒãå šäœãåã¬ã³ããªã³ã°ãããã¹ãã§ã¯ãããŸãããuseContextSelector
ã¯ãé¢é£ããã³ã³ããŒãã³ãã®ã¿ãæŽæ°ãããããšãä¿èšŒããŸãã - ãŠãŒã¶ãŒèªèšŒ: ãŠãŒã¶ãŒèªèšŒãå¿
èŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
experimental_useContextSelector
ã䜿çšããŠãã³ã³ããŒãã³ãããŠãŒã¶ãŒã®èªèšŒã¹ããŒã¿ã¹ã®ã¿ã賌èªã§ããããã«ããä»ã®ãŠãŒã¶ãŒãããã¡ã€ã«æ å ±ã倿Žããããšãã®åã¬ã³ããªã³ã°ãé²ãããšãã§ããŸããäŸãã°ããªã³ã©ã€ã³ãã³ãã³ã°ãã©ãããã©ãŒã ã®å£åº§æŠèŠã³ã³ããŒãã³ãã¯ãã³ã³ããã¹ãããã®userId
ã«ã®ã¿äŸåãããããããŸããããŠãŒã¶ãŒããããã¡ã€ã«èšå®ã§äœæãæŽæ°ããŠããå£åº§æŠèŠã³ã³ããŒãã³ãã¯åã¬ã³ããªã³ã°ããå¿ èŠããªããããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãã - ãã©ãŒã 管ç: è€æ°ã®ãã£ãŒã«ããæã€è€éãªãã©ãŒã ãæ±ãå Žåã
experimental_useContextSelector
ã䜿çšããŠãåã ã®ãã©ãŒã ãã£ãŒã«ãããããã®ç¹å®ã®å€ã®ã¿ã賌èªã§ããããã«ããä»ã®ãã£ãŒã«ãã倿Žããããšãã®åã¬ã³ããªã³ã°ãé²ãããšãã§ããŸãããã¶ã®å€æ®µéç³è«ãã©ãŒã ãæ³åããŠã¿ãŠãã ãããåã¹ãããïŒååãäœæããã¹ããŒãã®è©³çްïŒã¯åé¢ã§ããåãã£ãŒã«ãã®æŽæ°åŸã«ãã©ãŒã å šäœãåã¬ã³ããªã³ã°ãããã®ã§ã¯ãªãããã®ç¹å®ã®ã¹ãããå ã®ããŒã¿ã倿Žãããå Žåã«ã®ã¿åã¬ã³ããªã³ã°ãããŸãã
ãŸãšã
experimental_useContextSelector
ã¯ãContext APIã䜿çšããReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã®è²ŽéãªããŒã«ã§ããã³ã³ããŒãã³ããå¿
èŠãªã³ã³ããã¹ãã®ç¹å®ã®éšåã®ã¿ãéžæã§ããããã«ããããšã§ãäžèŠãªåã¬ã³ããªã³ã°ãé²ããã¢ããªã±ãŒã·ã§ã³å
šäœã®å¿çæ§ãåäžãããŸãããŸã å®é𿮵éã§ãããReactãšã³ã·ã¹ãã ãžã®ææãªè¿œå ã§ãããããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§æ€èšãã䟡å€ããããŸããããã¯ãæçããã«ã€ããŠãåžžã«åŸ¹åºçãªãã¹ããè¡ããæœåšçãªAPI倿Žã«æ³šæããŠãã ãããè€éãªç¶æ
管çãé »ç¹ãªã³ã³ããã¹ãæŽæ°ã«èµ·å ããããã©ãŒãã³ã¹ããã«ããã¯ã«å¯ŸåŠããéã«ãReactã®ããŒã«ããã¯ã¹ãžã®åŒ·åãªè¿œå æ©èœãšããŠæ€èšããŠãã ãããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ã䜿çšç¶æ³ãæ
éã«åæããexperimental_useContextSelector
ãæŠç¥çã«é©çšããããšã§ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã倧å¹
ã«åäžãããããå¹ççã§ã¹ã±ãŒã©ãã«ãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã