React의 Main Job은?
- 리액트의 main job은 UI를 rendering하는 것이다.
- 즉, 상태를 관리하며, 변화가 있다면 화면을 re-rendering해준다. (리랜더링 한다는것은 함수를 위에서부터 다시 읽는다는 것과 동일하다.)
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
...
}
- 예를들어, App함수는 isLoggedIn의 state가 바뀔때마다, 리엑트에 의해 자동으로 재실행된다.
- 하지만 함수의 재실행(리랜더링)을 필요로하지 않은 경우가 있을 수도 있다.
- http request의 경우, 무한 루프가 생길 가능성이 있다.
- 이러한 side effect를 처리하기 위해
useEffect()
를 사용한다.
useEffect()
useEffect(() => {...}, [dependencies]);
- dependencies가 변경된 경우에, 첫 번째 매개변수의 함수가 실행된다.
- 그렇지 않은 경우, 컴포넌트가 다시 렌더링 될 때는 실행되지 않는다.
- 즉, useEffect()를 활용하여, 첫번째 매개변수인 함수가 언제 실행될지 제어할 수 있다.
useEffect() 사용하기1
import { useEffect, useState } from 'react';
import './App.css';
function App() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log(`Clicked ${count} times`);
}, [count]);
useEffect(() => {
console.log(`Component Loaded`);
const handleScroll = () => {
console.log(window.scrollY);
};
document.addEventListener('scroll', handleScroll);
return () => document.removeEventListener('scroll', handleScroll);
}, []);
return (
<div>
<span>You clicked {count} times</span>
<button onClick={() => setCount(count + 1)}>add</button>
</div>
);
}
export default App;
useEffect() 사용하기2
import React, { useEffect, useState } from 'react';
import Login from './components/Login/Login';
import Home from './components/Home/Home';
import MainHeader from './components/MainHeader/MainHeader';
function App() {
const storedUserLoggedInInformation = localStorage.getItem('isLoggedIn');
const [isLoggedIn, setIsLoggedIn] = useState(false);
useEffect(() => {
if (storedUserLoggedInInformation === '1') {
setIsLoggedIn(true)
}
}, []);
const loginHandler = (email, password) => {
localStorage.setItem('isLoggedIn', '1');
setIsLoggedIn(true);
};
const logoutHandler = () => {
localStorage.removeItem('isLoggedIn');
setIsLoggedIn(false);
};
return (
<React.Fragment>
<MainHeader isAuthenticated={isLoggedIn} onLogout={logoutHandler} />
<main>
{!isLoggedIn && <Login onLogin={loginHandler} />}
{isLoggedIn && <Home onLogout={logoutHandler} />}
</main>
</React.Fragment>
);
}
export default App;