ããã¯ããã¹ã¿ãŒããŠãå€ãã®Reactéçºè ã¯å¹žçŠæãçµéšããæçµçã«ãããå°ãªãã³ãŒãã§ã¿ã¹ã¯ãå®è£ ã§ããã·ã³ãã«ã§äŸ¿å©ãªããŒã«ããããæã«å ¥ããŸããã ããããããã¯ãç¶æ ã管çããããã«å¿ èŠãªæšæºã®useStateããã¯ãšuseReducerããã¯ã ããå¿ èŠãªããšãæå³ããŸããïŒ
ç§ã®æèŠã§ã¯ããããã®çã®åœ¢ã§ã¯ããããã®äœ¿çšã¯ããŸã䟿å©ã§ã¯ãªãããããæ¬åœã«äŸ¿å©ãªç¶æ 管çããã¯ãæ§ç¯ããããã®åºç€ãšã¿ãªãããšãã§ããŸãã Reactéçºè èªèº«ãã«ã¹ã¿ã ããã¯ã®éçºã匷ãæšå¥šããŠããŸãã ã«ããã®äžã§ãéåžžã«ã·ã³ãã«ã§ç解ããããäŸãéåžžã®ããã¯ã®äœãæªãã®ããã©ã®ããã«æ¹åã§ããã®ããèŠãŠãçŽç²ãªåœ¢ã§ã®äœ¿çšãå®å šã«æåŠããŸãã
å ¥åçšã®ç¹å®ã®ãã£ãŒã«ããæ¡ä»¶ä»ãã§ååããããŸãã ãããŠãã¯ãªãã¯ããããšã§ãå ¥åãããååã§ãµãŒããŒã«ãªã¯ãšã¹ããè¡ããã¿ã³ããããŸãïŒç¹å®ã®æ€çŽ¢ïŒã ããã¯ç°¡åã ãšæãããã§ããããïŒ ãã ãã解決çã¯æããã§ã¯ãããŸããã æåã®åçŽãªå®è£ ïŒ
const App = () => { const [name, setName] = useState(''); const [request, setRequest] = useState(); const [result, setResult] = useState(); useEffect(() => { fetch('//example.api/' + name).then((data) => { setResult(data.result); }); }, [request]); return <div> <input onChange={e => setName(e.target.value)}/> <input type="submit" value="Check" onClick={() => setRequest(name)}/> { result && <div>Result: { result }</div> } </div>; }
ããã§äœãééã£ãŠããŸããïŒ ãŠãŒã¶ãŒããã£ãŒã«ãã«äœããå ¥åããŠãã©ãŒã ã2åéä¿¡ãããšãæåã®ãªã¯ãšã¹ãã®ã¿ãæ©èœããŸãã 2åç®ã®ã¯ãªãã¯èŠæ±ã§ã¯å€æŽããããuseEffectã¯æ©èœããŸããã ã¢ããªã±ãŒã·ã§ã³ããã±ããæ€çŽ¢ãµãŒãã¹ã§ããããŠãŒã¶ãŒãå€æŽãå ããã«äœåºŠãäœåºŠããã©ãŒã ãéä¿¡ããå Žåããã®ãããªå®è£ ã¯æ©èœããŸããïŒ useEffectã®äŸåé¢ä¿ãšããŠååã䜿çšããããšãåãå ¥ããããŸãããããããªããšãããã¹ããå€æŽããããšããã«ãã©ãŒã ãéä¿¡ãããŸãã ããŠãããªãã¯å·¥å€«ã瀺ããªããã°ãªããŸããã
const App = () => { const [name, setName] = useState(''); const [request, setRequest] = useState(); const [result, setResult] = useState(); useEffect(() => { fetch('//example.api/' + name).then((data) => { setResult(data.result); }); }, [request]); return <div> <input onChange={e => setName(e.target.value)}/> <input type="submit" value="Check" onClick={() => setRequest(!request)}/> { result && <div>Result: { result }</div> } </div>; }
次ã«ãã¯ãªãã¯ãããã³ã«ãæå³ã®ãããªã¯ãšã¹ããå察ã«å€æŽããç®çã®åäœãå®çŸããŸãã ããã¯éåžžã«å°ãããŠç¡éªæ°ãªæŸèæã§ãããã³ãŒããç解ããã®ãå€å°æ··ä¹±ããŸãã ããããä»ãç§ã¯ç§ã®æããåé¡ãåžãåºãããã®èŠæš¡ãèšããŸããŠããããã«æãããŸãã ãããæ¬åœãã©ããçããããã«ããã®ã³ãŒããããè¡šçŸåã®ããã¢ãããŒããæäŸããä»ã®å®è£ ãšæ¯èŒããå¿ èŠããããŸãã
ã¹ã¬ããæœè±¡åã䜿çšããŠããã®äŸãçè«ã¬ãã«ã§èŠãŠã¿ãŸãããã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ ãèšè¿°ããã®ã«éåžžã«äŸ¿å©ã§ãã ãããã£ãŠã2ã€ã®ã¹ããªãŒã ããããŸããããã¹ããã£ãŒã«ãã«å ¥åãããããŒã¿ïŒåå$ïŒãããã³ãã©ãŒã ã®éä¿¡ãã¿ã³ãã¯ãªãã¯ããã¹ããªãŒã ïŒ$ãã¯ãªãã¯ïŒã§ãã ãããããããµãŒããŒãžã®ãªã¯ãšã¹ãã®3çªç®ã®çµåã¹ããªãŒã ãäœæããå¿ èŠããããŸãã
name$ __(C)____(Ca)_____(Car)____________________(Carl)___________ click$ ___________________________()______()________________()_____ request$ ___________________________(Car)___(Car)_____________(Carl)_
éæããå¿ èŠãããåäœã次ã«ç€ºããŸãã åã¹ããªãŒã ã«ã¯ã2ã€ã®åŽé¢ããããŸããããã¯ãå€ãšãå€ãæµããæç¹ã§ãã ããŸããŸãªç¶æ³ã§ããããããŸãã¯äž¡æ¹ã®åŽé¢ãå¿ èŠã«ãªãå ŽåããããŸãã ãããé³æ¥œã®ãªãºã ãšèª¿åãšæ¯èŒã§ããŸãã å¿çæéã®ã¿ãéèŠãªã¹ããªãŒã ã¯ãä¿¡å·ãšãåŒã°ããŸãã
ç§ãã¡ã®å Žåãã¯ãªãã¯$ã¯çŽç²ãªã·ã°ãã«ã§ããã©ã®å€ãæµãããã¯é¢ä¿ãããŸããïŒæªå®çŸ©/ true /ã€ãã³ã/äœã§ãïŒãããã¯éèŠãªããšã§ãã ã±ãŒã¹å$
éã«ãã·ã¹ãã ã®å€æŽã䌎ãå€æŽã¯äžåãããŸããããããæç¹ã§ãã®æå³ãå¿
èŠã«ãªãå ŽåããããŸãã ãããŠããããã®2ã€ã®ã¹ããªãŒã ãããæåã®å€ã2çªç®ã®å€ãã3çªç®ã®å€ãäœæããå¿
èŠããããŸãã
Rxjsã®å Žåãããã«ã¯ã»ãšãã©ããã«äœ¿ããæŒç®åããããŸãã
const names$ = fromEvent(...); const click$ = fromEvent(...); const request$ = click$.pipe(withLatestFrom(name$), map(([name]) => fromPromise(fetch(...))));
ãã ããReactã§ã®Rxã®å®éçãªäœ¿çšã¯éåžžã«äžäŸ¿ã§ãã ããé©åãªãªãã·ã§ã³ã¯ãRxãšåãæ©èœçåå¿åçã«åºã¥ããŠæ§ç¯ãããmrrã©ã€ãã©ãªã§ããããå®å šãªåå¿æ§ãã®åçã«åºã¥ããŠReactã§ã®äœ¿çšã«ç¹ã«é©åããããã¯ãšããŠæ¥ç¶ãããŸãã
import useMrr from 'mrr/hooks'; const App = props => { const [state, set] = useMrr(props, { result: [name => fetch('//example.api/' + name).then(data => data.result), '-name', 'submit'], }); return <div> <input value={state.name} onChange={set('name')}/> <input type="submit" value="Check" onClick={set('submit')}/> { state.result && <div>Result: { state.result }</div> } </div>; }
useMrrã€ã³ã¿ãŒãã§ã€ã¹ã¯useStateãŸãã¯useReducerã«äŒŒãŠããŸããå€ãã¹ã¬ããã«å ¥ããããã«ãç¶æ ãªããžã§ã¯ãïŒãã¹ãŠã®ã¹ã¬ããã®å€ïŒãšã»ãã¿ãŒãè¿ããŸãã ãããããã¹ãŠã®å éšã¯å°ãç°ãªããŸãïŒDOMã€ãã³ãããçŽæ¥å€ãå ¥åãããã®ãé€ãåç¶æ ãã£ãŒã«ãïŒ=ã¹ããªãŒã ïŒã¯ãé¢æ°ãšèŠªã¹ããªãŒã ã®ãªã¹ãã«ãã£ãŠèšè¿°ããããã®å€æŽã«ããåãåèšç®ãããŸãã ãã®å Žåã芪ã¹ã¬ããã®å€ãé¢æ°ã«ä»£å ¥ãããŸãã ã¹ããªãŒã ã®å€ãååŸããã ãã§ããã®å€æŽã«å¿çããªãå Žåã¯ãååã®å Žåãšåæ§ã«ãååã®åã«ããã€ãã¹ããæžã蟌ã¿ãŸãã
åºæ¬çã«ãåžæããåäœã1è¡ã§ååŸããŸããã ããããããã¯åãªãç°¡æœãã§ã¯ãããŸããã åŸãããçµæããã詳现ã«æ¯èŒããŠã¿ãŸãããããŸã第äžã«ãçµæã®ã³ãŒãã®èªã¿ããããšæ確ããªã©ã®ãã©ã¡ãŒã¿ãŒã«é¢ããŠã§ãã
mrrã§ã¯ãããã³ãã¬ãŒãããããããžãã¯ããã»ãŒå®å šã«åé¢ããããšãã§ããŸããJSXã§è€éãªåœä»€åãã³ãã©ãŒãèšè¿°ããå¿ èŠã¯ãããŸããã ãã¹ãŠãéåžžã«å®£èšçã§ãïŒå®è³ªçã«å€æããã«DOMã€ãã³ãã察å¿ããã¹ããªãŒã ã«ãããããŸãïŒå ¥åãã£ãŒã«ãã®å Žåãå€ãæå®ããªãéããå€e.target.valueã¯èªåçã«æœåºãããŸãïŒãæ¢ã«useMrræ§é ã«ããŒã¹ãããŒã®åœ¢ææ¹æ³ãèšè¿°ããŸãåäŒç€Ÿã ãããã£ãŠãåæããã³éåæã®äž¡æ¹ã®ããŒã¿å€æã®å Žåãå€ãã©ã®ããã«åœ¢æãããããåžžã«ç°¡åã«è¿œè·¡ã§ããŸãã
Pxãšã®æ¯èŒïŒè¿œå ã®æŒç®åã䜿çšããå¿
èŠãããããŸããã§ããããã®çµæãmrré¢æ°ããããã¹ãåãåã£ãå Žåãåãåã£ãããŒã¿ã解決ããŠã¹ããªãŒã ã«å
¥ãããŸã§èªåçã«åŸ
æ©ããŸãã ãŸããwithLatestFromã®ä»£ããã«ã
ããã·ããªã¹ãã³ã°ïŒãã€ãã¹èšå·ïŒãããã¯ãã䟿å©ã§ãã ååã«å ããŠãä»ã®ãã£ãŒã«ããéä¿¡ããå¿
èŠããããšæ³åããŠãã ããã 次ã«ãmrrã§ãååçã«ãªãã¹ã³ããå¥ã®ã¹ããªãŒã ãè¿œå ããŸãã
result: [(name, surname) => fetch(...), '-name', '-surname', 'submit'],
Rxã§ã¯ãLatestFromããããã§ãã1ã€ã¹ã«ã«ããããããæåã«ååãšå§ã1ã€ã®ã¹ããªãŒã ã«çµåããå¿ èŠããããŸãã
ããããããã¯ãšMRRã«æ»ããŸãã ããŒã¿ãã©ã®ããã«åœ¢æãããããåžžã«ç€ºããããèªã¿ãããäŸåé¢ä¿ã¬ã³ãŒãã¯ãããããäž»ãªå©ç¹ã®1ã€ã§ãã çŸåšã®useEffectã€ã³ã¿ãŒãã§ãŒã¹ã¯ãåºæ¬çã«ä¿¡å·ã¹ããªãŒã ã«å¿çããããšãèš±å¯ããŠããŸããããã®ããã
ããŸããŸãªå·¥å€«ãå¿
èŠã§ãã
ãã1ã€ã®ãã€ã³ãã¯ãéåžžã®ããã¯ã®ãªãã·ã§ã³ãè¿œå ã®ã¬ã³ããªã³ã°ãå®è¡ããããšã§ãã ãŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ããã ãã®å Žåãããã¯ãŸã åå¿ãæç»ããå¿ èŠãããUIã®å€æŽã䌎ããŸããã ãã ããã¬ã³ããŒãåŒã³åºãããŸãã mrrã®ããããªã¢ã³ãã§ã¯ããµãŒããŒããã®å¿çãæ¢ã«å°çããå Žåã«ã®ã¿ãè¿ãããç¶æ ãæŽæ°ãããŸãã ããããä¿åããŸããïŒ ãŸããããããã ãããå人çã«ã¯ãåºæ¬çãªããã¯ã®åºç€ã§ãããç解ã§ããªãç¶æ³ã§åã¬ã³ããªã³ã°ããããšããååã¯æåŠãåŒãèµ·ãããŸãã
äœåãªã¬ã³ããªã³ã°ã¯ãã€ãã³ããã³ãã©ãŒã®æ°ããæ§æãæå³ããŸãã ãšããã§ãããã§ã¯æ®éã®ããã¯ã¯ãã¹ãŠæªãã§ãã ãã³ãã©ãŒã¯å¿ é ã§ããã ãã§ãªããã¬ã³ããªã³ã°ãããã³ã«åçæããå¿ èŠããããŸãã ãããŠãããã§ãã£ãã·ã¥ãå®å šã«äœ¿çšããããšã¯ã§ããŸããã å€ãã®ãã³ãã©ãŒã¯ãã³ã³ããŒãã³ãã®å éšå€æ°ã«ããã¯ããå¿ èŠããããŸãã mrrãã³ãã©ãŒã¯ãã宣èšçã§ããããã£ãã·ã¥ã¯æ¢ã«mrrã«çµ±åãããŠããŸããsetïŒ 'name'ïŒã¯äžåºŠã ãçæãããåŸç¶ã®ã¬ã³ããªã³ã°ã®ããã«ãã£ãã·ã¥ãã眮ãæããããŸãã
ã³ãŒãããŒã¹ãå¢å ãããšãåœä»€åãã³ãã©ãŒã¯ããã«é¢åã«ãªããŸãã ãŠãŒã¶ãŒãè¡ã£ããã©ãŒã éä¿¡ã®æ°ã衚瀺ããå¿ èŠããããšããŸãããã
const App = () => { const [request, makeRequest] = useState(); const [name, setName] = useState(''); const [result, setResult] = useState(false); const [clicks, setClicks] = useState(0); useEffect(() => { fetch('//example.api/' + name).then((data) => { setResult(data.result); }); }, [request]); return <div> <input onChange={e => setName(e.target.value)}/> <input type="submit" value="Check" onClick={() => { makeRequest(!request); setClicks(clicks + 1); }}/><br /> Clicked: { clicks } </div>; }
èŠãç®ã¯ããŸãè¯ããããŸããã ãã¡ããããã³ãã©ãŒãã³ã³ããŒãã³ãå ã®å¥ã®é¢æ°ãšããŠã¬ã³ããªã³ã°ã§ããŸãã èªã¿ãããã¯åäžããŸãããåã¬ã³ããªã³ã°ã§é¢æ°ãåçæããåé¡ãšãåœä»€æ§ã®åé¡ã¯æ®ããŸãã React APIã¯æ©èœçãªã¢ãããŒãã«åããŠåŸã ã«å€åããŠãããšåºãä¿¡ããããŠããŸãããæ¬è³ªçã«ããã¯äžè¬çãªæç¶ãã³ãŒãã§ãã
åé¡ã®èŠæš¡ãèªåŒµãããŠããããã«èŠãã人ã«ã¯ãããšãã°ãReactã®éçºè èªèº«ããã³ãã©ãŒã®éå°ãªçæã®åé¡ãèªèããŠãããuseCallbackã®åœ¢ã§æŸèæãããã«åœ¹ç«ã€ãšçããããšãã§ããŸãã
MRRã®å ŽåïŒ
const App = props => { const [state, set] = useMrr(props, { $init: { clicks: 0, }, isValid: [name => fetch('//example.api/' + name).then(data => data.isValid), '-name', 'makeRequest'], clicks: [a => a + 1, '-clicks', 'makeRequest'], }); return <div> <input onChange={set('name')}/> <input type="submit" value="Check" onClick={set('makeRequest')}/> </div>; }
ãã䟿å©ãªä»£æ¿æ段ã¯useReducerã§ããããã«ããããã³ãã©ãŒã®åœä»€ãæŸæ£ã§ããŸãã ãã ããä»ã®éèŠãªåé¡ãæ®ã£ãŠããŸãïŒä¿¡å·ã®åŠçã®æ¬ åŠïŒåãuseEffectãå¯äœçšã®åå ãšãªãããïŒãããã³éåæå€æäžã®ææªã®å¯èªæ§ïŒèšãæãããšãåãuseEffectã«ãããã¹ãã¢ã®ãã£ãŒã«ãéã®é¢ä¿ã远跡ããããšã¯ããå°é£ã§ãïŒ ïŒ mrrã§ç¶æ ãã£ãŒã«ãïŒã¹ã¬ããïŒéã®äŸåé¢ä¿ã°ã©ããããã«ã¯ã£ããèŠããå Žåãããã¯ã§ã¯ç®ãå°ãäžäžã«åãããªããã°ãªããŸããã
ãŸããåãã³ã³ããŒãã³ãã§useStateãšuseReducerãå
±æããã®ã¯ããŸã䟿å©ã§ã¯ãããŸããïŒuseStateã§äœããå€æŽããè€éãªåœä»€åãã³ãã©ãŒãåã³ååšããŸãïŒ
ãã®ãããããããã³ã³ããŒãã³ããéçºããåã«ãããããã®ãªãã·ã§ã³ãåãå
¥ããå¿
èŠããããŸãã
ãã¡ããããã¹ãŠã®åŽé¢ã®æ€èšãç¶ç¶ããããšãã§ããŸãã èšäºã®ç¯å²ãè¶ ããªãããã«ããããã«ãéèŠæ§ã®äœãããã€ãã®ç¹ã«ã€ããŠè©³ãã説æããŸãã
éäžãã°ããããã°ã mrrã§ã¯ãã¹ãŠã®ã¹ããªãŒã ã1ã€ã®ããã«å«ãŸããŠããããããããã°ããã«ã¯1ã€ã®ãã©ã°ãè¿œå ããã ãã§ååã§ãã
const App = props => { const [state, set] = useMrr(props, { $log: true, $init: { clicks: 0, }, isValid: [name => fetch('//example.api/' + name).then(data => data.isValid), '-name', 'makeRequest'], clicks: [a => a + 1, '-clicks', 'makeRequest'], }); ...
ãã®åŸãã¹ããªãŒã ã«å¯Ÿãããã¹ãŠã®å€æŽãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãã ç¶æ å šäœïŒã€ãŸãããã¹ãŠã®ã¹ã¬ããã®çŸåšã®å€ïŒã«ã¢ã¯ã»ã¹ããã«ã¯ãç䌌ã¹ããªãŒã $ç¶æ ããããŸãã
a: [({ name, click, result }) => { ... }, '$state', 'click'],
ãããã£ãŠãå¿ èŠãªå ŽåããŸãã¯ç·šéã¹ã¿ã€ã«ã«éåžžã«æ £ããŠããå Žåã¯ãmrrã§ãšãã£ã¿ãŒã¹ã¿ã€ã«ãèšè¿°ããã€ãã³ããšä»¥åã®ç¶æ å šäœã«åºã¥ããŠæ°ãããã£ãŒã«ãå€ãè¿ãããšãã§ããŸãã ãããããããã®åå¿æ§ããªããããéïŒuseReducerãŸãã¯mrrã¹ã¿ã€ã«ã®ãšãã£ã¿ãŒã§ã®æžã蟌ã¿ïŒã¯æ©èœããŸããã
æéãæäœããŸãã ãããŒã®2ã€ã®åŽé¢ãã€ãŸãæå³ãšå¿çæéã調åãšãªãºã ãèŠããŠããŸããïŒ ãããã£ãŠãéåžžã®ããã¯ã§æåã®ããã¯ãæäœããã®ã¯éåžžã«ç°¡åã§äŸ¿å©ã§ããã2çªç®ã®ããã¯ã§ã¯-ãããã æéããããŠäœæ¥ãããšããããšã¯ãããªãºã ãã芪ãšã¯ç°ãªãåã¹ããªãŒã ã®åœ¢æãæå³ããŸãã ããã¯äž»ã«ããããçš®é¡ã®ãã£ã«ã¿ãŒãdebownsãtrotlãªã©ã§ãã ããã¯ãã¹ãŠãããããèªåã§å®è£ ããå¿ èŠããããŸãã mrrã§ã¯ãæ¢æã®ã¹ããŒãã¡ã³ãããã®ãŸãŸäœ¿çšã§ããŸãã 玳士ã»ããmrrã¯ãããŸããŸãªæŒç®åRxã«å£ããŸãããããçŽæçãªåœåæ¹æ³ããããŸãã
ã³ã³ããŒãã³ãéçžäºäœçšã ãšãã£ã¿ãŒã§ã¯ãã¹ããŒãªãŒã1ã€ã ãäœæããããšããå§ãããŸããã å€ãã®ã³ã³ããŒãã³ãã§useReducerã䜿çšããå Žåã
åœäºè
éã®çžäºäœçšã®çµç¹ã«åé¡ãããå¯èœæ§ããããŸãã mrrã§ã¯ããããŒã¯1ã€ã®ã³ã³ããŒãã³ãããå¥ã®ã³ã³ããŒãã³ãã«éå±€ã®äžäžã«èªç±ã«ãæµãããããšãã§ããŸãããããã¯å®£èšçãªã¢ãããŒãã®ããåé¡ãåŒãèµ·ãããŸããã 詳现
ãã®ãããã¯ããã³mrr APIã®ãã®ä»ã®æ©èœã«ã€ããŠã¯ã Reactã®ã¢ã¯ã¿ãŒ+ FRPã®èšäºã§èª¬æãããŠããŸãã
çµè«
æ°ãããªã¢ã¯ã·ã§ã³ããã¯ã¯çŽ æŽããããç§ãã¡ã®ç掻ãç°¡çŽ åããŸãããé«ã¬ãã«ã®æ±çšããã¯ïŒç¶æ 管çïŒã§ä¿®æ£ã§ããããã€ãã®æ¬ é¥ããããŸãã æ©èœåå¿ã©ã€ãã©ãªmrrã®UseMrrãææ¡ããããã®ããã«èŠãªãããŸããã
åé¡ãšãã®è§£æ±ºçïŒ
- åã¬ã³ããªã³ã°ã§ã®äžå¿ èŠãªããŒã¿ã®åã«ãŠã³ãïŒããã·ã¥ããŒã¹ã®åå¿æ§ã®ãããmrrã¯ååšããŸããïŒ
- ç¶æ ã®å€åãUIã®å€åã䌎ããªãå Žåã®è¿œå ã®ã¬ã³ããªã³ã°
- éåæå€æã䜿çšããã³ãŒãã®èªã¿ãããã®äœäžïŒåæãšæ¯èŒïŒã mrrã§ã¯ãéåæã³ãŒãã¯ãèªã¿ããããšè¡šçŸåã«ãããŠåæã«å£ããŸããã mrrã®useEffectã«é¢ããæè¿ã®èšäºã§èª¬æãããŠããåé¡ã®ã»ãšãã©ã¯ãåºæ¬çã«äžå¯èœã§ãã
- åžžã«ãã£ãã·ã¥å¯èœãšã¯éããªãåœä»€åãã³ãã©ãŒïŒmrrã§ã¯èªåçã«ãã£ãã·ã¥ãããŸããã»ãšãã©ã®å Žåã宣èšçã«ãã£ãã·ã¥ã§ããŸãïŒ
- useStateãšuseReducerãåæã«äœ¿çšãããšãåä»ãªã³ãŒããäœæãããå¯èœæ§ããããŸã
- çµæçã«ãããŒãå€æããããŒã«ã®äžè¶³ïŒãããŠã³ã¹ãã¹ãããã«ã競åç¶æ ïŒ
å€ãã®ç¹ã§ãã«ã¹ã¿ã ããã¯ã«ãã£ãŠè§£æ±ºã§ãããšäž»åŒµããããšãã§ããŸãã ããããããã¯ãŸãã«ææ¡ãããŠãããã®ã§ãããç°ãªãå®è£ ã®ä»£ããã«ãåå¥ã®ã¿ã¹ã¯ããšã«ãå šäœçã§äžè²«ãããœãªã¥ãŒã·ã§ã³ãææ¡ãããŠããŸãã
å€ãã®åé¡ã¯ããŸãã«éŠŽæã¿ãããŠãç§ãã¡ã«ã¯ã¯ã£ãããšèªèãããŸããã ããšãã°ãéåæå€æã¯åžžã«åæå€æãããè€éã§è€éã«èŠãããã®æå³ã§ã®ããã¯ã¯ä»¥åã®ã¢ãããŒãïŒedsãªã©ïŒããæªããããŸããã ãããåé¡ãšããŠèªèããããã«ã¯ãããè¯ã解決çãæäŸããä»ã®ã¢ãããŒããæåã«èŠãå¿ èŠããããŸãã
ãã®èšäºã¯ãç¹å®ã®èŠè§£ã課ãã®ã§ã¯ãªããåé¡ã«æ³šæãåŒãããšãç®çãšããŠããŸãã ä»ã®ãœãªã¥ãŒã·ã§ã³ãååšãããã䟡å€ã®ãã代æ¿æ段ã«ãªãåŸããããŸã åºãç¥ãããŠããªãä»ã®ãœãªã¥ãŒã·ã§ã³ãäœæãããŠãããšç¢ºä¿¡ããŠããŸãã ä»åŸã®React Cache APIã倧ããªéããçãããšãã§ããŸãã ã³ã¡ã³ãã§ã®æ¹å€ãšè°è«ãæè¿ããŸãã
èå³ã®ããæ¹ã¯ã3æ28æ¥ã«kyivjsã§ãã®ãããã¯ã«é¢ãããã¬ãŒã³ããŒã·ã§ã³ãèŠãããšãã§ããŸãã