외부의 시스템과 동기화 할 필요가 있을 때가 있다.
Effects는 렌더링 후에 동작할 수 있게 해준다. 그래서 리액트 외부의 시스템과 컴포넌트가 동기화 할 수 있게 해준다.
will learn
리액트 컴포넌트안의 두가지 타입의 로직
Effects를 사용하면 특정 이벤트가 아닌 렌더링 자체로 인해 발생하는 부작용을 지정할 수 있습니다.
Effects는 스크린 업데이트 후 커밋이 된 가장 마지막에 실행된다. - 리액트 컴포넌트와 외부의 시스템이 동기화하기 좋은 타이밍이다.
Effect이 필요하지 않을 수도 있다.
How to write an Effect
컴포넌트가 렌더될때마다 리액트는 스크린을 업데이트 하고 그 다음 useEffect 내부의 코드를 실행시킵니다. 다시 말해 useEffect는 해당 렌더가 화면에 반영될 때까지 코드 조각이 실행되는 것을 "지연"시킵니다.
useEffect( ( ) => { } )
(JSX가 렌더링 된 후 side effect이 동작 할 수 있도록 useEffect에 기능을 넣어준다.)
외부의 시스템과 동기화 하는간 항상 즉각적이지 않다. 그래서 필요하지 않은 부분은 최소한으로 해서 넘기고 싶을 때 dependencies를 사용한다.
예) 키보드를 누를때마다 챗 서버와 새로 연결하는 것
예) 컴포넌트가 나타날 때 처음에만 페이드인이 동작 해야 하는데 키보드를 누를때마다 컴포넌트의 페이드인 애니메이션이 동작하는 것
(useEffect( ( )=>{ },[ ] )
useEffect(() => {
// This runs after every render
});
useEffect(() => {
// This runs only on mount (when the component appears)
}, []);
useEffect(() => {
// This runs on mount and also if either a or b have changed since the last render
}, [a, b]);
useEffect(() => {
const connection = createConnection();
connection.connect();
return () => {
connection.disconnect();
};
}, []);
console...
dev 에서는 세번 보인다
"✅ Connecting..."
"❌ Disconnected."
"✅ Connecting..."
product에서는 한번만 보인다.
"✅ Connecting..."
(strict 모드를 끄면 dev처럼 보이긴 하는데 추천하진 않는다.)
총 결론
1. useEffect가 필요한 부분을 잘 파악해서 사용 할 것.
2. useEffect는 JSX가 렌더링 다음 사이드 이펙이 가능하게 해 줌.