Reactã®ã¬ã³ããŒããããã®èœåãæå€§éã«åŒãåºããã³ã³ããŒãã³ãéã§å¹æçã«ããžãã¯ãå ±æããŸããä¿å®æ§ãé«ãã¹ã±ãŒã©ãã«ãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ãã¹ããã©ã¯ãã£ã¹ããã¿ãŒã³ãé«åºŠãªãã¯ããã¯ãåŠã³ãŸãããã
Reactã¬ã³ããŒããããïŒã³ã³ããŒãã³ãããžãã¯å ±æããã¹ã¿ãŒãã
Reactéçºã®äžçã§ã¯ãã³ã³ããŒãã³ãã®åæã¯ã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åºç€ã§ãããã€ãŠã¯é«éã³ã³ããŒãã³ãïŒHOCïŒãããžãã¯ãå ±æããããã®äžè¬çãªãã¿ãŒã³ã§ããããã¬ã³ããŒããããã¯ããæè»ã§æç€ºçãªã¢ãããŒããæäŸããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãã¬ã³ããŒããããã®è€éããæãäžãããã®å©ç¹ããŠãŒã¹ã±ãŒã¹ããããŠå¹æçãªã³ã³ããŒãã³ãããžãã¯å ±æã®ããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢ããŸãã
ã¬ã³ããŒãããããšã¯ïŒ
ã¬ã³ããŒãããããšã¯ãå€ã颿°ã§ããããããã䜿çšããŠReactã³ã³ããŒãã³ãéã§ã³ãŒããå ±æãããã¯ããã¯ã§ãã ãã®é¢æ°ã¯åŒæ°ãšããŠstateãåãåããReactèŠçŽ ãè¿ããŸããç°¡åã«èšãã°ãã¬ã³ããŒãããããšã¯ãã³ã³ããŒãã³ããäœãã¬ã³ããªã³ã°ããããç¥ãããã«äœ¿çšãã颿°ããããã§ãã
ã³ã³ããŒãã³ãå ã«ã¬ã³ããªã³ã°ããžãã¯ãããŒãã³ãŒãã£ã³ã°ãã代ããã«ããã®è²¬ä»»ã颿°ãä»ããŠèŠªã³ã³ããŒãã³ãã«å§ä»»ããŸãããã®å¶åŸ¡ã®å転ã«ãããããé«ãæè»æ§ãšåå©çšæ§ãå¯èœã«ãªããŸãã
äžå¿çãªæŠå¿µ
ã¬ã³ããŒããããã®èåŸã«ããéèŠãªèãæ¹ã¯ãã¬ã³ããŒãããããæã€ã³ã³ããŒãã³ãããã¬ã³ããªã³ã°ã«å¿ èŠãªstateãåãåã颿°ãåããå®éã«ã¬ã³ããªã³ã°ãããReactèŠçŽ ãè¿ããšããããšã§ããããã«ãããã³ã³ããŒãã³ãã¯stateããžãã¯ãå ±æãã€ã€ã芪ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãå¶åŸ¡ã§ããããã«ãªããŸãã
以äžã«ããã®æŠå¿µã説æããããã®åºæ¬çãªäŸã瀺ããŸãã
class Mouse extends React.Component {
constructor(props) {
super(props);
this.state = { x: 0, y: 0 };
}
handleMouseMove = (event) => {
this.setState({x: event.clientX, y: event.clientY });
}
render() {
return (
{this.props.render(this.state)}
);
}
}
function App() {
return (
Move the mouse around!
(
The current mouse position is ({mouse.x}, {mouse.y})
)}/>
);
}
ãã®äŸã§ã¯ã`Mouse`ã³ã³ããŒãã³ããããŠã¹ã®äœçœ®ã远跡ãã`render`ãããããéããŠèŠªã³ã³ããŒãã³ãã«å ¬éããŸãããããŠã芪ã³ã³ããŒãã³ãã¯ãã®ããŒã¿ã䜿çšããŠç»é¢ã«ããŠã¹åº§æšãã¬ã³ããªã³ã°ããŸãã
ã¬ã³ããŒããããã䜿çšããå©ç¹
ã¬ã³ããŒããããã¯ãé«éã³ã³ããŒãã³ãïŒHOCïŒãmixinãªã©ãä»ã®ã³ã³ããŒãã³ãããžãã¯å ±æãã¿ãŒã³ã«æ¯ã¹ãŠããã€ãã®å©ç¹ããããŸãã
- æç€ºçãªããŒã¿ãããŒïŒ ã¬ã³ããŒããããã¯ããŒã¿ãããŒãããæç€ºçã§çè§£ããããããŸããstateãåãåãã³ã³ããŒãã³ããæç¢ºã«å®çŸ©ããããããäºæãã¬å¯äœçšã®ãªã¹ã¯ãæžå°ããŸãã
- åæå¯èœæ§ã®åäžïŒ ã¬ã³ããŒããããã¯ããè¯ãã³ã³ããŒãã³ãåæãä¿é²ããŸããè€æ°ã®ã¬ã³ããŒãããããç°¡åã«çµã¿åãããŠãè€éã§åå©çšå¯èœãªã³ã³ããŒãã³ããäœæã§ããŸãã
- æè»æ§ã®åŒ·åïŒ ã¬ã³ããŒããããã¯ã¬ã³ããªã³ã°ããžãã¯ã«é¢ããŠãã倧ããªæè»æ§ãæäŸããŸãã芪ã³ã³ããŒãã³ãã¯stateãã©ã®ããã«ã¬ã³ããªã³ã°ãããããå®å šã«å¶åŸ¡ã§ãããããé«åºŠã«ã«ã¹ã¿ãã€ãºãããUIãå¯èœã«ãªããŸãã
- ããããããªãªã³ã°ã®åæžïŒ ã¬ã³ããŒããããã¯ãããŒã¿ãè€æ°ã®ã³ã³ããŒãã³ãå±€ãééããããããããªãªã³ã°ãæžããã®ã«åœ¹ç«ã¡ãŸããå¿ èŠãªstateãæ¶è²»ã³ã³ããŒãã³ãã«çŽæ¥æäŸããããšã§ãäžèŠãªãããããæž¡ãã®ãé¿ããããšãã§ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ å Žåã«ãã£ãŠã¯ãã¬ã³ããŒããããã¯äžéã³ã³ããŒãã³ãã®äœæãé¿ãããããHOCãšæ¯èŒããŠããã©ãŒãã³ã¹ãåäžããããšããããŸãã
ã¬ã³ããŒããããã®ãŠãŒã¹ã±ãŒã¹
ã¬ã³ããŒããããã¯ãã³ã³ããŒãã³ããå¯çµåãããããšãªãããããã®éã§ã¹ããŒããã«ãªããžãã¯ãå ±æããå¿ èŠãããã·ããªãªã«ç¹ã«é©ããŠããŸãã以äžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ãããã€ã瀺ããŸãã
- ããŠã¹è¿œè·¡ïŒ åã®äŸã§ç€ºããããã«ãã¬ã³ããŒããããã¯ããŠã¹ã®åãã远跡ããä»ã®ã³ã³ããŒãã³ãã«åº§æšãå ¬éããããã«äœ¿çšã§ããŸãã
- ã¹ã¯ããŒã«äœçœ®ïŒ ã³ã³ããã®ã¹ã¯ããŒã«äœçœ®ã远跡ãããã©ã©ãã¯ã¹ã¹ã¯ããŒã«ãç¡éã¹ã¯ããŒã«ãªã©ã®æ©èœãå®è£ ããããã«ä»ã®ã³ã³ããŒãã³ãã«ãã®æ å ±ãæäŸããã³ã³ããŒãã³ããäœæã§ããŸãã
- ããŒã¿ãã§ããïŒ ã¬ã³ããŒããããã¯ããŒã¿ãã§ããããžãã¯ãã«ãã»ã«åããããŒãã£ã³ã°ç¶æ ããšã©ãŒç¶æ ãããã³ããŒã¿ãä»ã®ã³ã³ããŒãã³ãã«å ¬éããããã«äœ¿çšã§ããŸããããã¯ãéåææäœã宣èšçã«ç®¡çããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- èªèšŒïŒ ãŠãŒã¶ãŒã®èªèšŒç¶æ ã管çããã¬ã³ããŒãããããä»ããŠä»ã®ã³ã³ããŒãã³ãã«ãã®æ å ±ãæäŸãã`AuthProvider`ã³ã³ããŒãã³ããäœæã§ããŸããããã«ããããŠãŒã¶ãŒã®èªèšŒç¶æ ã«åºã¥ããŠã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåãžã®ã¢ã¯ã»ã¹ãç°¡åã«å¶åŸ¡ã§ããŸãã
- ãã©ãŒã åŠçïŒ ã¬ã³ããŒããããã䜿çšããŠããã©ãŒã ã®éä¿¡ãæ€èšŒãããã³ç¶æ 管çãåŠçããåå©çšå¯èœãªãã©ãŒã ã³ã³ããŒãã³ããäœæã§ããŸããããã«ãããReactã§è€éãªãã©ãŒã ãæ§ç¯ããããã»ã¹ãå€§å¹ ã«ç°¡çŽ åã§ããŸãã
- ã¡ãã£ã¢ã¯ãšãªïŒ ãŠã£ã³ããŠãµã€ãºã远跡ããäžèŽããã¡ãã£ã¢ã¯ãšãªã«å¿ããŠããŒã«å€ãæäŸããã³ã³ããŒãã³ãã¯ãã¬ã¹ãã³ã·ããã¶ã€ã³ã«éåžžã«åœ¹ç«ã¡ãŸãã
äžè¬çãªã¬ã³ããŒããããã®ãã¿ãŒã³
ã¬ã³ããŒããããã广çã«äœ¿çšããããã®äžè¬çãªãã¿ãŒã³ãããã€ãç»å ŽããŠããŸãããããã®ãã¿ãŒã³ãçè§£ããããšã¯ãããã¯ãªãŒã³ã§ä¿å®æ§ã®é«ãã³ãŒããæžãã®ã«åœ¹ç«ã¡ãŸãã
颿°ãšããŠã® "children" ãããã
`render`ãšããååã®ããããã䜿çšãã代ããã«ã`children`ããããã颿°ãšããŠäœ¿çšããããšãã§ããŸããããã¯äžè¬çãªãã¿ãŒã³ã§ãããã³ã³ããŒãã³ãã®äœ¿çšãããçŽæçã«ããŸãã
class DataProvider extends React.Component {
constructor(props) {
super(props);
this.state = { data: null, loading: true, error: null };
}
componentDidMount() {
// Simulate data fetching
setTimeout(() => {
this.setState({ data: { message: "Data fetched successfully!" }, loading: false });
}, 1000);
}
render() {
return this.props.children(this.state);
}
}
function App() {
return (
{({ data, loading, error }) => {
if (loading) return Loading...
;
if (error) return Error: {error.message}
;
return {data.message}
;
}}
);
}
ãã®äŸã§ã¯ã`DataProvider`ã³ã³ããŒãã³ãã¯`children`ããããã颿°ãšããŠäœ¿çšããããŒã¿ãã§ããã®ç¶æ ã«åºã¥ããŠã³ã³ãã³ããã¬ã³ããªã³ã°ããŸãã
"component" ãããã
ããäžã€ã®ãã¿ãŒã³ã¯ãReactã³ã³ããŒãã³ããåãå ¥ãã`component`ããããã䜿çšããããšã§ããã¬ã³ããŒããããã¯ããã®ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããstateããããããšããŠæž¡ããŸãã
class Mouse extends React.Component {
constructor(props) {
super(props);
this.state = { x: 0, y: 0 };
}
handleMouseMove = (event) => {
this.setState({ x: event.clientX, y: event.clientY });
}
render() {
const { component: Component, ...rest } = this.props;
return (
);
}
}
function MouseDisplay(props) {
return The mouse position is ({props.x}, {props.y})
;
}
function App() {
return (
Move the mouse around!
);
}
ãã®ãã¿ãŒã³ã«ããã`Mouse`ã³ã³ããŒãã³ãèªäœã倿Žããããšãªããç°ãªãã¬ã³ããªã³ã°ã³ã³ããŒãã³ããç°¡åã«åãæ¿ããããšãã§ããŸãã
ã¬ã³ããŒãããã vs. é«éã³ã³ããŒãã³ãïŒHOCïŒ
ã¬ã³ããŒãããããšHOCã¯ã©ã¡ããReactã³ã³ããŒãã³ãéã§ããžãã¯ãå ±æããããã®ãã¯ããã¯ã§ãããããããã«ç°ãªããã¬ãŒããªãããããŸãã以äžã«æ¯èŒã瀺ããŸãã
æ©èœ | ã¬ã³ããŒãããã | é«éã³ã³ããŒãã³ãïŒHOCïŒ |
---|---|---|
ããŒã¿ãã㌠| æç€ºç | æé»ç |
åæå¯èœæ§ | éåžžã«é«ã | ã©ãããŒå°çã«é¥ãå¯èœæ§ããã |
æè»æ§ | é«ã | éå®ç |
å¯èªæ§ | ããèªã¿ããã | èªã¿ã«ãããªãããšããã |
ããã©ãŒãã³ã¹ | ããè¯ãå¯èœæ§ããã | äžèŠãªã³ã³ããŒãã³ããå°å ¥ããå¯èœæ§ããã |
äžè¬çã«ãã¬ã³ããŒããããã¯æç€ºçãªããŒã¿ãããŒãåäžããåæå¯èœæ§ã匷åãããæè»æ§ã®ãããHOCããã奜ãŸããããšãå€ãã§ããããããHOCã¯ã³ã³ããŒãã³ãã«ã°ããŒãã«ãªæ©èœã远å ããå¿ èŠãããå Žåãªã©ãç¹å®ã®ç¶æ³ã§ã¯äŸç¶ãšããŠæçšã§ãã
ã¬ã³ããŒããããã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ã¬ã³ããŒãããããæå€§éã«æŽ»çšããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ã·ã³ãã«ã«ä¿ã€ïŒ é床ã«è€éãªã¬ã³ããŒãããããäœæããã®ã¯é¿ããŠãã ãããã¬ã³ããŒããããã倧ããããããçè§£ãã«ãããªã£ããããå Žåã¯ãããå°ãã管çããããã³ã³ããŒãã³ãã«åå²ããããšãæ€èšããŠãã ããã
- æå³ã®ããååã䜿çšããïŒ ã¬ã³ããŒããããã«ã¯èª¬æçãªååãéžãã§ãã ãããããã«ãããã³ãŒããèªã¿ããããçè§£ãããããªããŸããäŸãã°ã`prop`ã®ãããªäžè¬çãªååã§ã¯ãªãã`render`ã`children`ã䜿çšããŸãã
- ã¬ã³ããŒãããããææžåããïŒ ã¬ã³ããŒããããã®ç®çãšäœ¿çšæ³ãæç¢ºã«ææžåããŠãã ãããããã«ãããä»ã®éçºè ãããªãã®ã³ã³ããŒãã³ãã广çã«äœ¿çšããã®ã«åœ¹ç«ã¡ãŸãã
- TypeScriptãæ€èšããïŒ TypeScriptã䜿çšãããšãæ©æã«ãšã©ãŒãæ€åºããã³ãŒãå šäœã®å質ãåäžãããããšãã§ããŸããTypeScriptã¯ãŸããããããã®åãã¬ã³ããŒé¢æ°ã®æ»ãå€ã®åãå®çŸ©ããããšã§ãã¬ã³ããŒããããã®ææžåã«ã圹ç«ã¡ãŸãã
- ã¬ã³ããŒããããããã¹ãããïŒ ã¬ã³ããŒãããããæ£ããæ©èœããŠããããšã確èªããããã«ã培åºçã«ãã¹ãããŠãã ãããããã«ã¯ãã³ã³ããŒãã³ãã®ããŸããŸãªç¶æ ããã¬ã³ããŒé¢æ°ã䜿çšããããããŸããŸãªæ¹æ³ããã¹ãããããšãå«ãŸããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
Contextãšã¬ã³ããŒããããã®äœµçš
ã¬ã³ããŒããããã¯React Context APIãšçµã¿åãããããšã§ãããããããªãªã³ã°ãªãã§ã³ã³ããŒãã³ãããªãŒå šäœã«ããŒã¿ãå ±æã§ããŸããã¬ã³ããŒããããã䜿çšããŠã³ã³ããã¹ãå€ãæäŸãããããåã³ã³ããŒãã³ãã§æ¶è²»ããããšãã§ããŸãã
const ThemeContext = React.createContext('light');
class ThemeProvider extends React.Component {
constructor(props) {
super(props);
this.state = { theme: 'light' };
}
toggleTheme = () => {
this.setState(prevState => ({ theme: prevState.theme === 'light' ? 'dark' : 'light' }));
};
render() {
return (
{this.props.children}
);
}
}
function ThemedButton() {
return (
{({ theme, toggleTheme }) => (
)}
);
}
function App() {
return (
);
}
ããã©ãŒãã³ã¹ã®æé©å
ã¬ã³ããŒããããã¯äžèŠãªã³ã³ããŒãã³ãã®äœæãé¿ããããšã§ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããæœåšçãªããã©ãŒãã³ã¹ã®ããã«ããã¯ã«æ³šæããããšãéèŠã§ããã¬ã³ããŒãããã颿°å ã§æ°ãã颿°ãäœæãããšãäžèŠãªåã¬ã³ããªã³ã°ãåŒãèµ·ããå¯èœæ§ãããããé¿ããŠãã ããã代ããã«ãã¬ã³ããŒããããã®å€ã§é¢æ°ãå®çŸ©ããããããããããšããŠæž¡ããŠãã ããã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
ã¬ã³ããŒããããã䜿çšããéã¯ãã¢ã¯ã»ã·ããªãã£ãèæ ®ããŠãã ãããé©åãªARIA屿§ãšããŒããŒãããã²ãŒã·ã§ã³ãæäŸããããšã§ãã³ã³ããŒãã³ããé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããäŸãã°ãã¬ã³ããŒãããããã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãäœæããŠããå Žåã¯ããããããã©ãŒã«ã¹å¯èœã§ãé©åãªã©ãã«ãä»ããŠããããšã確èªããŠãã ããã
äžçäžã®äºäŸ
ã³ã³ããŒãã³ãã®ããžãã¯å ±æãšåå©çšæ§ã®ååã¯æ®éçã§ãããå ·äœçãªã¢ããªã±ãŒã·ã§ã³ã¯æåçããã³å°åçãªæèã«ãã£ãŠç°ãªãå ŽåããããŸãã以äžã«ããã€ãã®æ¶ç©ºã®äŸãæããŸãã
- eã³ããŒã¹ãã©ãããã©ãŒã ïŒã°ããŒãã«ïŒïŒ ã¬ã³ããŒããããã¯ããŠãŒã¶ãŒã®æåšå°ã«åºã¥ããŠé貚æç®ãåŠçã§ããŸããããã«ãããäŸ¡æ Œãé©åãªé貚ã§è¡šç€ºããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã`CurrencyConverter`ã³ã³ããŒãã³ããæç®ã¬ãŒãã管çããæç®åŸã®äŸ¡æ Œãã¬ã³ããªã³ã°ã³ã³ããŒãã³ãã«æäŸããŸãã
- èšèªåŠç¿ã¢ããªïŒå€èšèªå¯Ÿå¿ïŒïŒ ã¬ã³ããŒããããã¯ããŠãŒã¶ãŒãéžæããèšèªã«åºã¥ããŠããŒã«ã©ã€ãºãããããã¹ãã®ååŸã管çã§ããŸããããã«ãããã¢ããªã¯ãŠãŒã¶ãŒã®å¥œã¿ã®èšèªã§ã³ã³ãã³ãã衚瀺ã§ããåŠç¿äœéšãåäžããŸãã`LocalizationProvider`ãæ£ãã翻蚳ãååŸããŠæäŸããŸãã
- ãªã³ã©ã€ã³äºçŽã·ã¹ãã ïŒåœéæ è¡ïŒïŒ ã¬ã³ããŒããããã¯ãç°ãªãã¿ã€ã ãŸãŒã³éã§ã®äŒè°ãäºçŽã®ã¹ã±ãžã¥ãŒãªã³ã°ã®ããã«ã¿ã€ã ãŸãŒã³å€æãåŠçã§ããŸãã`TimeZoneConverter`ãã¿ã€ã ãŸãŒã³ãªãã»ããã管çãã倿åŸã®æéãã¬ã³ããªã³ã°ã³ã³ããŒãã³ãã«æäŸããŸãã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ïŒå€æ§ãªæåïŒïŒ ã¬ã³ããŒããããã¯ãæåçãªæ £ç¿ã«åŸã£ãŠæ¥ä»ãšæå»ã®åœ¢åŒã®è¡šç€ºã管çã§ããŸããäžéšã®æåã§ã¯æ¥ä»ã¯MM/DD/YYYYãšè¡šç€ºãããŸãããä»ã®æåã§ã¯DD/MM/YYYYãšè¡šç€ºãããŸãã`DateTimeFormatter`ãé©åãªãã©ãŒããããåŠçããŸãã
ãããã®äŸã¯ãã¬ã³ããŒããããã䜿çšããŠãããŸããŸãªæåçããã³å°åçãªæèã«é©å¿å¯èœãªã³ã³ããŒãã³ããäœæããããããŒãœãã©ã€ãºãããé¢é£æ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããæ¹æ³ã瀺ããŠããŸãã
çµè«
ã¬ã³ããŒããããã¯ãReactã³ã³ããŒãã³ãéã§ããžãã¯ãå ±æããããã®åŒ·åãªãã¯ããã¯ã§ãããã®å©ç¹ããŠãŒã¹ã±ãŒã¹ããã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãããä¿å®æ§ãé«ããã¹ã±ãŒã©ãã«ã§ãæè»ãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããçŸä»£ã®Reactéçºã¯Hooksã«å€§ããåŸããŠããŸãããã¬ã³ããŒãããããçè§£ããããšã¯ã䜿çšãããŠããç¹å®ã®æè¡ã«é¢ä¿ãªãäŸç¶ãšããŠé©çšãããã³ã³ããŒãã³ãåæãšããžãã¯åå©çšã®ååãææ¡ããããã®è²Žéãªåºç€ãæäŸããŸãã
ã¬ã³ããŒããããã®åãæŽ»çšããããªãã®Reactãããžã§ã¯ãã§ã³ã³ããŒãã³ãåæã®æ°ããªå¯èœæ§ãåãéããŠãã ããïŒ