é©åãªã³ã³ããŒãã³ãã®ã¯ãªãŒã³ã¢ãããæ€èšŒããããšã§ãReactã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãªãŒã¯ãç¹å®ãã鲿¢ããæ¹æ³ãåŠã³ãŸããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®ããŸãããã
Reactã®ã¡ã¢ãªãªãŒã¯æ€åºïŒã³ã³ããŒãã³ãã®ã¯ãªãŒã³ã¢ããæ€èšŒã«é¢ããå æ¬çã¬ã€ã
Reactã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãªãŒã¯ã¯ãéãã«ããã©ãŒãã³ã¹ãäœäžããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãããããã®ãªãŒã¯ã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ããããã«ãããããããé¢é£ãããªãœãŒã¹ïŒã¿ã€ããŒãã€ãã³ããªã¹ããŒããµãã¹ã¯ãªãã·ã§ã³ãªã©ïŒãé©åã«ã¯ãªãŒã³ã¢ãããããªãå Žåã«çºçããŸããæéãšãšãã«ããããã®è§£æŸãããŠããªããªãœãŒã¹ãèç©ãããã¡ã¢ãªãæ¶è²»ããã¢ããªã±ãŒã·ã§ã³ãé ãããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãé©åãªã³ã³ããŒãã³ãã®ã¯ãªãŒã³ã¢ãããæ€èšŒããããšã§ãã¡ã¢ãªãªãŒã¯ãæ€åºãã鲿¢ããããã®æŠç¥ãæäŸããŸãã
Reactã«ãããã¡ã¢ãªãªãŒã¯ã®çè§£
ã¡ã¢ãªãªãŒã¯ã¯ãã³ã³ããŒãã³ããDOMããè§£æŸãããã«ãããããããäžéšã®JavaScriptã³ãŒãããŸã ãã®åç §ãä¿æããŠããããã«ãã¬ããŒãžã³ã¬ã¯ã¿ãå æããŠããã¡ã¢ãªãè§£æŸã§ããªããªãå Žåã«çºçããŸããReactã¯ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ãå¹ççã«ç®¡çããŸãããéçºè ã¯ã³ã³ããŒãã³ãããã®ã©ã€ããµã€ã¯ã«äžã«ååŸãããªãœãŒã¹ã®å¶åŸ¡ã確å®ã«ææŸãããã«ããªããã°ãªããŸããã
ã¡ã¢ãªãªãŒã¯ã®äžè¬çãªåå ïŒ
- ã¯ãªã¢ãããªãã¿ã€ããŒãšã€ã³ã¿ãŒãã«ïŒã³ã³ããŒãã³ããã¢ã³ããŠã³ããããåŸãã¿ã€ããŒïŒ
setTimeout
,setInterval
ïŒãå®è¡ãç¶ããããšã - åé€ãããªãã€ãã³ããªã¹ããŒïŒ
window
ãdocument
ããŸãã¯ä»ã®DOMèŠçŽ ã«ã¢ã¿ãããããã€ãã³ããªã¹ããŒããã¿ãããå¿ããããšã - æªå®äºã®ãµãã¹ã¯ãªãã·ã§ã³ïŒãªãã¶ãŒããã«ïŒäŸïŒRxJSïŒãä»ã®ããŒã¿ã¹ããªãŒã ããã¢ã³ãµãã¹ã¯ã©ã€ãããªãããšã
- è§£æŸãããªããªãœãŒã¹ïŒãµãŒãããŒãã£ã®ã©ã€ãã©ãªãAPIããååŸãããªãœãŒã¹ãè§£æŸããªãããšã
- ã¯ããŒãžã£ãŒïŒã³ã³ããŒãã³ãå ã®é¢æ°ããã³ã³ããŒãã³ãã®ç¶æ ãããããã¹ãžã®åç §ãæå³ãããã£ããã£ããä¿æããŠããŸãããšã
ã¡ã¢ãªãªãŒã¯ã®æ€åº
éçºãµã€ã¯ã«ã®æ©ã段éã§ã¡ã¢ãªãªãŒã¯ãç¹å®ããããšã¯éåžžã«éèŠã§ãããããã®åé¡ãæ€åºããã®ã«åœ¹ç«ã€ããã€ãã®ãã¯ããã¯ããããŸãïŒ
1. ãã©ãŠã¶éçºè ããŒã«
çŸä»£ã®ãã©ãŠã¶éçºè ããŒã«ã¯ã匷åãªã¡ã¢ãªãããã¡ã€ãªã³ã°æ©èœãæäŸããŸããç¹ã«Chrome DevToolsã¯éåžžã«å¹æçã§ãã
- ããŒãã¹ãããã·ã§ããã®ååŸïŒç°ãªãæç¹ã§ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªã®ã¹ãããã·ã§ããããã£ããã£ããŸããã¹ãããã·ã§ãããæ¯èŒããŠãã³ã³ããŒãã³ããã¢ã³ããŠã³ããããåŸãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŠããªããªããžã§ã¯ããç¹å®ããŸãã
- ã¢ãã±ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ïŒã¢ãã±ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ã¯ãæéçµéã«äŒŽãã¡ã¢ãªå²ãåœãŠã衚瀺ããŸããã³ã³ããŒãã³ããããŠã³ãããã³ã¢ã³ããŠã³ããããŠããã«ãããããããã¡ã¢ãªæ¶è²»ãå¢å ãç¶ããŠããç®æãæ¢ããŸãã
- ããã©ãŒãã³ã¹ã¿ãïŒããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ããŠãã¡ã¢ãªãä¿æããŠãã颿°ãç¹å®ããŸãã
äŸïŒChrome DevToolsïŒïŒ
- Chrome DevToolsãéããŸãïŒCtrl+Shift+I ãŸã㯠Cmd+Option+IïŒã
- ãMemoryãã¿ãã«ç§»åããŸãã
- ãHeap snapshotããéžæãããTake snapshotããã¯ãªãã¯ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãæäœããŠãã³ã³ããŒãã³ãã®ããŠã³ããšã¢ã³ããŠã³ããããªã¬ãŒããŸãã
- å¥ã®ã¹ãããã·ã§ãããååŸããŸãã
- 2ã€ã®ã¹ãããã·ã§ãããæ¯èŒããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã¹ãã ã£ãã®ã«ãããªãã£ããªããžã§ã¯ããèŠã€ããŸãã
2. React DevToolsãããã¡ã€ã©
React DevToolsã¯ãã¡ã¢ãªãªãŒã¯ã«ãã£ãŠåŒãèµ·ãããããã®ãå«ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã€ãããã¡ã€ã©ãæäŸããŸããã¡ã¢ãªãªãŒã¯ãçŽæ¥æ€åºããããã§ã¯ãããŸããããæåŸ ã©ããã«åäœããŠããªãã³ã³ããŒãã³ããææããããšãã§ããŸãã
3. ã³ãŒãã¬ãã¥ãŒ
宿çãªã³ãŒãã¬ãã¥ãŒãç¹ã«ã³ã³ããŒãã³ãã®ã¯ãªãŒã³ã¢ããããžãã¯ã«çŠç¹ãåœãŠãããšã§ãæœåšçãªã¡ã¢ãªãªãŒã¯ããã£ããããã®ã«åœ¹ç«ã¡ãŸããã¯ãªãŒã³ã¢ãã颿°ãæã€useEffect
ããã¯ã«çްå¿ã®æ³šæãæãããã¹ãŠã®ã¿ã€ããŒãã€ãã³ããªã¹ããŒããµãã¹ã¯ãªãã·ã§ã³ãé©åã«ç®¡çãããŠããããšã確èªããŠãã ããã
4. ãã¹ãã©ã€ãã©ãª
JestãReact Testing Libraryãªã©ã®ãã¹ãã©ã€ãã©ãªã䜿çšããŠãã¡ã¢ãªãªãŒã¯ãå ·äœçã«ãã§ãã¯ããçµ±åãã¹ããäœæã§ããŸãããããã®ãã¹ãã§ã¯ãã³ã³ããŒãã³ãã®ããŠã³ããšã¢ã³ããŠã³ããã·ãã¥ã¬ãŒããããªãœãŒã¹ãä¿æãããŠããªãããšãã¢ãµãŒãã§ããŸãã
ã¡ã¢ãªãªãŒã¯ã®é²æ¢ïŒãã¹ããã©ã¯ãã£ã¹
ã¡ã¢ãªãªãŒã¯ã«å¯ŸåŠããæåã®ã¢ãããŒãã¯ãããããçºçãããªãããšã§ãã以äžã«ãåŸãã¹ãããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã瀺ããŸãïŒ
1. useEffect
ãšã¯ãªãŒã³ã¢ãã颿°ã®äœ¿çš
useEffect
ããã¯ã¯ã颿°ã³ã³ããŒãã³ãã§å¯äœçšã管çããããã®äž»èŠãªã¡ã«ããºã ã§ããã¿ã€ããŒãã€ãã³ããªã¹ããŒããŸãã¯ãµãã¹ã¯ãªãã·ã§ã³ãæ±ãå Žåã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãããã®ãªãœãŒã¹ãç»é²è§£é€ããã¯ãªãŒã³ã¢ãã颿°ãåžžã«æäŸããŠãã ããã
äŸïŒ
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
const intervalId = setInterval(() => {
setCount(prevCount => prevCount + 1);
}, 1000);
return () => {
clearInterval(intervalId);
console.log('ã¿ã€ããŒãã¯ãªã¢ãããŸããïŒ');
};
}, []);
return (
Count: {count}
);
}
export default MyComponent;
ãã®äŸã§ã¯ãuseEffect
ããã¯ã1ç§ããšã«count
ã¹ããŒããã€ã³ã¯ãªã¡ã³ãããã€ã³ã¿ãŒãã«ãèšå®ããŸããã¯ãªãŒã³ã¢ãã颿°ïŒuseEffect
ã«ãã£ãŠè¿ãããïŒã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ã€ã³ã¿ãŒãã«ãã¯ãªã¢ããã¡ã¢ãªãªãŒã¯ãé²ããŸãã
2. ã€ãã³ããªã¹ããŒã®åé€
window
ãdocument
ããŸãã¯ä»ã®DOMèŠçŽ ã«ã€ãã³ããªã¹ããŒãã¢ã¿ããããå Žåã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«å¿
ãåé€ããŠãã ããã
äŸïŒ
import React, { useEffect } from 'react';
function MyComponent() {
const handleScroll = () => {
console.log('ã¹ã¯ããŒã«ãããŸããïŒ');
};
useEffect(() => {
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
console.log('ã¹ã¯ããŒã«ãªã¹ããŒãåé€ãããŸããïŒ');
};
}, []);
return (
Scroll this page.
);
}
export default MyComponent;
ãã®äŸã§ã¯ãã¹ã¯ããŒã«ã€ãã³ããªã¹ããŒãwindow
ã«ã¢ã¿ããããŸããã¯ãªãŒã³ã¢ãã颿°ã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ã€ãã³ããªã¹ããŒãåé€ããŸãã
3. ãªãã¶ãŒããã«ããã®ã¢ã³ãµãã¹ã¯ã©ã€ã
ã¢ããªã±ãŒã·ã§ã³ããªãã¶ãŒããã«ïŒäŸïŒRxJSïŒã䜿çšããŠããå Žåã¯ãã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã«ãããããã¢ã³ãµãã¹ã¯ã©ã€ãããããã«ããŠãã ãããããããªããšãã¡ã¢ãªãªãŒã¯ãäºæããªãåäœãçºçããå¯èœæ§ããããŸãã
äŸïŒRxJSã䜿çšïŒïŒ
import React, { useState, useEffect } from 'react';
import { interval } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
function MyComponent() {
const [count, setCount] = useState(0);
const destroy$ = new Subject();
useEffect(() => {
interval(1000)
.pipe(takeUntil(destroy$))
.subscribe(val => {
setCount(val);
});
return () => {
destroy$.next();
destroy$.complete();
console.log('ãµãã¹ã¯ãªãã·ã§ã³ãè§£é€ãããŸããïŒ');
};
}, []);
return (
Count: {count}
);
}
export default MyComponent;
ãã®äŸã§ã¯ããªãã¶ãŒããã«ïŒinterval
ïŒã1ç§ããšã«å€ããšãããããŸããtakeUntil
æŒç®åã¯ãdestroy$
ãµããžã§ã¯ããå€ããšããããããšãã«ãªãã¶ãŒããã«ãå®äºããããšãä¿èšŒããŸããã¯ãªãŒã³ã¢ãã颿°ã¯destroy$
ã§å€ããšãããããŠå®äºããããªãã¶ãŒããã«ããã¢ã³ãµãã¹ã¯ã©ã€ãããŸãã
4. Fetch APIã®ããã®AbortController
ã®äœ¿çš
Fetch APIã䜿çšããŠAPIåŒã³åºããè¡ãå Žåããªã¯ãšã¹ããå®äºããåã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ããããå Žåã«ãªã¯ãšã¹ãããã£ã³ã»ã«ããããã«AbortController
ã䜿çšããŸããããã«ãããäžèŠãªãããã¯ãŒã¯ãªã¯ãšã¹ããšæœåšçãªã¡ã¢ãªãªãŒã¯ãé²ããŸãã
äŸïŒ
import React, { useState, useEffect } from 'react';
function MyComponent() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const abortController = new AbortController();
const signal = abortController.signal;
const fetchData = async () => {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1', { signal });
if (!response.ok) {
throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹: ${response.status}`);
}
const json = await response.json();
setData(json);
} catch (e) {
if (e.name === 'AbortError') {
console.log('ãã§ãããäžæ¢ãããŸãã');
} else {
setError(e);
}
} finally {
setLoading(false);
}
};
fetchData();
return () => {
abortController.abort();
console.log('ãã§ãããäžæ¢ãããŸããïŒ');
};
}, []);
if (loading) return èªã¿èŸŒã¿äž...
;
if (error) return ãšã©ãŒ: {error.message}
;
return (
ããŒã¿: {JSON.stringify(data)}
);
}
export default MyComponent;
ãã®äŸã§ã¯ãAbortController
ãäœæããããã®ã·ã°ãã«ãfetch
颿°ã«æž¡ãããŸãããªã¯ãšã¹ããå®äºããåã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãabortController.abort()
ã¡ãœãããåŒã³åºããããªã¯ãšã¹ãããã£ã³ã»ã«ãããŸãã
5. useRef
ã䜿çšããŠå¯å€å€ãä¿æãã
åã¬ã³ããªã³ã°ãåŒãèµ·ãããã«ã¬ã³ããªã³ã°éã§æç¶ããå¯å€å€ãä¿æããå¿
èŠãããå ŽåããããŸããuseRef
ããã¯ã¯ãã®ç®çã«æé©ã§ããããã¯ãã¿ã€ããŒãã¯ãªãŒã³ã¢ãã颿°ã§ã¢ã¯ã»ã¹ããå¿
èŠãããä»ã®ãªãœãŒã¹ãžã®åç
§ãæ ŒçŽããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
import React, { useRef, useEffect } from 'react';
function MyComponent() {
const timerId = useRef(null);
useEffect(() => {
timerId.current = setInterval(() => {
console.log('ããã¯');
}, 1000);
return () => {
clearInterval(timerId.current);
console.log('ã¿ã€ããŒãã¯ãªã¢ãããŸããïŒ');
};
}, []);
return (
ã³ã³ãœãŒã«ã§ããã¯ã確èªããŠãã ããã
);
}
export default MyComponent;
ãã®äŸã§ã¯ãtimerId
refãã€ã³ã¿ãŒãã«ã®IDãä¿æããŸããã¯ãªãŒã³ã¢ãã颿°ã¯ãã®IDã«ã¢ã¯ã»ã¹ããŠã€ã³ã¿ãŒãã«ãã¯ãªã¢ã§ããŸãã
6. ã¢ã³ããŠã³ããããã³ã³ããŒãã³ãã§ã®ç¶æ æŽæ°ã®æå°å
ã¢ã³ããŠã³ããããã³ã³ããŒãã³ãã§ç¶æ
ãèšå®ããããšã¯é¿ããŠãã ããããããè¡ãããšãããšãã¡ã¢ãªãªãŒã¯ãäºæããªãåäœã«ã€ãªããå¯èœæ§ããããããReactã¯èŠåã衚瀺ããŸãããããã®æŽæ°ãé²ãã«ã¯ãisMounted
ãã¿ãŒã³ãAbortController
ã䜿çšããŠãã ããã
äŸïŒAbortController
ã䜿çšããç¶æ
æŽæ°ã®åé¿ - ã»ã¯ã·ã§ã³4ã®äŸãåç
§ïŒïŒ
ãFetch APIã®ããã®AbortController
ã®äœ¿çšãã»ã¯ã·ã§ã³ã§ç€ºãããŠããAbortController
ã¢ãããŒãã¯ãéåæåŒã³åºãã§ã¢ã³ããŠã³ããããã³ã³ããŒãã³ãã®ç¶æ
æŽæ°ãé²ãããã®æšå¥šãããæ¹æ³ã§ãã
ã¡ã¢ãªãªãŒã¯ã®ãã¹ã
ã¡ã¢ãªãªãŒã¯ãå ·äœçã«ãã§ãã¯ãããã¹ããäœæããããšã¯ãã³ã³ããŒãã³ãããªãœãŒã¹ãé©åã«ã¯ãªãŒã³ã¢ããããŠããããšãä¿èšŒãã广çãªæ¹æ³ã§ãã
1. JestãšReact Testing Libraryã«ããçµ±åãã¹ã
JestãšReact Testing Libraryã䜿çšããŠãã³ã³ããŒãã³ãã®ããŠã³ããšã¢ã³ããŠã³ããã·ãã¥ã¬ãŒããããªãœãŒã¹ãä¿æãããŠããªãããšãã¢ãµãŒãããŸãã
äŸïŒ
import React from 'react';
import { render, unmountComponentAtNode } from 'react-dom';
import MyComponent from './MyComponent'; // å®éã®ã³ã³ããŒãã³ãã®ãã¹ã«çœ®ãæããŠãã ãã
// ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã匷å¶ããç°¡åãªãã«ããŒé¢æ°ïŒä¿¡é Œæ§ã¯äœãã§ãããäžéšã®ã±ãŒã¹ã§åœ¹ç«ã¡ãŸãïŒ
function forceGarbageCollection() {
if (global.gc) {
global.gc();
}
}
describe('MyComponent', () => {
let container = null;
beforeEach(() => {
container = document.createElement('div');
document.body.appendChild(container);
});
afterEach(() => {
unmountComponentAtNode(container);
container.remove();
container = null;
forceGarbageCollection();
});
it('ã¡ã¢ãªãªãŒã¯ããªãããš', async () => {
const initialMemory = performance.memory.usedJSHeapSize;
render( , container);
unmountComponentAtNode(container);
forceGarbageCollection();
// ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãçºçããã®ãå°ãåŸ
ã¡ãŸã
await new Promise(resolve => setTimeout(resolve, 500));
const finalMemory = performance.memory.usedJSHeapSize;
expect(finalMemory).toBeLessThan(initialMemory + 1024 * 100); // ããããªèª€å·®ïŒ100KBïŒã蚱容ããŸã
});
});
ãã®äŸã§ã¯ãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã¢ã³ããŠã³ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã匷å¶ãããã®åŸã¡ã¢ãªäœ¿çšéã倧å¹
ã«å¢å ããŠããªããã確èªããŸããæ³šïŒperformance.memory
ã¯äžéšã®ãã©ãŠã¶ã§éæšå¥šãšãªã£ãŠãããããå¿
èŠã«å¿ããŠä»£æ¿ææ®µãæ€èšããŠãã ããã
2. CypressãSeleniumã«ãããšã³ãããŒãšã³ããã¹ã
ãšã³ãããŒãšã³ããã¹ãã䜿çšããŠããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããæéçµéã«äŒŽãã¡ã¢ãªæ¶è²»éãç£èŠããããšã§ãã¡ã¢ãªãªãŒã¯ãæ€åºããããšãã§ããŸãã
èªåã¡ã¢ãªãªãŒã¯æ€åºããŒã«
ã¡ã¢ãªãªãŒã¯æ€åºã®ããã»ã¹ãèªååããã®ã«åœ¹ç«ã€ããã€ãã®ããŒã«ããããŸãïŒ
- MemLab (Facebook): ãªãŒãã³ãœãŒã¹ã®JavaScriptã¡ã¢ãªãã¹ããã¬ãŒã ã¯ãŒã¯ã
- LeakCanary (Square - Androidããã ãæŠå¿µã¯é©çšå¯èœ): äž»ã«Androidçšã§ããããªãŒã¯æ€åºã®ååã¯JavaScriptã«ãé©çšãããŸãã
ã¡ã¢ãªãªãŒã¯ã®ãããã°ïŒã¹ããããã€ã¹ãããã®ã¢ãããŒã
ã¡ã¢ãªãªãŒã¯ãçãããå Žåã¯ã以äžã®æé ã«åŸã£ãŠåé¡ãç¹å®ããä¿®æ£ããŠãã ããïŒ
- ãªãŒã¯ã®åçŸïŒãªãŒã¯ãåŒãèµ·ããç¹å®ã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ãç¹å®ããŸãã
- ã¡ã¢ãªäœ¿çšéã®ãããã¡ã€ã«ïŒãã©ãŠã¶éçºè ããŒã«ã䜿çšããŠãããŒãã¹ãããã·ã§ãããšã¢ãã±ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ããã£ããã£ããŸãã
- ãªãŒã¯ããŠãããªããžã§ã¯ãã®ç¹å®ïŒããŒãã¹ãããã·ã§ãããåæããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŠããªããªããžã§ã¯ããèŠã€ããŸãã
- ãªããžã§ã¯ãåç §ã®è¿œè·¡ïŒã³ãŒãã®ã©ã®éšåããªãŒã¯ããŠãããªããžã§ã¯ããžã®åç §ãä¿æããŠããããç¹å®ããŸãã
- ãªãŒã¯ã®ä¿®æ£ïŒé©åãªã¯ãªãŒã³ã¢ããããžãã¯ïŒäŸïŒã¿ã€ããŒã®ã¯ãªã¢ãã€ãã³ããªã¹ããŒã®åé€ããªãã¶ãŒããã«ããã®ã¢ã³ãµãã¹ã¯ã©ã€ãïŒãå®è£ ããŸãã
- ä¿®æ£ã®æ€èšŒïŒãããã¡ã€ãªã³ã°ããã»ã¹ãç¹°ãè¿ããŠããªãŒã¯ã解決ãããããšã確èªããŸãã
çµè«
ã¡ã¢ãªãªãŒã¯ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå®å®æ§ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããã¡ã¢ãªãªãŒã¯ã®äžè¬çãªåå ãçè§£ããã³ã³ããŒãã³ãã®ã¯ãªãŒã³ã¢ããã«é¢ãããã¹ããã©ã¯ãã£ã¹ã«åŸããé©åãªæ€åºããã³ãããã°ããŒã«ã䜿çšããããšã§ããããã®åé¡ãã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ãäžããã®ãé²ãããšãã§ããŸãã宿çãªã³ãŒãã¬ãã¥ãŒã培åºçãªãã¹ããããã³ã¡ã¢ãªç®¡çãžã®ç©æ¥µçãªã¢ãããŒãã¯ãå ç¢ã§ããã©ãŒãã³ã¹ã®é«ãReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããäºé²ã¯åžžã«æ²»çã«åãããšãå¿ããªãã§ãã ãããæåããç±å¿ã«ã¯ãªãŒã³ã¢ãããè¡ãããšã§ãåŸã§å€§å¹ ãªãããã°æéãç¯çŽã§ããŸãã