Reactã®useActionStateããã¯ã®åãæŽ»çšããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãæ¢ããŸããã¢ã¯ã·ã§ã³ã§å¹ççã«ç¶æ ã管çããã³ãŒãã®å¯èªæ§ãä¿å®æ§ããã¹ãæ§ãåäžãããæ¹æ³ãåŠã³ãŸãã
React useActionState: ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®ã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管ç
çŸä»£ã®ãŠã§ãéçºã®ãã€ãããã¯ãªç¶æ³ã«ãããŠãã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã¯æãéèŠãªé¢å¿äºã§ããReactã¯ããã®ã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ã«ãããè€éãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããã®å ç¢ãªåºç€ãæäŸããŸããããããã¢ããªã±ãŒã·ã§ã³ãè€éã«ãªãã«ã€ããŠãç¶æ ã广çã«ç®¡çããããšã¯ãŸããŸãå°é£ã«ãªããŸããããã§`useActionState`ããã¯ã®ãããªç¶æ 管çãœãªã¥ãŒã·ã§ã³ãéåžžã«äŸ¡å€ã®ãããã®ã«ãªããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ã`useActionState`ã®è€éããæãäžããã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å©ç¹ãå®è£ ããã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
ç¶æ 管çã®å¿ èŠæ§ãçè§£ãã
`useActionState`ã«é£ã³èŸŒãåã«ãReactéçºã«ãããŠãªãç¶æ 管çãéèŠãªã®ããçè§£ããããšãäžå¯æ¬ ã§ããReactã³ã³ããŒãã³ãã¯ãç¬ç«ããŠèªå·±å®çµåã§ããããã«èšèšãããŠããŸããããããå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã³ããŒãã³ãéã§ããŒã¿ãå ±æããæŽæ°ããå¿ èŠããããŸãããã®å ±æããŒã¿ãã€ãŸããç¶æ ãã¯ãããã«ç®¡çãè€éã«ãªããæ¬¡ã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- ããããããªãªã³ã°ïŒç¶æ ãšæŽæ°é¢æ°ãè€æ°ã®ã³ã³ããŒãã³ãå±€ãä»ããŠæž¡ããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãäœäžãããŸãã
- ã³ã³ããŒonentã®åã¬ã³ããªã³ã°ïŒç¶æ ãå€åããéã®ã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- ãããã°ã®å°é£ãïŒç¹ã«å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¶æ å€åã®åå ãçªãæ¢ããã®ãå°é£ã«ãªãããšããããŸãã
广çãªç¶æ 管çãœãªã¥ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã管çããããã®éäžçã§äºæž¬å¯èœãªæ¹æ³ãæäŸããããšã§ããããã®åé¡ã«å¯ŸåŠããŸãããããã¯ãã°ãã°ä»¥äžãå«ã¿ãŸãã
- ä¿¡é Œã§ããå¯äžã®æ å ±æºïŒsingle source of truthïŒïŒäžå€®ã®ã¹ãã¢ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãä¿æããŸãã
- äºæž¬å¯èœãªç¶æ é·ç§»ïŒç¶æ ã®å€æŽã¯ãæç¢ºã«å®çŸ©ãããã¢ã¯ã·ã§ã³ãéããŠè¡ãããŸãã
- å¹ççãªããŒã¿ã¢ã¯ã»ã¹ïŒã³ã³ããŒãã³ãã¯ç¶æ ã®ç¹å®ã®éšåã賌èªã§ããåã¬ã³ããªã³ã°ãæå°éã«æããŸãã
`useActionState`ã®ç޹ä»
`useActionState`ã¯ã仮説çãªïŒçŸåšã®æ¥ä»ã§ã¯ããã®ããã¯ã¯Reactã®çµã¿èŸŒã¿æ©èœã§ã¯*ãªã*ã*æŠå¿µ*ã衚ããŸãïŒReactããã¯ã§ãããã¢ã¯ã·ã§ã³ã䜿çšããŠç¶æ ã管çããããã®ã¯ãªãŒã³ã§ç°¡æœãªæ¹æ³ãæäŸããŸããããã¯ãç¶æ ã®æŽæ°ãç°¡çŽ åããã³ãŒãã®å¯èªæ§ãåäžãããããã«èšèšãããŠããŸããçµã¿èŸŒã¿ã§ã¯ãããŸããããZustandãJotaiãªã©ã®ã©ã€ãã©ãªããããã¯Reactã®`useReducer`ãš`useContext`ã䜿çšããã«ã¹ã¿ã å®è£ ã§åæ§ã®ãã¿ãŒã³ãå®è£ ã§ããŸããããã§æäŸãããäŸã¯ããã®ãããªããã¯ãäžæ žãšãªãååã説æããããã«*ã©ã®ããã«*æ©èœãããã瀺ããŠããŸãã
ãã®æ žãšãªã`useActionState`ã¯ããã¢ã¯ã·ã§ã³ããšããæŠå¿µãäžå¿ã«å±éããŸããã¢ã¯ã·ã§ã³ã¯ãç¹å®ã®ç¶æ é·ç§»ãèšè¿°ãã颿°ã§ããã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšãäºæž¬å¯èœãªæ¹æ³ã§ç¶æ ãæŽæ°ãããŸãããã®ã¢ãããŒãã¯ãé¢å¿ã®æç¢ºãªåé¢ãä¿é²ããã³ãŒããçè§£ããä¿å®ãããã¹ãããããããŸãã仮説çãªå®è£ ãæ³åããŠã¿ãŸãããïŒããã¯æŠå¿µãçè§£ããããã®åçŽåãããå³ã§ããããšã«æ³šæããŠãã ããïŒã
```javascript import { useReducer } from 'react'; // ã·ã³ãã«ãªã¢ã¯ã·ã§ã³ã¿ã€ãã®å®çŸ©ãæ³åããŠãã ããïŒãã匷åãªåä»ãã«ã¯Typescriptã䜿çšã§ããŸãïŒ const ACTION_TYPES = { SET_NAME: 'SET_NAME', INCREMENT_COUNTER: 'INCREMENT_COUNTER', DECREMENT_COUNTER: 'DECREMENT_COUNTER', }; // åæç¶æ ãå®çŸ© const initialState = { name: 'Guest', counter: 0, }; // reducer颿°ãå®çŸ© const reducer = (state, action) => { switch (action.type) { case ACTION_TYPES.SET_NAME: return { ...state, name: action.payload }; case ACTION_TYPES.INCREMENT_COUNTER: return { ...state, counter: state.counter + 1 }; case ACTION_TYPES.DECREMENT_COUNTER: return { ...state, counter: state.counter - 1 }; default: return state; } }; // useActionStateã®ä»®èª¬çãªå®è£ ïŒèª¬æçšïŒ const useActionState = (initialState, reducer) => { const [state, dispatch] = useReducer(reducer, initialState); const actions = { setName: (name) => { dispatch({ type: ACTION_TYPES.SET_NAME, payload: name }); }, incrementCounter: () => { dispatch({ type: ACTION_TYPES.INCREMENT_COUNTER }); }, decrementCounter: () => { dispatch({ type: ACTION_TYPES.DECREMENT_COUNTER }); }, }; return [state, actions]; }; export { useActionState }; ```ãã®ä»®èª¬çãªäŸã¯ãããã¯ãã©ã®ããã«ç¶æ ã管çããã¢ã¯ã·ã§ã³ãå ¬éãããã瀺ããŠããŸããã³ã³ããŒãã³ãã¯reducer颿°ãåŒã³åºããã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠç¶æ ã倿ŽããŸãã
`useActionState`ã®å®è£ ïŒæŠå¿µäŸïŒ
Reactã³ã³ããŒãã³ãã§ãŠãŒã¶ãŒã®ãããã£ãŒã«æ å ±ãšã«ãŠã³ã¿ãŒã管çããããã«ã`useActionState`ã®å®è£ ïŒ*䜿çšãããã*æ¹æ³ãšåæ§ã«ïŒãã©ã®ããã«äœ¿çšãããã宿ŒããŠã¿ãŸãããã
```javascript import React from 'react'; import { useActionState } from './useActionState'; // åã®äŸã®ã³ãŒãããããšä»®å® // ã¢ã¯ã·ã§ã³ã¿ã€ãïŒã¢ã¯ã·ã§ã³ã¿ã€ããäžè²«ããŠå®çŸ©ããïŒ const PROFILE_ACTION_TYPES = { SET_NAME: 'SET_NAME', SET_EMAIL: 'SET_EMAIL', }; const COUNTER_ACTION_TYPES = { INCREMENT: 'INCREMENT', DECREMENT: 'DECREMENT', }; // ãããã£ãŒã«Reducer const profileReducer = (state, action) => { switch (action.type) { case PROFILE_ACTION_TYPES.SET_NAME: return { ...state, name: action.payload }; case PROFILE_ACTION_TYPES.SET_EMAIL: return { ...state, email: action.payload }; default: return state; } }; // ã«ãŠã³ã¿ãŒReducer const counterReducer = (state, action) => { switch (action.type) { case COUNTER_ACTION_TYPES.INCREMENT: return { ...state, count: state.count + 1 }; case COUNTER_ACTION_TYPES.DECREMENT: return { ...state, count: state.count - 1 }; default: return state; } }; // åæç¶æ const initialProfileState = { name: 'User', email: '' }; const initialCounterState = { count: 0 }; function ProfileComponent() { const [profile, profileActions] = useActionState(initialProfileState, profileReducer); const [counter, counterActions] = useActionState(initialCounterState, counterReducer); return (ãŠãŒã¶ãŒãããã£ãŒã«
åå: {profile.name}
ã¡ãŒã«: {profile.email}
profileActions.setName(e.target.value)} />ã«ãŠã³ã¿ãŒ
ã«ãŠã³ã: {counter.count}
ãã®äŸã§ã¯ããŠãŒã¶ãŒãããã£ãŒã«çšãšã«ãŠã³ã¿ãŒçšã«ã2ã€ã®å¥ã ã®reducerãšåæç¶æ ãå®çŸ©ããŠããŸãããããŠ`useActionState`ããã¯ããã¢ããªã±ãŒã·ã§ã³ã®åéšåã®ç¶æ ãšã¢ã¯ã·ã§ã³é¢æ°ãæäŸããŸãã
ã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管çã®å©ç¹
`useActionState`ã®ãããªã¢ã¯ã·ã§ã³ããŒã¹ã®ã¢ãããŒããç¶æ 管çã«æ¡çšããããšã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- ã³ãŒãã®å¯èªæ§ã®åäžïŒã¢ã¯ã·ã§ã³ã¯ç¶æ 倿Žã®æå³ãæç¢ºã«å®çŸ©ãããããã³ãŒããçè§£ãããããªããŸãã倿Žã®ç®çãããã«ããããŸãã
- ä¿å®æ§ã®åäžïŒç¶æ ããžãã¯ãreducerãšã¢ã¯ã·ã§ã³å ã«éäžãããããšã§ã倿ŽãæŽæ°ãããç°¡åã«ãªããŸãã倿Žã屿åãããããããã°ãå°å ¥ãããªã¹ã¯ãæžå°ããŸãã
- ãã¹ãã®ç°¡çŽ åïŒã¢ã¯ã·ã§ã³ã¯ç¬ç«ããŠç°¡åã«ãã¹ãã§ããŸããç¹å®ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšãã«ç¶æ ãæåŸ ã©ããã«å€åãããããã¹ãã§ããŸããã¢ãã¯ãã¹ã¿ãã®äœæãç°¡åã§ãã
- äºæž¬å¯èœãªç¶æ é·ç§»ïŒã¢ã¯ã·ã§ã³ã¯ãç¶æ ãæŽæ°ããããã®å¶åŸ¡ãããäºæž¬å¯èœãªæ¹æ³ãæäŸããŸããç¶æ ã®å€æã¯reducerå ã§æç¢ºã«å®çŸ©ãããŸãã
- ããã©ã«ãã§ã®äžå€æ§ïŒã¢ã¯ã·ã§ã³ã䜿çšããå€ãã®ç¶æ 管çãœãªã¥ãŒã·ã§ã³ã¯ãäžå€æ§ã奚å±ããŸããç¶æ ãçŽæ¥å€æŽãããããšã¯ãããŸããã代ããã«ãå¿ èŠãªæŽæ°ãå ããããæ°ããç¶æ ãªããžã§ã¯ããäœæãããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®äž»èŠãªèæ ®äºé
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ 管çãèšèšããã³å®è£ ããéã«ã¯ãããã€ãã®èæ ®äºé ãéèŠã§ãã
- ã¹ã±ãŒã©ããªãã£ïŒè€éãªããŒã¿æ§é ãæã€æé·ããã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ã§ããç¶æ 管çãœãªã¥ãŒã·ã§ã³ãéžæããŠãã ãããZustandãJotaiãReduxïŒããã³é¢é£ããã«ãŠã§ã¢ïŒã®ãããªã©ã€ãã©ãªã¯ãããŸãã¹ã±ãŒã«ããããã«èšèšãããŠããŸãã
- ããã©ãŒãã³ã¹ïŒã³ã³ããŒãã³ãã®åã¬ã³ããªã³ã°ãšããŒã¿ãã§ãããæé©åããããŸããŸãªãããã¯ãŒã¯æ¡ä»¶ãããã€ã¹ã®èœåã«ããã£ãŠã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããŸãã
- ããŒã¿ãã§ããïŒAPIããã®ããŒã¿ãã§ãããªã©ã®éåææäœãåŠçããããã®ã¢ã¯ã·ã§ã³ãçµ±åããããŒãã£ã³ã°ç¶æ ãšãšã©ãŒãã³ããªã³ã°ã广çã«ç®¡çããŸãã
- åœéåïŒi18nïŒãšå°ååïŒl10nïŒïŒè€æ°ã®èšèªãšæåçãªå¥œã¿ããµããŒãããããã«ã¢ããªã±ãŒã·ã§ã³ãèšèšããŸããããã«ã¯ãããŒã«ã©ã€ãºãããããŒã¿ããã©ãŒãããïŒæ¥ä»ãé貚ïŒã翻蚳ãç¶æ å ã§ç®¡çããããšãå«ãŸããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒa11yïŒïŒã¢ã¯ã»ã·ããªãã£ã¬ã€ãã©ã€ã³ïŒäŸïŒWCAGïŒã«åŸãããšã§ãé害ãæã€ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããããã«ã¯ãç¶æ 管çããžãã¯å ã§ãã©ãŒã«ã¹ç¶æ ãããŒããŒãããã²ãŒã·ã§ã³ã管çããããšãå«ãŸããŸãã
- äžŠè¡æ§ãšç¶æ ã®ç«¶åïŒç¹ã«å ±åäœæ¥ããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ã«ãããŠãç°ãªãã³ã³ããŒãã³ãããŠãŒã¶ãŒããã®åæç¶æ æŽæ°ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«åŠçããããæ€èšããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒã¢ã¯ã·ã§ã³å ã«å ç¢ãªãšã©ãŒãã³ããªã³ã°ã¡ã«ããºã ãå®è£ ããäºæããªãã·ããªãªãåŠçãããŠãŒã¶ãŒã«æçãªãã£ãŒãããã¯ãæäŸããŸãã
- ãŠãŒã¶ãŒèªèšŒãšèªå¯ïŒæ©å¯ããŒã¿ãšæ©èœãä¿è·ããããã«ãç¶æ å ã§ãŠãŒã¶ãŒèªèšŒãšèªå¯ã¹ããŒã¿ã¹ãå®å šã«ç®¡çããŸãã
ã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管çã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管çã®å©ç¹ãæå€§åããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- æç¢ºãªã¢ã¯ã·ã§ã³ã¿ã€ããå®çŸ©ããïŒã¿ã€ããé²ããäžè²«æ§ã確ä¿ããããã«ãã¢ã¯ã·ã§ã³ã¿ã€ãã«ã¯å®æ°ã䜿çšããŸããããå³å¯ãªåãã§ãã¯ã®ããã«Typescriptã®äœ¿çšãæ€èšããŠãã ããã
- ReducerãçŽç²ã«ä¿ã€ïŒReducerã¯çŽç²é¢æ°ã§ããã¹ãã§ããçŸåšã®ç¶æ ãšã¢ã¯ã·ã§ã³ãå ¥åãšããŠåãåããæ°ããç¶æ ãªããžã§ã¯ããè¿ãå¿ èŠããããŸããReducerå ã§ã®å¯äœçšã¯é¿ããŠãã ããã
- è€éãªç¶æ æŽæ°ã«ã¯ImmerïŒãŸãã¯åæ§ã®ãã®ïŒã䜿çšããïŒãã¹ãããããªããžã§ã¯ããæã€è€éãªç¶æ æŽæ°ã«ã¯ãImmerã®ãããªã©ã€ãã©ãªã䜿çšããŠäžå€ã®æŽæ°ãç°¡çŽ åããããšãæ€èšããŠãã ããã
- è€éãªç¶æ ãããå°ããªã¹ã©ã€ã¹ã«åå²ããïŒä¿å®æ§ãåäžãããããã«ãç¶æ ãè«ççãªã¹ã©ã€ã¹ãŸãã¯ã¢ãžã¥ãŒã«ã«æŽçããŸãããã®ã¢ãããŒãã¯ãé¢å¿äºãåé¢ããã®ã«åœ¹ç«ã¡ãŸãã
- ã¢ã¯ã·ã§ã³ãšç¶æ æ§é ãææžåããïŒåã¢ã¯ã·ã§ã³ã®ç®çãšç¶æ ã®æ§é ãæç¢ºã«ææžåããããŒã å ã§ã®çè§£ãšååãåäžãããŸãã
- ã¢ã¯ã·ã§ã³ãšReducerããã¹ãããïŒãŠããããã¹ããèšè¿°ããŠãã¢ã¯ã·ã§ã³ãšReducerã®åäœãæ€èšŒããŸãã
- ããã«ãŠã§ã¢ã䜿çšããïŒè©²åœããå ŽåïŒïŒéåæã¢ã¯ã·ã§ã³ãå¯äœçšïŒäŸïŒAPIåŒã³åºãïŒã«ã¯ããããã®æäœãã³ã¢ã®reducerããžãã¯ã®å€éšã§ç®¡çããããã«ããã«ãŠã§ã¢ã®äœ¿çšãæ€èšããŠãã ããã
- ç¶æ 管çã©ã€ãã©ãªãæ€èšããïŒã¢ããªã±ãŒã·ã§ã³ãå€§å¹ ã«æé·ããå Žåã¯ãå°çšã®ç¶æ 管çã©ã€ãã©ãªïŒäŸïŒZustandãJotaiãReduxïŒã远å ã®æ©èœãšãµããŒããæäŸãããããããŸããã
é«åºŠãªæŠå¿µãšãã¯ããã¯
åºæ¬ãè¶ ããŠãç¶æ ç®¡çæŠç¥ã匷åããããã®é«åºŠãªæŠå¿µãšãã¯ããã¯ãæ¢æ±ããŠãã ããã
- éåæã¢ã¯ã·ã§ã³ïŒAPIåŒã³åºããªã©ã®éåææäœãåŠçããããã®ã¢ã¯ã·ã§ã³ãå®è£ ããŸããPromiseãšasync/awaitã䜿çšããŠãããã®æäœã®æµãã管çããŸããããŒãã£ã³ã°ç¶æ ããšã©ãŒãã³ããªã³ã°ãæ¥œèŠ³çæŽæ°ãçµã¿èŸŒã¿ãŸãã
- ããã«ãŠã§ã¢ïŒã¢ã¯ã·ã§ã³ãreducerã«å°éããåã«ãããååããã³å€æŽãããããã®ã³ã°ãéåææäœãAPIåŒã³åºããªã©ã®å¯äœçšãåŠçããããã«ããã«ãŠã§ã¢ã䜿çšããŸãã
- ã»ã¬ã¯ã¿ãŒïŒç¶æ ããããŒã¿ã掟çãããããã«ã»ã¬ã¯ã¿ãŒãå©çšããæŽŸçå€ãèšç®ããåé·ãªèšç®ãåé¿ã§ããããã«ããŸããã»ã¬ã¯ã¿ãŒã¯ãèšç®çµæãã¡ã¢åããäŸåé¢ä¿ã倿Žãããå Žåã«ã®ã¿åèšç®ããããšã§ããã©ãŒãã³ã¹ãæé©åããŸãã
- äžå€æ§ãã«ããŒïŒã©ã€ãã©ãªããŠãŒãã£ãªãã£é¢æ°ã䜿çšããŠãè€éãªç¶æ æ§é ã®äžå€ã®æŽæ°ãç°¡çŽ åããæ¢åã®ç¶æ ã誀ã£ãŠå€æŽããããšãªãæ°ããç¶æ ãªããžã§ã¯ããç°¡åã«äœæã§ããããã«ããŸãã
- ã¿ã€ã ãã©ãã«ãããã°ïŒç¶æ ã®å€æŽããã¿ã€ã ãã©ãã«ãã§ããããŒã«ããã¯ããã¯ã掻çšããŠãã¢ããªã±ãŒã·ã§ã³ããã广çã«ãããã°ããŸããããã¯ãç¹å®ã®ç¶æ ã«è³ã£ãäžé£ã®ã€ãã³ããçè§£ããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- ç¶æ ã®æ°žç¶åïŒãã©ãŠã¶ã»ãã·ã§ã³ããŸããã§ç¶æ ãæ°žç¶åããã¡ã«ããºã ãå®è£ ãããŠãŒã¶ãŒèšå®ãã·ã§ããã³ã°ã«ãŒãã®å 容ãªã©ã®ããŒã¿ãä¿æããããšã§ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããŸããããã«ã¯ãlocalStorageãsessionStorageããŸãã¯ããæŽç·Žãããã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ã®äœ¿çšãå«ãŸããå ŽåããããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ããã©ãŒãã³ã¹ã®æé©åã¯ãã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ãã`useActionState`ãŸãã¯åæ§ã®ã¢ãããŒãã䜿çšããå Žåã¯ã以äžãèæ ®ããŠãã ããã
- åã¬ã³ããªã³ã°ãæå°éã«æããïŒã¡ã¢åæè¡ïŒäŸïŒ`React.memo`ã`useMemo`ïŒã䜿çšããŠãç¶æ ã«äŸåããã³ã³ããŒãã³ãã®äžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
- ã»ã¬ã¯ã¿ãŒã®æé©åïŒã¡ã¢åãããã»ã¬ã¯ã¿ãŒã䜿çšããŠãåºã«ãªãç¶æ ã倿ŽãããªãéããæŽŸçå€ã®åèšç®ãåé¿ããŸãã
- ãããæŽæ°ïŒå¯èœã§ããã°ãè€æ°ã®ç¶æ æŽæ°ãåäžã®ã¢ã¯ã·ã§ã³ã«ã°ã«ãŒãåããŠãåã¬ã³ããªã³ã°ã®æ°ãæžãããŸãã
- äžèŠãªç¶æ æŽæ°ãé¿ããïŒå¿ èŠãªå Žåã«ã®ã¿ç¶æ ãæŽæ°ããããã«ããŠãã ãããäžèŠãªç¶æ 倿Žãé²ãããã«ã¢ã¯ã·ã§ã³ãæé©åããŸãã
- ãããã¡ã€ãªã³ã°ããŒã«ïŒReactãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã³ã³ããŒãã³ããæé©åããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®äŸ
`useActionState`ïŒãŸãã¯åæ§ã®ç¶æ 管çã¢ãããŒãïŒãããã€ãã®ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã·ããªãªã§ã©ã®ããã«äœ¿çšã§ããããèããŠã¿ãŸãããã
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒããŸããŸãªåœéåžå Žã«ããã£ãŠããŠãŒã¶ãŒã®ã·ã§ããã³ã°ã«ãŒãïŒååã®è¿œå /åé€ãæ°éã®æŽæ°ïŒã泚æå±¥æŽããŠãŒã¶ãŒãããã£ãŒã«ãååããŒã¿ã管çããŸããã¢ã¯ã·ã§ã³ã¯ãé貚æç®ãéæèšç®ãèšèªéžæãåŠçã§ããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ã¢ããªã±ãŒã·ã§ã³ïŒãŠãŒã¶ãŒãããã£ãŒã«ãæçš¿ãã³ã¡ã³ããããããåéãªã¯ãšã¹ããåŠçããŸããèšèªèšå®ãéç¥èšå®ããã©ã€ãã·ãŒç®¡çãªã©ã®ã°ããŒãã«èšå®ã管çããŸããã¢ã¯ã·ã§ã³ã¯ãã³ã³ãã³ãã®ã¢ãã¬ãŒã·ã§ã³ãèšèªç¿»èš³ããªã¢ã«ã¿ã€ã æŽæ°ã管çã§ããŸãã
- å€èšèªãµããŒãã¢ããªã±ãŒã·ã§ã³ïŒãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®èšèªèšå®ã®ç®¡çãããŒã«ã©ã€ãºãããã³ã³ãã³ãã®åŠçãããã³ãŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠã³ã³ãã³ããç°ãªããã©ãŒãããïŒäŸïŒæ¥ä»/æå»ãé貚ïŒã§è¡šç€ºããŸããã¢ã¯ã·ã§ã³ã«ã¯ãèšèªã®åãæ¿ããçŸåšã®ãã±ãŒã«ã«åºã¥ããã³ã³ãã³ãã®æŽæ°ãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹èšèªã®ç¶æ 管çãå«ãŸããŸãã
- ã°ããŒãã«ãã¥ãŒã¹ã¢ã°ãªã²ãŒã¿ãŒïŒç°ãªããã¥ãŒã¹ãœãŒã¹ããã®èšäºã管çããå€èšèªãªãã·ã§ã³ããµããŒãããç°ãªãå°åã«åãããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã調æŽããŸããã¢ã¯ã·ã§ã³ã¯ãç°ãªããœãŒã¹ããèšäºãååŸãããããŠãŒã¶ãŒã®å¥œã¿ïŒå¥œã¿ã®ãã¥ãŒã¹ãœãŒã¹ãªã©ïŒãåŠçããããå°åã®èŠä»¶ã«åºã¥ããŠè¡šç€ºèšå®ãæŽæ°ãããããããã«äœ¿çšã§ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ãã©ãããã©ãŒã ïŒã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹å šäœã§ãããã¥ã¡ã³ãã®ç¶æ ãã³ã¡ã³ãããŠãŒã¶ãŒããŒã«ããªã¢ã«ã¿ã€ã åæã管çããŸããã¢ã¯ã·ã§ã³ã¯ãããã¥ã¡ã³ãã®æŽæ°ããŠãŒã¶ãŒæš©éã®ç®¡çãããã³ç°ãªãå°ççãªå Žæã«ããç°ãªããŠãŒã¶ãŒéã§ããŒã¿ãåæããããã«äœ¿çšãããŸãã
é©åãªç¶æ 管çãœãªã¥ãŒã·ã§ã³ã®éžæ
æŠå¿µçãª`useActionState`ã¯å°èŠæš¡ãªãããžã§ã¯ãã«ã¯ã·ã³ãã«ã§å¹æçãªã¢ãããŒãã§ãããããå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ã¯ããããã®äººæ°ã®ããç¶æ 管çã©ã€ãã©ãªãæ€èšããŠãã ããã
- ZustandïŒç°¡çŽ åãããã¢ã¯ã·ã§ã³ã䜿çšãããå°ãããé«éã§ãã¹ã±ãŒã©ãã«ãªãã¢ããŒã³ã®ç¶æ 管çãœãªã¥ãŒã·ã§ã³ã
- JotaiïŒããªããã£ãã§æè»ãªç¶æ 管çã©ã€ãã©ãªã
- ReduxïŒåŒ·åã§åºã䜿çšãããŠããç¶æ 管çã©ã€ãã©ãªã§ãè±å¯ãªãšã³ã·ã¹ãã ãåããŠããŸãããåŠç¿æ²ç·ãæ¥ã«ãªãããšããããŸãã
- Context APIãš`useReducer`ïŒçµã¿èŸŒã¿ã®React Context APIãš`useReducer`ããã¯ãçµã¿åãããããšã§ãã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管çã®ããã®è¯ãåºç€ãæäŸã§ããŸãã
- RecoilïŒReduxãããæè»ãªç¶æ 管çã¢ãããŒããæäŸããèªåçãªããã©ãŒãã³ã¹æé©åãåããç¶æ 管çã©ã€ãã©ãªã
- MobXïŒãªãã¶ãŒããã«ã䜿çšããŠç¶æ ã®å€æŽã远跡ããã³ã³ããŒãã³ããèªåçã«æŽæ°ããããã1ã€ã®äººæ°ã®ããç¶æ 管çã©ã€ãã©ãªã
æé©ãªéžæã¯ããããžã§ã¯ãã®ç¹å®ã®èŠä»¶ã«ãã£ãŠç°ãªããŸããæ¬¡ã®ãããªèŠçŽ ãèæ ®ããŠãã ããã
- ãããžã§ã¯ãã®ãµã€ãºãšè€éãïŒå°èŠæš¡ãªãããžã§ã¯ãã§ã¯ãContext APIãŸãã¯ã«ã¹ã¿ã å®è£ ã§ååãããããŸãããå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãReduxãZustandãMobXãªã©ã®ã©ã€ãã©ãªã圹ç«ã€å ŽåããããŸãã
- ããã©ãŒãã³ã¹èŠä»¶ïŒäžéšã®ã©ã€ãã©ãªã¯ãä»ãããåªããããã©ãŒãã³ã¹æé©åãæäŸããŸããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŠãã ããã
- åŠç¿æ²ç·ïŒåã©ã€ãã©ãªã®åŠç¿æ²ç·ãèæ ®ããŠãã ãããããšãã°ãReduxã¯ZustandãããåŠç¿æ²ç·ãæ¥ã§ãã
- ã³ãã¥ããã£ãµããŒããšãšã³ã·ã¹ãã ïŒåŒ·åãªã³ãã¥ããã£ãšããµããŒãããã©ã€ãã©ãªãããŒã«ã®ç¢ºç«ããããšã³ã·ã¹ãã ãæã€ã©ã€ãã©ãªãéžæããŠãã ããã
çµè«
æŠå¿µçãª`useActionState`ããã¯ã«ä»£è¡šãããïŒãããŠã©ã€ãã©ãªã§åæ§ã«å®è£ ãããïŒã¢ã¯ã·ã§ã³ããŒã¹ã®ç¶æ 管çã¯ãReactã¢ããªã±ãŒã·ã§ã³ãç¹ã«ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ãç¶æ ã管çããããã®åŒ·åã§å¹æçãªæ¹æ³ãæäŸããŸãããã®ã¢ãããŒããæ¡çšããããšã§ãããã¯ãªãŒã³ã§ãä¿å®æ§ãé«ãããã¹ãå¯èœãªã³ãŒããäœæã§ããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒãªã³ã°ãšãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®çµ¶ããå€åããããŒãºãžã®é©å¿ã容æã«ãªããŸãããããžã§ã¯ãã®ç¹å®ã®ããŒãºã«åºã¥ããŠé©åãªç¶æ 管çãœãªã¥ãŒã·ã§ã³ãéžæãããã®ã¢ãããŒãã®å©ç¹ãæå€§éã«æŽ»çšããããã«ãã¹ããã©ã¯ãã£ã¹ãéµå®ããããšãå¿ããªãã§ãã ããã