How to Upgrade to React 18
March 08, 2022 by Rick Hanlon
ãªãªãŒã¹åç¥ã®èšäºã§ãäŒããããšãããReact 18 ã«ã¯æ°ããªäžŠè¡ã¬ã³ãã©ãçšããæ©èœãå ãã£ãŠãããæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã段éçã«æ¡çšã§ããæ¹æ³ãæäŸããŠããŸãããã®æçš¿ã§ã¯ãReact 18 ã«ã¢ããã°ã¬ãŒãããããã®ã¹ãããã«ã€ããŠãæ¡å ããŸãã
React 18 ã«ã¢ããã°ã¬ãŒãããéã«ééããåé¡ã¯å ±åããé¡ãããŸãã
ã€ã³ã¹ããŒã«
React ã®ææ°ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããã«ã¯ïŒ
npm install react react-dom
Yarn ãã䜿ãã®å ŽåïŒ
yarn add react react-dom
ã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã° API ãžã®å€æŽ
ãŸã React 18 ãã€ã³ã¹ããŒã«ãããšã以äžã®ãããªèŠåãã³ã³ãœãŒã«ã«è¡šç€ºãããŸãïŒ
React ã§ã¯è€æ°ã®ã«ãŒãã管çããéã®äœ¿ãåæãæ¹åãããæ°ããã«ãŒã API ãå°å ¥ããŠããŸããæ°ããã«ãŒã API ã«ãã£ãŠæ°ãã䞊è¡ã¬ã³ãã©ãæå¹ã«ãªãããã䞊è¡åŠçæ©èœã«ãªããã€ã³ã§ããããã«ãªããŸãã
// Before
import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);
// After
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container); // createRoot(container!) if you use TypeScript
root.render(<App tab="home" />);
unmountComponentAtNode
ã root.unmount
ã«çœ®ãæãããŸããïŒ
// Before
unmountComponentAtNode(container);
// After
root.unmount();
ãŸãã¬ã³ããŒåŸã®ã³ãŒã«ããã¯ãåé€ãããŸããããµã¹ãã³ã¹ã䜿ã£ãå Žåã«ã倧æµã¯æåŸ ãããçµæã«ãªããªãããã§ãïŒ
// Before
const container = document.getElementById('app');
render(<App tab="home" />, container, () => {
console.log('rendered');
});
// After
function AppWithCallbackAfterRender() {
useEffect(() => {
console.log('rendered');
});
return <App tab="home" />
}
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<AppWithCallbackAfterRender />);
æåŸã«ãããªãã®ã¢ããªã§ãµãŒããµã€ãã¬ã³ããªã³ã°ãšãã€ãã¬ãŒã·ã§ã³ã䜿çšããŠããå Žåã¯ãhydrate
ã hydrateRoot
ã«ã¢ããã°ã¬ãŒãããŠãã ããïŒ
// Before
import { hydrate } from 'react-dom';
const container = document.getElementById('app');
hydrate(<App tab="home" />, container);
// After
import { hydrateRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = hydrateRoot(container, <App tab="home" />);
// Unlike with createRoot, you don't need a separate root.render() call here.
詳现ã¯ãã¡ãã®ã¯ãŒãã³ã°ã«ãŒãã®ãã£ã¹ã«ãã·ã§ã³ãåç §ããŠãã ããã
ãµãŒãã¬ã³ããªã³ã° API ãžã®å€æŽ
ãã®ãªãªãŒã¹ã§ã¯ãreact-dom/server
ãå·æ°ãããµãŒãåŽã§ã®ãµã¹ãã³ã¹ãã¹ããªãŒãã³ã° SSR ããã«ãµããŒããããããã«ãªããŸããããã®å€æŽã®äžç°ãšããŠããµãŒãåŽã§ã®é次çãªãµã¹ãã³ã¹ã®ã¹ããªãŒãã³ã°åŠçããµããŒãããªãæ¢åã® Node ã¹ããªãŒãã³ã° API ãéæšå¥šãšããŸããã
以äžã® API ã䜿ããšèŠåãåºãããã«ãªããŸãïŒ
renderToNodeStream
: éæšå¥š âïžïž
代ããã« Node ç°å¢ã§ã®ã¹ããªãŒãã³ã°ã«ã¯ä»¥äžã䜿ã£ãŠãã ããïŒ
renderToPipeableStream
: New âš
ãŸããDeno ã Cloudflare Workers ã®ãããªã¢ãã³ãªãšããžã©ã³ã¿ã€ã ç°å¢ã§ãµã¹ãã³ã¹ä»ã SSR ã¹ããªãŒãã³ã°ããµããŒããããæ°ã㪠API ãå°å ¥ããŸãïŒ
renderToReadableStream
: New âš
以äžã® API ã¯ãããããåäœããŸããããµã¹ãã³ã¹ã®ãµããŒãã«å¶éãã€ããŸãïŒ
renderToString
: å¶éä»ã â ïžrenderToStaticMarkup
: å¶éä»ã â ïž
æåŸã«ãé»åã¡ãŒã«ãã¬ã³ããŒããç®çã§ããã°ä»¥äžã® API ãåŒãç¶ãå©çšã§ããŸãïŒ
renderToStaticNodeStream
ãµãŒãã¬ã³ããªã³ã°çš API ã«ã€ããŠã®è©³çްã¯ãã¯ãŒãã³ã°ã°ã«ãŒãã®æçš¿ Upgrading to React 18 on the server ãš deep dive on the new Suspense SSR Architecture ãããŸã React Conf 2011 ã§ã® Shaundai Person ã®çºè¡š Streaming Server Rendering with Suspense ãã芧ãã ããã
TypeScript åå®çŸ©ã®å€æŽ
ãããžã§ã¯ãã§ TypeScript ã䜿ã£ãŠããå ŽåãäŸåã® @types/react
ãš @types/react-dom
ãææ°ããŒãžã§ã³ã«æŽæ°ããå¿
èŠããããŸããæ°ããªåã¯ããå®å
šã§ããããããŸã§åãã§ãã«ã«ç¡èŠãããŠããåé¡ãææããããšãã§ããŸããæã倧ããªå€æŽã¯ãprops ãå®çŸ©ããéã« children
ããããã£ãæç€ºçã«åæããå¿
èŠããããšããããšã§ããäŸãã°ïŒ
interface MyButtonProps {
color: string;
children?: React.ReactNode;
}
åã«ã®ã¿é¢é£ãã倿Žã®å šãªã¹ãã«ã€ããŠã¯ React 18 ã®åã«ã€ããŠã®ãã«ãªã¯ãšã¹ã ãåç §ããŠãã ãããã©ã€ãã©ãªåã«ã€ããŠã®ä¿®æ£ã®ãµã³ãã«ãžã®ãªã³ã¯ããããã³ãŒããã©ã®ããã«èª¿æŽããã°ãããåããããã«ãªã£ãŠããŸããèªåç§»è¡ã¹ã¯ãªããã䜿ãããšã§ãããªãã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒããããæ°ãããããå®å šãªåå®çŸ©ã«ãã°ããç§»è¡ãããããªããŸãã
åã«é¢ãããã°ãèŠã€ããå Žåã¯ãDefinitelyTyped ãªããžããªã§ issue ãç»é²ããŠãã ããã
èªåãããã³ã°
React 18 ã¯ããã©ã«ãã§ããå€ãã®ãããã³ã° (batching) ãè¡ãããšã§ãæšæºç¶æ ã§ã®ããã©ãŒãã³ã¹ãæ¹åããŸãããããã³ã°ãšã¯ React ãããã©ãŒãã³ã¹ã®ããã«è€æ°ã®ã¹ããŒãæŽæ°ãã°ã«ãŒãåããŠãåäžã®åã¬ã³ããŒã«ãŸãšããããšãæããŸããReact 18 ããåã¯ãReact ã®ã€ãã³ããã³ãã©å ã§ã®æŽæ°ã®ã¿ãããåŠçãããŠããŸãããpromise ã setTimeoutããã€ãã£ãã®ã€ãã³ããã³ãã©ããã®ä»ããããã€ãã³ãå ã§èµ·ããæŽæ°ã¯ããã©ã«ãã§ã¯ãããåŠçãããŠããŸããã§ããã
// Before React 18 only React events were batched
function handleClick() {
setCount(c => c + 1);
setFlag(f => !f);
// React will only re-render once at the end (that's batching!)
}
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// React will render twice, once for each state update (no batching)
}, 1000);
React 18 以éã§ createRoot
ã䜿ããšããã¹ãŠã®æŽæ°ã¯ã©ãã§çºçãããã«é¢ããããèªåã§ãããåŠçãããŸããã€ãŸããã¿ã€ã ã¢ãŠããpromiseããã€ãã£ãã€ãã³ããã³ãã©ããã³ãã®ä»ã®ããããã€ãã³ãå
ã§èµ·ããæŽæ°ã¯ãReact ã€ãã³ãã§èµ·ãã£ãæŽæ°ãšåæ§ã«ãããåŠçãããŸãïŒ
// After React 18 updates inside of timeouts, promises,
// native event handlers or any other event are batched.
function handleClick() {
setCount(c => c + 1);
setFlag(f => !f);
// React will only re-render once at the end (that's batching!)
}
setTimeout(() => {
setCount(c => c + 1);
setFlag(f => !f);
// React will only re-render once at the end (that's batching!)
}, 1000);
ããã¯ç Žå£ç倿Žã§ãããããã«ããã¬ã³ããŒåŠçã軜ããªãããããã£ãŠã¢ããªã®ããã©ãŒãã³ã¹ãåäžããããšãæåŸ
ãããŸããèªåãããã³ã°ãããªããã¢ãŠãããããã« flushSync
ã䜿ãããšãã§ããŸãïŒ
import { flushSync } from 'react-dom';
function handleClick() {
flushSync(() => {
setCounter(c => c + 1);
});
// React has updated the DOM by now
flushSync(() => {
setFlag(f => !f);
});
// React has updated the DOM by now
}
詳现ã«ã€ããŠã¯ãAutomatic batching 詳解 ãåç §ããŠãã ããã
ã©ã€ãã©ãªåãã®æ° API
React 18 ã¯ãŒãã³ã°ã°ã«ãŒãã§ã©ã€ãã©ãªã¡ã³ãããšå ±åã§äœæ¥ãè¡ããã¹ã¿ã€ã«ãå€éšã¹ãã¢ãšãã£ãåéã«ç¹æã®ãŠãŒã¹ã±ãŒã¹ã§äžŠè¡ã¬ã³ããŒæ©èœããµããŒããããããæ°ãã API ãäœæããŸãããäžéšã®ã©ã€ãã©ãªã¯ãReact 18 ããµããŒãããããã«ä»¥äžã® API ã«åãæ¿ããå¿ èŠããããããããŸããïŒ
useSyncExternalStore
ã¯ãã¹ãã¢ãžã®æŽæ°ã匷å¶çã«åæçã«è¡ãããšã§ã䞊è¡èªã¿åããå€éšã¹ãã¢ããµããŒãã§ããããã«ããããã®æ°ããªããã¯ã§ãããã®æ°ãã API 㯠React å€éšã®ç¶æ ãæ±ãããããã©ã€ãã©ãªã«ãšã£ãŠæšå¥šããããã®ã§ãã詳现㯠useSyncExternalStore æŠèŠããã³ useSyncExternalStore API 詳现ãåç §ããŠãã ãããuseInsertionEffect
ã¯ãCSS-in-JS ã©ã€ãã©ãªãã¬ã³ããŒæã«ã¹ã¿ã€ã«ãæ³šå ¥ããéã®ããã©ãŒãã³ã¹äžã®åé¡ã«å¯ŸåŠã§ããããã«ããããã®æ°ããããã¯ã§ãããã§ã« CSS-in-JS ã©ã€ãã©ãªãæ§ç¯ããŠããã®ã§ãªããã°ãããã䜿ãããšã¯ãŸããªãã§ãããããã®ããã¯ã¯ãDOM ãæžãæããããåŸãã¬ã€ã¢ãŠãå¯äœçš (layout effect) ãæ°ããã¬ã€ã¢ãŠããèªã¿èŸŒãåã«å®è¡ãããŸããããã«ãã React 17 ããã³ãã以åããæ¢ã«ååšããåé¡ã解決ãããŸãããReact 18 ã§ã¯äžŠè¡ã¬ã³ããŒäžã«ãã©ãŠã¶ã«åŠçãæž¡ããããã§ã¬ã€ã¢ãŠããåèšç®ãããå¯èœæ§ããããããããéèŠã§ãã詳现㯠Library Upgrade Guide for<style>
ãåç §ããŠãã ããã
React 18 ã§ã¯ startTransition
ãuseDeferredValue
ã useId
ã®ãããªæ°ãã API ãå°å
¥ããŠããããªãªãŒã¹åç¥èšäºã«ãŠè©³çްããäŒãããŸãã
strict ã¢ãŒããžã®å€æŽ
å°æ¥çã«ãReact ã state ãä¿ã£ããŸãŸã§ UI ã®äžéšåã远å ã»åé€ã§ãããããªæ©èœãå°å ¥ããããšèããŠããŸããäŸãã°ããŠãŒã¶ãã¿ããåãæ¿ããŠç»é¢ãé¢ããŠããæ»ã£ãŠããå Žåã«ãReact ã以åã®ç»é¢ãããã«è¡šç€ºã§ããããã«ãããã®ã§ãããããå¯èœã«ãããããReact ã¯åã state ã䜿çšããŠããªãŒãã¢ã³ããŠã³ãã»åããŠã³ãããŸãã
ãã®æ©èœã«ãããReact ã®æšæºç¶æ ã§ã®ããã©ãŒãã³ã¹ãåäžããŸãããã³ã³ããŒãã³ãã¯å¯äœçšãäœåºŠãç»é²ããããç Žæ£ããããããããšã«å¯ŸããŠèæ§ãæã€ããšãå¿ èŠã«ãªããŸããã»ãšãã©ã®å¯äœçšã¯äœã®å€æŽããªãåäœããŸãããäžéšã®å¯äœçšã¯äžåºŠããç»é²ã»ç Žæ£ãããªããã®ãšæ³å®ããŠããŸãã
ãã®åé¡ã«æ°ä»ããããããããã«ãReact 18 㯠strict ã¢ãŒãã«æ°ããéçºæå°çšã®ãã§ãã¯ãå°å ¥ããŸãããã®æ°ãããã§ãã¯ã¯ãã³ã³ããŒãã³ããåããŠããŠã³ãããããã³ã«ããã¹ãŠã®ã³ã³ããŒãã³ããèªåçã«ã¢ã³ããŠã³ãã»åããŠã³ãããã〠2 åç®ã®ããŠã³ãã§ä»¥åã® state ã埩å ããŸãã
ãããŸã§ã¯ãReact ã¯ã³ã³ããŒãã³ããããŠã³ãããŠä»¥äžã®ããã«å¯äœçšãäœæããŠããŸããïŒ
* React ãã³ã³ããŒãã³ããããŠã³ã
* ã¬ã€ã¢ãŠãå¯äœçš (layout effect) ãäœæ
* ïŒéåžžã®ïŒå¯äœçšãäœæ
React 18 ã® strict ã¢ãŒãã§ã¯ãéçºæã«ã³ã³ããŒãã³ããããŠã³ããããå ŽåãReact ã¯ã³ã³ããŒãã³ãã®å³æã¢ã³ããŠã³ãã»åããŠã³ããã·ãã¥ã¬ãŒã·ã§ã³ããŸãïŒ
* React ãã³ã³ããŒãã³ããããŠã³ã
* ã¬ã€ã¢ãŠãå¯äœçšãäœæ
* å¯äœçšãäœæ
* ããŠã³ããããã³ã³ããŒãã³ãå
ã§å¯äœçšã®ç Žæ£ãã·ãã¥ã¬ãŒã
* ã¬ã€ã¢ãŠãå¯äœçšãç Žæ£
* å¯äœçšãç Žæ£
* ããŠã³ããããã³ã³ããŒãã³ãå
ã§ä»¥åã® state ã埩å
ãå¯äœçšã®åçæãã·ãã¥ã¬ãŒã
* ã¬ã€ã¢ãŠãå¯äœçšãäœæ
* å¯äœçšã®äœæçšã³ãŒãã®å®è¡
詳现ã«ã€ããŠã¯ãã¯ãŒãã³ã°ã°ã«ãŒãã®æçš¿ Adding Reusable State to StrictMode ãš How to support Reusable State in Effects ãåç §ããŠãã ããã
ãã¹ãç°å¢ã®èšå®
ãŸããã¹ãã§ createRoot
ã䜿ãããã«ã¢ããããŒãããå Žåããã¹ãã³ã³ãœãŒã«ã«ä»¥äžã®èŠåã衚瀺ãããŸãïŒ
ãããä¿®æ£ããã«ã¯ããã¹ãå®è¡åã« globalThis.IS_REACT_ACT_ENVIRONMENT
ã true
ã«èšå®ããŸãïŒ
// In your test setup file
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
ãã®ãã©ã°ã®ç®çã¯ãReact ããŠããããã¹ãçãªç°å¢ã§å®è¡ãããŠããããš React ã«äŒããããšã§ããReact ã¯æŽæ°ã act
ã§ã©ãããå¿ããå Žåã«ãæçšãªèŠåã衚瀺ããããã«ãªããŸãã
ãã®ãã©ã°ã false
ã«èšå®ããããšã§ act
ãå¿
èŠãªããš React ã«äŒããããšãã§ããŸããããã¯ãã«æ©èœã®ãã©ãŠã¶ç°å¢ãã·ãã¥ã¬ãŒããã end-to-end ãã¹ãã«ãããŠæçšã§ãã
å°æ¥çã«ã¯ããã¹ãã©ã€ãã©ãªããããèªåã§èšå®ããããã«ãªãããšãæåŸ ããŠããŸããäŸãã° React Testing Library ã®æ¬¡æããŒãžã§ã³ã¯ React 18 ã®çµã¿èŸŒã¿ãµããŒããæããŠããã远å ã®èšå®ãäžèŠãšãªã£ãŠããŸãã
ã¯ãŒãã³ã°ã«ãŒãã§ãã¹ãçš act
API ããã³é¢é£ãã倿Žã«é¢ããŠã®èæ¯ãé²èЧå¯èœã§ãã
Internet Explorer ã®ãµããŒãçµäº
ãã®ãªãªãŒã¹ã§ãReact 㯠2022 幎 6 æ 15 æ¥ã«ãµããŒãå€ ãšãªã Internet Explorer ã®ãµããŒããçµäºããŸãããã®å€æŽãä»è¡ãã®ã¯ãReact 18 ã§å°å ¥ãããæ°æ©èœã¯ãã€ã¯ãã¿ã¹ã¯ã®ãããªã¢ãã³ãªãã©ãŠã¶ã®æ©èœã䜿ã£ãŠãããIE ã§ããŸãããªãã£ã«ã§ããªãããã§ãã
Internet Explorer ã®ãµããŒããå¿ èŠãªå Žåã¯ãReact 17 ã䜿ãç¶ããããšããå§ãããŸãã
éæšå¥šå
react-dom
:ReactDOM.render
ã¯éæšå¥šãšãªããŸããã䜿ããšèŠåã衚瀺ãããã¢ããªã¯ React 17 ã¢ãŒãã§åäœããŸããreact-dom
:ReactDOM.hydrate
ã¯éæšå¥šãšãªããŸããã䜿ããšèŠåã衚瀺ãããã¢ããªã¯ React 17 ã¢ãŒãã§åäœããŸããreact-dom
:ReactDOM.unmountComponentAtNode
ã¯éæšå¥šãšãªããŸãããreact-dom
:ReactDOM.renderSubtreeIntoContainer
ã¯éæšå¥šãšãªããŸãããreact-dom/server
:ReactDOMServer.renderToNodeStream
ã¯éæšå¥šãšãªããŸããã
ãã®ä»ã®ç Žå£ç倿Ž
- useEffect ã®ã¿ã€ãã³ã°çµ±äžïŒReact ã¯ã¯ãªãã¯ãããŒæŒäžã®ãããªåå¥ã®ãŠãŒã¶å ¥åã«ãã£ãп޿°ãããªã¬ãããå Žåã«å¯äœçšé¢æ°ãåžžã«åæçã«åŠçããããã«ãªããŸããããããŸã§ããã®æåã¯å¿ ãããäºæž¬å¯èœãªäžè²«ãããã®ã§ã¯ãããŸããã§ããã
- ãã€ãã¬ãŒã·ã§ã³æã®ãšã©ãŒã®å³æ ŒåïŒããã¹ãã³ã³ãã³ããååšããªãããããã¯äœåã«ååšããããšã«ãããã€ãã¬ãŒã·ã§ã³ã®ãã¹ãããã¯ãèŠåã§ã¯ãªããšã©ãŒãšããŠæ±ãããããã«ãªããŸãããä»åŸ React ã¯ãµãŒãã®ããŒã¯ã¢ããã«é©åãããããã«åå¥ã®ããŒããã¯ã©ã€ã¢ã³ãåŽã§æ¿å
¥ãããåé€ããããšãã£ããå¿æ¥åŠçœ®ãã詊ã¿ãªãããã«ãªããããããªãŒå
ã®çŽè¿ã®
<Suspense>
ããŠã³ããªãŸã§ã¯ã©ã€ã¢ã³ãåŽã®ã¬ã³ããŒã䜿ãããã®éæ»ããçºçããŠããŸããŸãããã®å€æŽã«ããããã€ãã¬ãŒã·ã§ã³ãããããªãŒã«äžè²«æ§ãããããšãä¿èšŒããããã€ãã¬ãŒã·ã§ã³æã®ãã¹ãããã«ããèµ·ããããå人æ å ±ãã»ãã¥ãªãã£çµ¡ã¿ã®åé¡ã鲿¢ã§ããŸãã - ãµã¹ãã³ã¹å ã®ããªãŒãåžžã«äžè²«æ§ã®ãããã®ã«ïŒã³ã³ããŒãã³ããããªãŒã«å®å šã«è¿œå ãããåã«ãµã¹ãã³ãããå ŽåãReact ã¯ãããäžå®å šãªç¶æ ã®ãŸãŸããªãŒã«è¿œå ããããå¯äœçšãèµ·åãããã¯ããŸããããã®ä»£ãããReact ã¯æ°ããããªãŒãå®å šã«ç Žæ£ããéåæã®æäœãå®äºããã®ãåŸ ã¡ãæåããã¬ã³ããŒãå詊è¡ããŸããReact ã¯å詊è¡ãã䞊è¡çã«ããã©ãŠã¶ããããã¯ããã«è¡ããŸãã
- ãµã¹ãã³ã¹ãšã¬ã€ã¢ãŠãå¯äœçšïŒããªãŒãåãµã¹ãã³ãããŠãã©ãŒã«ããã¯ã«éæ»ãããå ŽåãReact ã¯ã¬ã€ã¢ãŠãçšã®å¯äœçšãã¯ãªãŒã³ã¢ããããããŠã³ããªå ã®ã³ã³ãã³ããå衚瀺ããããšãã«ããããåäœæããããã«ãªããŸãããããã«ããããµã¹ãã³ã¹ãšäžç·ã«äœ¿çšããããšãã«ã³ã³ããŒãã³ãã©ã€ãã©ãªãã¬ã€ã¢ãŠããæ£ããæž¬å®ã§ããªããšããåé¡ãä¿®æ£ãããŸãã
- JS ç°å¢ã®èŠä»¶å€æŽïŒReact ã¯
Promise
ãSymbol
ãObject.assign
ã®ãããªã¢ãã³ãã©ãŠã¶ã®æ©èœã«äŸåããããã«ãªããŸãããã¢ãã³ãªãã©ãŠã¶æ©èœã«ã€ããŠãã€ãã£ãå®è£ ããŠããªããéæšæºãªå®è£ ãããŠãã Internet Explorer ã®ãããªå€ããã©ãŠã¶ãããã€ã¹ããµããŒãããå Žåã¯ããã³ãã«ãããã¢ããªã«ã°ããŒãã«ãªããªãã£ã«ãå«ããããšãæ€èšããŠãã ããã
ãã®ä»ã®æ³šç®ãã¹ã倿Ž
React
- ã³ã³ããŒãã³ãã
undefined
ã return ã§ããããã«ïŒReact ã¯ã³ã³ããŒãã³ãããundefined
ãè¿ãããå Žåã§ãèŠåããªããªããŸãããããã«ãããã³ã³ããŒãã³ãããã®è¿ãå€ãšããŠèš±ãããå€ããã³ã³ããŒãã³ãããªãŒã®äžéã§èš±å¯ãããå€ãšåèŽããããã«ãªããŸãããJSX ã®åã«return
æãæžãå¿ãããšãã£ããã¹ãé²ãããã«ã¯ããªã³ã¿ã䜿çšããããšããå§ãããŸãã - ãã¹ãã«ãããŠ
act
èŠåããªããã€ã³ã«ïŒEnd-to-end ã®ãã¹ããå®è¡ããŠããå Žåãact
èŠåã¯äžèŠã§ãããªããã€ã³ããã¡ã«ããºã ãçšæããŸããã®ã§ããããæçšã§ãããŠããããã¹ãã®å Žåã«ã®ã¿æå¹åã§ããããã«ãªããŸããã - ã¢ã³ããŠã³ãæžã¿ã³ã³ããŒãã³ãã«ããã
setState
ã§èŠåã衚瀺ããªãããã«ïŒãããŸã§ React ã¯ãsetState
ãã¢ã³ããŠã³ãæžã¿ã®ã³ã³ããŒãã³ãã§ã³ãŒã«ãããå Žåãã¡ã¢ãªãªãŒã¯ã«é¢ããèŠåã衚瀺ããŠããŸããããã®èŠåã¯è³Œèªã«é¢ããåé¡ã®ããã«ååšããŠããŸããããstate ãã»ããããŠãåé¡ãªãã·ããªãªã§ããã®èŠåã«ã¶ã€ããããšãå€ãããŸãåé¿ããããšããå Žåäœèšã«æªãã³ãŒãã«ãªã£ãŠããŸã£ãŠããŸããããã®èŠåã¯åé€ãããŸããã - ã³ã³ãœãŒã«ãã°ã®ææ¢ã廿¢ïŒstrict ã¢ãŒããå©çšããå ŽåãReact ã¯ã³ã³ããŒãã³ãã 2 åã¬ã³ããŒããŠãäºæããªãå¯äœçšããªããèŠã€ããããããŸããReact 17 ã§ã¯ããã°ãèŠããããªãããã«ãã®ãã¡ã® 1 åã§ã¯ã³ã³ãœãŒã«ãã°ãææ¢ããããã«ããŠããŸããããããæ··ä¹±ãæããšããã³ãã¥ããã£ããã®ãã£ãŒãããã¯ãåããŠããã®ãããªææ¢ãè¡ãããšãæ¢ããŸããã代ããã«ãReact DevTools ãã€ã³ã¹ããŒã«ããŠããå Žåã¯ã2 åç®ã®ã¬ã³ããŒã§ã®ãã°ã¯ã°ã¬ãŒã§è¡šç€ºãããããã«ãªããŸãããå®å šã«ææ¢ããããã®ãªãã·ã§ã³ïŒããã©ã«ãã§ã¯ãªãïŒãååšããŸãã
- ã¡ã¢ãªäœ¿çšéã®æ¹åïŒReact ã¯ã¢ã³ããŠã³ãæã«å éšã®ãã£ãŒã«ããããå€ãæ¶å»ããããã«ãªã£ããããããªãã®ã¢ããªã«æªä¿®æ£ã®ã¡ã¢ãªãªãŒã¯ããã£ãå Žåã®æªåœ±é¿ã軜æžãããŸãã
React DOM Server
renderToString
ïŒãµãŒãåŽã§ãµã¹ãã³ããèµ·ããå Žåã§ããšã©ãŒã«ãªããªããªããŸããã代ããã«ãçŽè¿ã®<Suspense>
ã«ãããã©ãŒã«ãã㯠HTML ãåºåããã¯ã©ã€ã¢ã³ãåŽã§åãã³ã³ãã³ãã®ã¬ã³ããŒãå詊è¡ããããã«ãªããŸãããšã¯ãããrenderToPipeableStream
ãrenderToReadableStream
ã®ãããªã¹ããªãŒãã³ã° API ã«åãæ¿ããããšãæšå¥šãããŸããrenderToStaticMarkup
ïŒãµãŒãåŽã§ãµã¹ãã³ããèµ·ããå Žåã§ããšã©ãŒã«ãªããªããªããŸããã代ããã«ãçŽè¿ã®<Suspense>
ã«ãããã©ãŒã«ãã㯠HTML ãåºåããŸãã
Changelog
倿Žå±¥æŽã®å šãªã¹ãã¯ãã¡ããåç §ããŠãã ããã