ð°ã¯ãããŠã®Reactå ¥éã¬ã€ããã¯ã€ãã¯ã¹ã¿ãŒãã
ããã³ããšã³ããèŠæãªã®ã«ãReactãå§ããŠã¿ã
èš³ãã£ãŠReactã®å匷ãå§ããŸããã
æ¥ããAIãæŽ»çšããŠããé¢ä¿ã§Pythonã¯å°ãæ £ããŠããŸãããããã³ããšã³ãã¯èŠææèããããããŸã§è·é¢ã眮ããŠããŸããã
javascriptã ããªãããŸã ãã·ã§ããã
ãHTMLãšãCSSãšãèŠããã®é¢åããã»ã»ã»ã
ãšããã®ãããããããŸã§æ¬é ããŠããŸããã
ãšããããããæ«æããããšãªãæã£åãæ©ãå§ããŠã¿ããããšããããšã§ãããããèªã¿æŒã£ãçµæãå ¬åŒãµã€ãã®ãã¯ã€ãã¯ã¹ã¿ãŒãããåå¿è åãã«ç°¡åãããªã®ã§ããããåããŠã¿ãŸãããïŒå ¬åŒã®ã¯ã€ãã¯ã¹ã¿ãŒãã ããã£ãŠããªããšReactã®ã³ã³ã»ããã®8å²ããã®ã¯ã€ãã¯ã¹ã¿ãŒãã«çã蟌ãŸããŠãããã§ãïŒ
React ããã¥ã¡ã³ããžããããïŒ ãã®ããŒãžã§ã¯ãæ¥ã ã®éçºã§äœ¿çšãã React ã®ã³ã³ã»ããã®ãã¡ 80ïŒ ã®éšåã玹ä»ããŸãã
åèæ å ±
ã§ãããã®æã®å ¬åŒãµã€ãã®æ å ±ã¯è¡éãçç¥ãããŠããŠãšãŠããããã«ããã®ãå€ãã®ã§ãå°ãè¡éãè£å®ããªãããŸãšããŠã¿ãŸããã
äºåæºå
æ®å¿µãªãããReactã®ã¯ã€ãã¯ã¹ã¿ãŒãã«ã¯ãReactã®ç°å¢æºåæ¹æ³ã¯èšèŒããããŸããã§ããã
æ¬èšäºã§ãç°å¢æºåã¯çç¥ããŸãããçè ã®ç°å¢ã§ã¯äºåã«ä»¥äžãæºåããŠããŸãã
- nodeã®ã€ã³ã¹ããŒã«
- npx create-react-appãïœã®å®è¡
- npm startã§Reactåäœç¢ºèª
Reactã®ç°å¢æºåæ¹æ³ã¯ããŸããŸãªæ¹æ³ããããæ å ±ããããããããŸãã®ã§ãã奜ã¿ã®æ¹æ³ã§æºåããŠãããŸãããã
Webãã©ãŠã¶äžã§Reactã®éçºãã§ãã以äžã®ãµãŒãã¹ãããããã§ããFreeãã©ã³ããããŸãã®ã§åŠç¿çšéã®ç¯å²ãªãç¡åã§å©çšã§ãããšæããŸãã
- CodeSandBox
- StackBlitz
åèãŸã§ã«çè ã®ç°å¢æºåã®é çªã以äžèšèŒããŠãããŸãã
nodeã®ããŒãžã§ã³
# node -v
v22.14.0
npxã®å®è¡
# npx create-react-app test-react-typescript --teplate typescript
npm startã§å®è¡
# cd test-react-typescript/
# ls
README.md node_modules package-lock.json package.json public src
# npm start
ããŒã«ã«ã§ç«ã¡äžããå Žåã¯ããã©ãŠã¶ã§ãhttp://localhost:3000ãã«ã¢ã¯ã»ã¹ããŸãã
以äžã®ç»é¢ã衚瀺ããããReactã®åäœç¢ºèªã¯å®äºã§ãã
Reactã¯ã€ãã¯ã¹ã¿ãŒã
ããã§ã¯å ¬åŒã®ã¯ã€ãã¯ã¹ã¿ãŒãã«æ²¿ã£ãŠå§ããŠãããŸãããã
ã³ã³ããŒãã³ãã®äœæãšãã¹ã
Reactã¢ããªã¯ãã³ã³ããŒãã³ãããšãããããã¯ã§äœãããŠããŸããã³ã³ããŒãã³ãã¯ãç°¡åã«èª¬æãããšä»¥äžã®ãšããã§ãã
ã³ã³ããŒãã³ãã¯ãç»é¢ã«è¡šç€ºãããéšåã§ã
ããããã®éšåã¯èŠãç®ïŒãã¶ã€ã³ïŒãšåãïŒæ©èœïŒãæã£ãŠããŸã
å°ããªã³ã³ããŒãã³ãïŒäŸïŒãã¿ã³ãå ¥åãã©ãŒã ïŒãã倧ããªã³ã³ããŒãã³ãïŒäŸïŒããããŒãããŒãžå šäœïŒãŸã§ãããŸã
æè¡çã«ã¯ãReactã®ã³ã³ããŒãã³ãã¯ãHTMLã®ãããªããŒã¯ã¢ãããè¿ãJavaScript颿°ãã§ãã
ããã¯äŸãã§èšããšãããã®é¢æ°ãåŒã¶ãšãç»é¢ã«è¡šç€ºããéšåãè¿ã£ãŠããããšããä»çµã¿ã§ãã
ã³ã³ããŒãã³ããçµã¿åãããããšã§ãè€éãªãŠã§ããµã€ããç°¡åãªããŒãã«åè§£ããŠäœãããšãã§ããŸãã
以äžã¯HTMLã®ã<button>ãã¿ã°ãè¿åŽããMyButton()ãšãã颿°ã®äŸã§ãã
function MyButton() {
return (
<button>I'm a button</button>
);
}
MyButton颿° ã宣èšããããšãå¥ã®ã³ã³ããŒãã³ãå ã«ãã¹ãã§ããŸãã
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
Reactã§ã¯ååã®ä»ãæ¹ã«éèŠãªã«ãŒã«ããããŸãã
<MyButton /> ã倧æåã§å§ãŸã£ãŠããããšã«æ³šç®ããŠãã ãããããã«ã¯çç±ããããŸãã
倧æåãšå°æåã®äœ¿ãåã
- 倧æåã§å§ããïŒ<MyButton />ã<Header />ã<ProfileCard />
- ãããã¯Reactã®ã«ã¹ã¿ã ã³ã³ããŒãã³ãã ãšèªèãããŸã
- ããªããä»ã®éçºè ãäœã£ãããŒãã§ããããšã瀺ããŸã
- å°æåã§å§ããïŒ<div>ã<span>ã<button>
- ãããã¯éåžžã®HTMLã¿ã°ã ãšèªèãããŸã
- ãã©ãŠã¶ãæåããçè§£ã§ããæšæºçãªèŠçŽ ã§ã
å é ã®æåã倧æåã«ããããšã§React ã®ã³ã³ããŒãã³ãã§ãããšããããšã瀺ããŠããŸããReact ã®ã³ã³ããŒãã³ãåã¯åžžã«å€§æåã§å§ããå¿ èŠããããŸããäžæ¹ãHTML ã¿ã°ã¯å°æåã«ããå¿ èŠããããŸãã
ããã§ã¯ãå®éã«ãã¿ã³ã衚瀺ããŠã¿ãŸãããã
ãnpx create-react-appãïœãã§äœæããå Žåãsrc/App.jsãã¡ã€ã«ããããŸãã®ã§ãäžèº«ãå šéšåé€ããŸãã
äžèº«ãæ¶ããããšã以äžã®ããã«èšèŒããŸãã
function MyButton() {
return (
<button>
I'm a button
</button>
);
}
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
ãã¡ã€ã«ãä¿åãããšãèªåçã«ãã©ãŠã¶ã§ãhttp://localhost:3000ãã«ã¢ã¯ã»ã¹ããç»é¢ãèªåçã«ä»¥äžã®ããã«å€æŽãããŸããïŒããç»é¢ãå€ãããªãå Žåã¯ãç»é¢ããªããŒãããŠã¿ãŠãã ããïŒ
ã¡ãããšãã¿ã³ã衚瀺ãããŸããã
JavaScript ã®æ§æã«ã€ããŠã®è©³çްã¯ãMDN ãjavascript infoã®ãªãã¡ã¬ã³ã¹ãåç §ããŸãããã
JSX ã§ããŒã¯ã¢ãããæžã
åè¿°ã®ããŒã¯ã¢ããæ§æã¯ããJSXãèšæ³ãšåŒã°ããŠããŸãã
å©çšããªããŠãåé¡ãªãã§ãã®ã§ããã䟿å©ãªã®ã§ã»ãšãã©ã®React ãããžã§ã¯ãã§ã¯ JSX ã䜿çšãããŠãããšæããŸãã
HTMLãšæ¯èŒãããšJSX ã§ã¯æ§æèгç¹ã§ããã€ã泚æç¹ããããŸãã
ã®ããã«ã¿ã°ã¯éããå¿
èŠããããŸãããŸããã³ã³ããŒãã³ãã¯è€æ°ã® JSX ã¿ã°ã return ããããšã¯ã§ããŸããã<div>...</div> ã空㮠<>...</> ã©ããã®ãããªå
±éã®èŠªèŠçŽ ã§å²ãå¿
èŠããããŸãã
è€æ°ã¿ã°ãNGãªäŸïŒ<h1>ãš<p>ã¿ã°ã®ïŒã€ãreturnã§æå®ãããŠããŸãïŒ
export default function MyApp() {
return (
<h1>Welcome to my app</h1>
<p>ããã«ã¡ã¯</p>
);
}
äžèšã®æžãæ¹ã ãšãè€æ°ã¿ã°ãreturnã§è¿ããŠãããããšã©ãŒãåºãŸãã
ãã®å Žåã¯ã芪èŠçŽ ãšããŠ<div></div>ã远å ããŠreturnã§è¿ãã¿ã°ãïŒã€ã«ããå¿ èŠããããŸãã
OKãªäŸ
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<MyButton />
</div>
);
}
以äžã®ããã«ç©ºã¿ã°ã䜿ã£ãŠãreturnãšããŠã¯ïŒã€ã®ã¿ã°ã«ãªããŸãã®ã§ããã§ãåé¡ãããŸããã
空ã¿ã°ã§æ¬ã£ãäŸ
function AboutPage() {
return (
<>
<h1>About</h1>
<p>Hello there.<br />How do you do?</p>
</>
);
}
åè¿°ã®äŸã§ã¯ã<div></div>ã¿ã°ã§returnã§è¿ãã¿ã°ãäžã€ã§ãã®ã§ãäžã«ã¿ã°ã远å ããããšã¯å¯èœã§ãã
詊ãã«ãããã»ã©ãã¿ã³ã衚瀺ããApp.jsã«<h2>ã<p>ã¿ã°ã远å ããŠã¿ãŸãããã
function MyButton() {
return (
<button>
I'm a button
</button>
);
}
export default function MyApp() {
return (
<div>
<h1>Welcome to my app</h1>
<h2>ãã¿ã³ã®ãã¹ã</h2>
<p>ãã¿ã³ã®ãã¹ã</p>
<MyButton />
</div>
);
}
HTMLã¿ã°ã衚瀺ãããŸããã
JSXã¯äŸ¿å©ãšã¯ãããJSXã«å€æãããHTMLãããããããå Žåã¯å°ãé¢åã§ãããããããJSX ã«å€æããªããšãããªã HTML ãããããããå Žåã¯ããªã³ã©ã€ã³ã³ã³ããŒã¿ã䜿ããšäžæ°ã«å€æãå¯èœã§ãã
ïŒãªã³ã©ã€ã³ã³ã³ããŒã¿ïŒ
äŸãã°ä»¥äžã®ãããªHTMLããJSXã«å€æããŠãããŸãã
HTML
<!-- Hello world -->
<div class="awesome" style="border: 1px solid red">
<label for="name">Enter your name: </label>
<input type="text" id="name" />
</div>
<p>Enter your HTML here</p>
JSX
<>
{/* Hello world */}
<div className="awesome" style={{ border: "1px solid red" }}>
<label htmlFor="name">Enter your name: </label>
<input type="text" id="name" />
</div>
<p>Enter your HTML here</p>
</>
ã¹ã¿ã€ã«ã®è¿œå
React ã§ã¯ãCSS ã¯ã©ã¹ã className ã§æå®ããŸããHTML ã® class 屿§ãšåãæ¹æ³ã§åäœããŸãã
<img className="avatar" />
ãããŠãå¥ã® CSS ãã¡ã€ã«ã«å¯Ÿå¿ãã CSS ã«ãŒã«ãèšè¿°ããŸãã
/* In your CSS */
.avatar {
border-radius: 50%;
}
border-radiusïŒãCSSã®ããããã£ã§ãèŠçŽ ã®å¢çã®è§ãäžžããŸãã1 ã€ã®ååŸãèšå®ãããšåã®è§ã«ãªãã2 ã€ã®ååŸãèšå®ãããšæ¥åã®è§ã«ãªããŸããäžèšäŸã§ã¯ïŒã€ã®ååŸãæå®ããŠããã®ã§äžžè¡šç€ºã«ãªããŸãã
以äžã®ãµã€ãã«ã¢ã¯ã»ã¹ãããšCSSã®å¹æããªã¢ã«ã¿ã€ã ã«ç¢ºèªããããšãå¯èœã§ãã
詊ãã«ãäžããïŒã€ç®ã®ãborder-radius: 25% 10%;ããã¯ãªãã¯ãããšãå³åŽã«å¹æã®ã€ã¡ãŒãžã衚瀺ãããŸãã
React ã«ã¯ CSS ãã¡ã€ã«ã®è¿œå æ¹æ³ã«é¢ããèŠåã¯ãããŸããã
ç°¡åãªäŸãæãããšãHTML ã« <link> ã¿ã°ã远å ããŸãããã«ãããŒã«ããã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠããå Žåã¯ããããã®ããã¥ã¡ã³ããåç §ããŠããããžã§ã¯ãã« CSS ãã¡ã€ã«ã远å ããæ¹æ³ã確èªããŸãããã
ããŒã¿ã®è¡šç€º
JSX ã䜿ãããšã§ãJavaScript å ã«ããŒã¯ã¢ãããå ¥ããããšãã§ããŸãã
å察ã«ãæ³¢æ¬åŒ§ã{ }ãã䜿ãããšã§ãJSX ã®äžãã JavaScript ã«ãæ»ããããšãã§ããŸãã
ã³ãŒãå ã®å€æ°ãåã蟌ãã§ãŠãŒã¶ã«è¡šç€ºããããšãã§ããŸããããšãã°ã以äžã¯å€æ°ã§ããuser.name ã衚瀺ããŸãã
return (
<h1>
{user.name}
</h1>
);
JSX ã®å±æ§ (attribute) ã®éšåãã JavaScript ã«ãæ»ããããšãã§ãããã®å ŽååŒçšç¬Šã®ä»£ããã«æ³¢æ¬åŒ§ã䜿ãå¿ èŠããããŸãã
äŸãã°ãclassName="avatar" 㯠CSS ã¯ã©ã¹ãšã㊠"avatar" æååãæž¡ããã®ã§ãããsrc={user.imageUrl} 㯠JavaScript ã® user.imageUrl 倿°ã®å€ãèªã¿èŸŒã¿ããã®å€ã src 屿§ãšããŠæž¡ããŸãã
return (
<img
className="avatar"
src={user.imageUrl}
/>
);
以äžã®ãããªconsole.log()ãå©çšããããšãå¯èœã§ãã
return (
<>
{console.log("console log test")
<h1>
{user.name}
</h1>
</>
);
JSX ã®æ³¢æ¬åŒ§ã®äžã«ãã£ãšè€éãªåŒãå ¥ããããšãã§ããŸããäŸãã°ãæååã®é£çµãã§ããŸãã
以äžã®ã³ãŒãã§ã¯ããalt={âPhoto of â + user.name}ãã§æååãé£çµããŠããŸãã
const user = {
name: 'Hedy Lamarr',
imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
imageSize: 90,
};
export default function Profile() {
return (
<>
<h1>{user.name}</h1>
<img
className="avatar"
src={user.imageUrl}
alt={'Photo of ' + user.name}
style={{
width: user.imageSize,
height: user.imageSize
}}
/>
</>
);
}
ãã©ãŠã¶ã®ç»é¢ã§èŠãŠã¿ãŸãããã
ååãšåçã衚瀺ãããŸããã
ãŸããæååã®é£çµãã§ãããã確èªããŠã¿ãŸãããã
ãã©ãŠã¶ã§ãF12ãããŒãæŒããŠãããããããŒããŒã«ãèµ·åããŸããalt屿§éšåã®æååãé£çµãããŠããããšãããããŸãã
次ã«è¡šç€ºãããŠããå 容ãèŠãŠãããŸãããã
ã³ãŒãã§ã¯ã<h1>ã¿ã°ã§ã{user.name}ãæå®ãããŠããŸããã{}ã§æ¬ãããšã§ãjavascriptã§å®çŸ©ãã倿°ãHTMLã¿ã°ã®äžã§å©çšã§ããŸãã
äžèšã®äŸã§ã¯ãstyle={{}} ã¯ç¹å¥ãªæ§æã§ã¯ãªããstyle={ } ãšãã JSX ã®æ³¢æ¬åŒ§å ã«ããéåžžã® {} ãªããžã§ã¯ãã§ãã
ã¹ã¿ã€ã«ã JavaScript 倿°ã«äŸåããå Žåã¯ãstyle 屿§ã䜿ãããšãã§ããŸãã
次ã«cssãã¡ã€ã«ïŒã¹ã¿ã€ã«ã·ãŒãïŒã®èªã¿èŸŒãã§ã¿ãŸãããã
App.cssãã¡ã€ã«ã®äžçªäžã«ä»¥äžã远å ããŸãã
App.css
ïœãïœ
/* In your CSS */
.avatar {
border-radius: 50%;
}
App.jsãã¡ã€ã«ã®å é ã«ãimport â./App.cssâ;ãã远å ããŸãã
App.js
import "./App.css";
const user = {
name: 'Hedy Lamarr',
imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
imageSize: 90,
};
export default function Profile() {
return (
<>
<h1>{user.name}</h1>
<img
className="avatar"
src={user.imageUrl}
alt={'Photo of ' + user.name}
style={{
width: user.imageSize,
height: user.imageSize
}}
/>
</>
);
}
åé ã®ãimport â./App.cssâãã§ã¹ã¿ã€ã«ã·ãŒããèªã¿èŸŒãã§ããŸãã
ãã以å€ã¯å€æŽç¡ãã§ãã
ããã§ã¯ããŒãžããªããŒãããŸãã
ç»åãApp.cssãã¡ã€ã«ã§æå®ãããšãããµãŒã¯ã«è¡šç€ºã«ãªããŸããã
æ¡ä»¶ä»ãã¬ã³ããŒ
React ã«ã¯ãæ¡ä»¶åå²ãæžãããã®ç¹å¥ãªæ§æã¯ååšããŸããã
代ããã«ãéåžžã® JavaScript ã³ãŒããæžããšãã«äœ¿ãã®ãšåãææ³ã䜿ããŸãã
äŸãã°ãif æã䜿ã£ãŠæ¡ä»¶ä»ãã§ JSX ãå«ããããšãã§ããŸãã
let content;
if (isLoggedIn) {
content = <AdminPanel />;
} else {
content = <LoginForm />;
}
return (
<div>
{content}
</div>
);
ã³ã³ãã¯ããªã³ãŒãã«ãããå Žåã¯ãæ¡ä»¶ ã? ãæŒç®åã䜿çšã§ããŸããif ãšã¯ç°ãªããJSX ã®äžã§åäœããŸãã
<div>
{isLoggedIn ? (
<AdminPanel />
) : (
<LoginForm />
)}
</div>
else åŽã®åå²ãäžèŠãªå Žåã¯ãçãè«çæ§æã && ãã䜿çšããããšãã§ããŸãã
<div>
{isLoggedIn && <AdminPanel />}
</div>
ãããã®ã¢ãããŒãã¯ãã¹ãŠã屿§ãæ¡ä»¶ä»ãã§æå®ããå Žåã«ãæ©èœããŸãããã®ãã㪠JavaScript æ§æã®äžéšã«æ £ããŠããªããšããå Žåãæåã¯åžžã« if...else ã䜿çšããããšã«ããŠãæ§ããŸããã
ïŒæ¡ä»¶ä»ãã¬ã³ããŒã®è©³çްïŒ
æ¡ä»¶ãæºããå Žåã« JSX ãè¿ãïŒå®è·µïŒ
äŸãã°ãè€æ°ã® Item ãã¬ã³ããŒãã PackingList ã³ã³ããŒãã³ãããããå Item ãå®äºããŠãããã©ããã衚瀺ããããå ŽåãèŠãŠã¿ãŸãããã
function Item({ name, isPacked }) {
return <li className="item">{name}</li>;
}
export default function PackingList() {
return (
<section>
<h1>é è¶³ã®æã¡ç©ãªã¹ã</h1>
<ul>
<Item
isPacked={true}
name="ãåŒåœ"
/>
<Item
isPacked={true}
name="æ°Žç"
/>
<Item
isPacked={false}
name="ãèå"
/>
</ul>
</section>
);
}
ç»é¢ã衚瀺ããŠã¿ãŸãããã
ã³ãŒãã確èªãããšãè€æ°ã® Item ã³ã³ããŒãã³ãã®ãã¡äžéšã§ãprops ã§ãã isPacked ã true ã«ããŠããŸãã
ãã®æå³ã¯ãisPacked={true} ã®å Žåã«ã®ã¿ãã§ãã¯ããŒã¯ (â ) ã衚瀺ãããããšã§ãã
ãã㯠if/else æã䜿ã£ãŠã以äžã®ããã«æžãããšãã§ããŸãã
if (isPacked) {
return <li className="item">{name} â
</li>;
}
return <li className="item">{name}</li>;
isPacked ããããã£ã true ã ã£ãå Žåããã®ã³ãŒãã¯ç°ãªã JSX ããªãŒãè¿ããŸãããã®å€æŽã«ãããäžéšã®ã¢ã€ãã ã®æ«å°Ÿã«ãã§ãã¯ããŒã¯ã衚瀺ãããããã«ãªããŸãã
function Item({ name, isPacked }) {
if (isPacked) {
return <li className="item">{name} â
</li>;
}
return <li className="item">{name}</li>;
}
export default function PackingList() {
return (
<section>
<h1>é è¶³ã®æã¡ç©ãªã¹ã</h1>
<ul>
<Item
isPacked={true}
name="ãåŒåœ"
/>
<Item
isPacked={true}
name="æ°Žç"
/>
<Item
isPacked={false}
name="ãèå"
/>
</ul>
</section>
);
}
ããããã®å Žåã«è¿ãããå 容ãç·šéããŠã¿ãŠã衚瀺ãã©ã®ããã«å€åããã確èªããŸããããæ¡ä»¶åå²ããžãã¯ãå®è£ ããããã« JavaScript ã® if ã return æã䜿ã£ãããšã«æ³šç®ããŠãã ãããReact ã§ã¯ãå¶åŸ¡ãããŒïŒæ¡ä»¶åå²ãªã©ïŒã¯ JavaScript ã§åŠçãããŸãã
ãªã¹ãã®ã¬ã³ããŒ
ã³ã³ããŒãã³ãã®ãªã¹ããã¬ã³ããŒããå Žåã¯ãfor ã«ãŒã ã é åã® map() 颿° ãšãã£ã JavaScript ã®æ©èœã䜿ã£ãŠè¡ããŸããäŸãã°ãã®ãããªååã®é åããããšããŸãã
const products = [
{ title: 'ãã£ãã', id: 1 },
{ title: 'ãã³ãã¯', id: 2 },
{ title: 'ãªã³ãŽ', id: 3 },
];
ã³ã³ããŒãã³ãå ã§ãmap() 颿°ã䜿ã£ãŠååã®é åã <li> èŠçŽ ã®é åã«å€æããŸãã
const listItems = products.map(product =>
<li key={product.id}>
{product.title}
</li>
);
return (
<ul>{listItems}</ul>
);
aã³ãŒããèŠããš<li> ã« key 屿§ãããããšãããããŸãããªã¹ãå ã®åé ç®ã«ã¯ãããããäžæã«èå¥ããããã®æååãŸãã¯æ°å€ãæž¡ãå¿ èŠããããŸããéåžžãkey ã¯ããŒã¿ããæ¥ãã¯ãã§ãããŒã¿ããŒã¹äžã® ID ãªã©ã該åœããŸããReact ã¯ãåŸã§ã¢ã€ãã ãæ¿å ¥ãåé€ãäžŠã¹æ¿ããããšããã£ãéã«ãäœãèµ·ãã£ããã key ã䜿ã£ãŠææ¡ããŸãã
const products = [
{ title: 'ãã£ãã', isFruit: false, id: 1 },
{ title: 'ãã³ãã¯', sFruit: false, id: 2 },
{ title: 'ãªã³ãŽ', isFruit: true, id: 3 },
];
export default function ShoppingList() {
const listItems = products.map(product =>
<li
key={product.id}
style={{
color: product.isFruit ? 'magenta' : 'darkgreen'
}}
>
{product.title}
</li>
);
return (
<ul>{listItems}</ul>
);
}
äžèšã®ã³ãŒããå®è¡ããŠã¿ãŸãããã
ãªã¹ãã衚瀺ããããšãã§ããŸããã
ã€ãã³ãã«å¿çãã
ã³ã³ããŒãã³ãã®äžã§ã€ãã³ããã³ãã©é¢æ°ã宣èšããããšã§ãã€ãã³ãã«å¿çã§ããŸãããã¿ã³ãã¯ãªãã¯ãããªã©ã®ã€ãã³ããåŠçããããšãã§ããŸãã
function MyButton() {
function handleClick() {
alert('You clicked me!');
}
return (
<button onClick={handleClick}>
Click me
</button>
);
}
onClick={handleClick} ã®æ«å°Ÿã«æ¬åŒ§ããªãããšã«æ³šç®ããŠãã ããã
ããã§ã€ãã³ããã³ãã©é¢æ°ãåŒã³åºãããã§ã¯ãããŸããã
ãŠãŒã¶ããã¿ã³ãã¯ãªãã¯ãããšãã«ãReact ãã€ãã³ããã³ãã©ãåŒã³åºããŸãã
ç»é¢ã®æŽæ°
ãã°ãã°ãã³ã³ããŒãã³ãã«æ å ±ããèšæ¶ããããŠè¡šç€ºãããããšããããŸããäŸãã°ããã¿ã³ãã¯ãªãã¯ãããåæ°ãæ°ããŠèŠããŠããããå Žåã§ãããããè¡ãã«ã¯ãã³ã³ããŒãã³ãã« state ã远å ããŸãããŸããReact ãã useState ãã€ã³ããŒãããŸãã
useState ãšã¯ãã³ã³ããŒãã³ãã« state 倿° ã远å ããããã® React ããã¯ã§ãã
import { useState } from 'react';
ããã§ãã³ã³ããŒãã³ãå ã« state 倿°ã宣èšã§ããŸãã
ïŒstateã®è©³çްïŒ
function MyButton() {
const [count, setCount] = useState(0);
// ...
useStateã¯Reactã®ç¹å¥ãªæ©èœã§ãç»é¢ã®è¡šç€ºå 容ãç°¡åã«å€æŽã§ããããã«ããŸããäŸãã°ãã«ãŠã³ã¿ãŒã®ä»çµã¿ãèŠãŠã¿ãŸãããã
- useStateã䜿ããšã2ã€ã®äŸ¿å©ãªãã®ãæã«å
¥ããŸãã
- çŸåšã®å€ïŒäŸïŒcountïŒ- ç»é¢ã«è¡šç€ºãããæ°å
- æŽæ°çšã®é¢æ°ïŒäŸïŒsetCountïŒ- ãã®å€ã倿Žããããã®éå ·
- ååã¯èªç±ã«æ±ºããããŸãããæ®é㯠[å€, setå€] ãšãã圢åŒã§æžããŸãã
- const [count, setCount] = useState(0);
- useState(0)ã®0ã¯åæå€ã§ãã
-ã³ã³ããŒãã³ããåããŠç»é¢ã«è¡šç€ºããããšããcountã¯0ã«ãªããŸã - å€ãå€ããããšãã¯ãæŽæ°é¢æ°ã䜿ããŸãã
- setCount(1)ãšæžãã°ãcountã1ã«å€ãããŸã
- setCount(count + 1)ãšæžãã°ãçŸåšã®å€ã«1ãè¶³ããæ°ããå€ã«ãªããŸã
- ãã¿ã³ã¯ãªãã¯ãšçµã¿åããããšãã¯ãªãã¯ãããã³ã«æ°åãå¢ããã«ãŠã³ã¿ãŒãäœããŸãã
ãã®ããã«useStateãå©çšããããšãã§ããŸãã
function MyButton() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<button onClick={handleClick}>
Clicked {count} times
</button>
);
}
React ã¯ãå床ã³ã³ããŒãã³ãã®é¢æ°ãåŒã³åºããŸããä»åºŠã¯ count ã 1 ã«ãªã£ãŠããŸããæ¬¡ã®åŒã³åºãã§ã¯ 2 ã«ãªã£ãŠããŸããæ¬¡ã ãšå¢ããŠãããŸããåãã³ã³ããŒãã³ããè€æ°ã®å Žæã§ã¬ã³ããŒããå Žåããããããç¬èªã® state ãæã¡ãŸããããããã®ãã¿ã³ãåå¥ã«ã¯ãªãã¯ããŠã¿ãŸãããã
import { useState } from 'react';
export default function MyApp() {
return (
<div>
<h1>Counters that update separately</h1>
<MyButton />
<MyButton />
</div>
);
}
function MyButton() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<button onClick={handleClick}>
Clicked {count} times
</button>
);
}
äžèšã³ãŒãã®ç»é¢ã衚瀺ããŠã¿ãŸãããã
ãã¿ã³ãã¯ãªãã¯ãããã³ã«ãã¯ãªãã¯ããæ¹ã®ãã¿ã³ã®æ°åãã«ãŠã³ãã¢ãããããŸãã
åãã¿ã³ããããã count ãšãã state ããèšæ¶ãããä»ã®ãã¿ã³ã«åœ±é¿ãäžããªãããšã«æ³šç®ããŠãã ããã
ããã¯ïŒHookïŒã«ã€ããŠ
ããã¯ã¯ãReactã®ç¹å¥ãªæ©èœã䜿ãããã®éå ·ãã§ããäŸãã°ä»¥äžã®ãããªãã®ããããŸãã
- useState - å€ãä¿åããŠæŽæ°ããããã®ããã¯
- useEffect - ç»é¢è¡šç€ºåŸã«äœããå®è¡ããããã®ããã¯
- useContext - ã³ã³ããŒãã³ãéã§ããŒã¿ãå ±æããããã®ããã¯
ããã¯ã®ç¹åŸŽ
- çš®é¡ïŒ
- ReactãæäŸãããçµã¿èŸŒã¿ããã¯ãããããŸã
- èªåã§ãã«ã¹ã¿ã ããã¯ããäœãããšãã§ããŸãïŒæ¢åã®ããã¯ãçµã¿åãããŠïŒ
- éèŠãªã«ãŒã«ïŒ
- ããã¯ã¯ã³ã³ããŒãã³ãã®äžçªäžã®ã¬ãã«ã§ã®ã¿äœ¿ããŸã
- æ¡ä»¶åå²ïŒifæïŒãã«ãŒãïŒforæïŒã®äžã§ã¯äœ¿ããŸãã
- ã«ãŒã«ã®äŸïŒ
// â
æ£ããäœ¿ãæ¹ - ãããã¬ãã«ã§äœ¿çš
function MyComponent() {
const [count, setCount] = useState(0);
// ...
}
// â ééã£ãäœ¿ãæ¹ - æ¡ä»¶åå²ã®äž
function MyComponent() {
if (something) {
const [count, setCount] = useState(0); // ããã¯ãšã©ãŒã«ãªããŸãïŒ
}
// ...
}
- 解決çïŒ
- ããæ¡ä»¶ä»ãã§ããã¯ã䜿ãããå Žåã¯ãæ°ããã³ã³ããŒãã³ããäœã£ãŠãããã§ããã¯ã䜿ããŸãããã
ããã¯ã䜿ãããšã§ãReactã®æ©èœãç°¡åã«æŽ»çšã§ããããã«ãªããŸãã
ã³ã³ããŒãã³ãéã§ããŒã¿ãå ±æãã
åè¿°ã®äŸã§ã¯ãããããã® MyButton ãç¬ç«ãã count ãæã£ãŠããããã¿ã³ãã¯ãªãã¯ããããã³ã«ã¯ãªãã¯ããããã¿ã³ã® count ã ãã倿ŽãããŸããã
ãã ããã³ã³ããŒãã³ãéã§ããŒã¿ãå ±æããåžžã«äžç·ã«æŽæ°ããããšããããšããããããŸããäž¡æ¹ã® MyButton ã³ã³ããŒãã³ããåã count ã衚瀺ããäžç·ã«æŽæ°ãããããã«ããã«ã¯ãç¶æ ãåã ã®ãã¿ã³ãããäžã«ãç§»åããŠãããããã¹ãŠãå«ãæãè¿ãã³ã³ããŒãã³ãã«å ¥ããŸãããã®äŸã§ã¯ãMyApp ãããã§ãã
ããããã°ãã©ã¡ãã®ãã¿ã³ãã¯ãªãã¯ããŠããMyApp ã® count ãæŽæ°ãããé£åã㊠MyButton ã®äž¡æ¹ã®ã«ãŠã³ããæŽæ°ãããŸãã以äžã¯ãã³ãŒãã§ããã衚çŸããæ¹æ³ã§ãããŸããMyButton ãã MyApp ã«ãstate ã®ç§»åãè¡ããŸãã
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update separately</h1>
<MyButton />
<MyButton />
</div>
);
}
function MyButton() {
// ... we're moving code from here ...
}
次ã«ãMyApp ããå MyButton ã« state ãæž¡ããå ±æã®ã¯ãªãã¯ãã³ãã©ãäžç·ã«æž¡ããŸãã以åã« <img> ã®ãããªçµã¿èŸŒã¿ã¿ã°ã§è¡ã£ããšããšåæ§ãJSX ã®æ³¢æ¬åŒ§ã䜿ãããšã§ MyButton ã«æ å ±ãæž¡ãããšãã§ããŸãã
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
ãã®ããã«æž¡ãããæ å ±ã¯ props ãšåŒã°ããŸããMyApp ã³ã³ããŒãã³ã㯠count ç¶æ ãš handleClick ã€ãã³ããã³ãã©ãä¿æããŠãããããããã©ã¡ãã props ãšããŠåãã¿ã³ã«æž¡ããŸããæåŸã«ãMyButton ã倿ŽããŠã芪ã³ã³ããŒãã³ãããæž¡ããã props ãèªã¿èŸŒãããã«ããŸãã
function MyButton({ count, onClick }) {
return (
<button onClick={onClick}>
Clicked {count} times
</button>
);
}
ãã¿ã³ãã¯ãªãã¯ãããšãonClick ãã³ãã©ãçºç«ããŸãã
åãã¿ã³ã® onClick ããããã£ã¯ MyApp å ã® handleClick 颿°ãšãªã£ãŠããã®ã§ããã®äžã®ã³ãŒããå®è¡ãããŸãã
ãã®ã³ãŒã㯠setCount(count + 1) ãåŒã³åºããcount ãšãã state 倿°ãã€ã³ã¯ãªã¡ã³ãããŸããæ°ãã count ã®å€ãåãã¿ã³ã« props ãšããŠæž¡ãããããããã¹ãŠã®ãã¿ã³ã«æ°ããå€ã衚瀺ãããŸãã
ãã®ææ³ã¯ãstate ã®ãªããã¢ããïŒæã¡äžãïŒããšåŒã°ããŠããŸãããªããã¢ããããããšã§ãstate ãã³ã³ããŒãã³ãéã§å ±æã§ããŸããã
import { useState } from 'react';
export default function MyApp() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div>
<h1>Counters that update together</h1>
<MyButton count={count} onClick={handleClick} />
<MyButton count={count} onClick={handleClick} />
</div>
);
}
function MyButton({ count, onClick }) {
return (
<button onClick={onClick}>
Clicked {count} times
</button>
);
}
ä»åºŠã¯ãçæ¹ã®ãã¿ã³ãã¯ãªãã¯ãããšäž¡æ¹ã®ãã¿ã³ã®æ°ãã«ãŠã³ãã¢ãããããŸãã
次ã®ã¹ããã
ããã§ãReact ã®ã³ãŒããæžãåºæ¬ãåãã£ãããšã«ãªããŸãããã¥ãŒããªã¢ã«ããã§ãã¯ããŠããããã®æŠå¿µãå®è·µããReact ã䜿ã£ãæåã®ããã¢ããªãäœæããŸãããã
ãŸãšã
ãšããããReactå ¬åŒã®ã¯ã€ãã¯ã¹ã¿ãŒããæãåãããªãã詊ããŠã¿ãŸãããã¯ã€ãã¯ã¹ã¿ãŒãã§ãããããŸãåå¿è åãã®èª¬æãç¡ãã®ã§ãšãŠããããã«ããã§ãããããŒã¯ãŒãã¯å¥ã®æ å ±ã§èª¿ã¹ãªãããªããšãå°ããã€çè§£ããããšãã§ããŸããã
ããããjavascriptãHTMLãCSSãããã£ãŠãã人ã§ãªããšãã®ã¯ã€ãã¯ã¹ã¿ãŒãã¯å®å šã«çè§£ã§ããªãããã«æããŸãããåå¿è åãã«ãŸãã¯è§Šã£ãŠåããèŠãŠã¿ãã®ã«ã¡ããã©ããããªã¥ãŒã æã§ã¯ãªãã§ããããã
ãããŸã§ãæ¯å«ãããŠããããã³ããšã³ãã®æè¡ã§ãããåããèŠããŠãããšé¢çœããªã£ãŠããã®ã§ããããèŠããŠãããããšæããŸãã
Discussion