import React, { useState } from "react"
// array destructuring
const [user, setUser] = useState(null);
์ธ์๋ก ๋ฐ์ ๊ฐ์ด ์ํ์ ์ด๊ธฐ๊ฐ์ ๋๋ค.
user
๋ผ๋ ๋ณ์์ ์ด๊ธฐ๊ฐ null์ ์ ์ฅํ๊ณsetUser
ํจ์๋ฅผ ํตํดuser
๋ณ์์ ๋ด๊ธด ์ํ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ์ ํน์ง ์ค ํ๋, ์ํ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด Virtual DOM์ด ํด๋น ์ํ๊ฐ์ด ์ฌ์ฉ๋ ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋งํฉ๋๋ค.
๊ทธ๋ฌ๋setUser
์ ๊ฐ์ ์ํ๊ฐ ๋ณ๊ฒฝ ํจ์๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์์๋ก ์ํ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ธ์ํ์ง ๋ชปํ๊ณ ๋ฆฌ๋ ๋๋ง์ ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ํ๊ฐ์ ๋ณ๊ฒฝํ ๋ ๋ฐ๋์ ์ํ๊ฐ ๋ณ๊ฒฝ ํจ์(setUser)๋ฅผ ์ฌ์ฉํฉ์๋ค.
import { useState } from 'react';
type AuthUser = {
name: string
email: string
}
export const User = () => {
const [user, setUser] = useState<AuthUser>({} as AuthUser); // 1๏ธโฃ
return (
<div>
<div>User name is {user.name}</div>
<div>User email is {user.email}</div>
</div>
)
}
1๋ฒ ๋ถ๋ถ์ ์ ์ธํ๋ฉด JS ํ๊ฒฝ์์์ useState ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ ๋์ผํฉ๋๋ค.
1๋ฒ ๋ผ์ธ์์ <> ์์AuthUser
๋ผ๋ Type์ ํน์ ํด์ค ๊ฒ์ด๊ณ ์ธ์๊ฐ์ ์ด๊ธฐ ์ํ๊ฐ์ธ๋ฐ{} as AuthUser
์์ as AuthUser ๋ Type Assertion ์ด๋ผ๋ ๊ฐ๋ ์ ๋๋ค. ์ฆ, ์ด๊ธฐ๊ฐ์ ๋น ๊ฐ์ฒด์ด์ง๋ง ์ด ๋น ๊ฐ์ฒด์ ํ์ ์AuthUser
๋ผ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด์ค ๊ฒ์ ๋๋ค.
Type Assertion ์ ๊ฐ๋ฐ์๊ฐ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ๋ฌ๋ณด๋ค ์ด ์ํ(state)์ ๋ํด์ ๋ ์ ์๊ณ ์๋ค, ์ด ์ํ์ ํ์ ์ ์ด๋ค ํน์ ํ ํ์ ๋ง ์ฌ ์ ์๋ค ๊ฐ์ ์ด๋ฐ ์ํฉ์์๋ง ์ฌ์ฉํ๋๋ก ํฉ์๋ค.
์ ์์ ์ฝ๋์ ์ํฉ์ user๊ฐ์ด ํญ์ ์กด์ฌํ๋ ์ํฉ(ํน์ user๊ฐ์ด null์ด ๋ ์ ์๋ ์ํฉ) ์์ ๊ฐ๋ฅํ ์ฝ๋์ ๋๋ค.
useEffect
๋ ๋ชจ๋ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ด๋นํฉ๋๋ค. ์๋ฅผ๋ค๋ฉด, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, data fetch๋ฅผ ํ๊ฑฐ๋...componentDidUpdate
, componentDidMount
, componentWillUnmount
const [name, setName] = useState('Paul');
useEffect(() => {
document.title = `Hello ${name}'s world!`;
}, [name])
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์ ๋ ๋ธ๋ผ์ฐ์ title์ "Hello Paul's world!"๋ก ๋ฐ๊ฟ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ name ์ํ๊ฐ์ด ๋ณ๊ฒฝ๋์ด ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋์์ ๋๋ ํธ์ถ๋ฉ๋๋ค.
import React, {useEffect} from 'react'
useEffect(
(effect function)
return {
(cleanup function)
}
}, [dependencies]);
์ดํํธ ํจ์ ํธ์ถ ์์ ์ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ๋ ๋, ์์กด๊ฐ์ผ๋ก ์ฃผ์ด์ง ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ผ๊ณ ๋ง์๋๋ ธ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ํด๋ฆฐ์ ํจ์๋?
์ดํํธํจ์๊ฐ ํธ์ถ๋๊ธฐ ์ , ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ(unmount)๋ ๋ ํธ์ถ๋ฉ๋๋ค.
์ด์ ์ดํํธ๋ก ์ธํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํด์ฃผ๋ ์ญํ ์ ๋๋ค. ๋ง๊ทธ๋๋ก cleanup!
๊ทธ๋ฆฌ๊ณ ์์กด๊ฐ์ด ๋น์ด์๋ค๋ฉด ์ต์ด ๋ง์ดํธํ ๋๋ง ์ดํํธํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๋ ์์กด๊ฐ์ด ์์ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์ดํํธ๋ฅผ ํธ์ถํฉ๋๋ค. (์กฐ์ฌํด์ผ๊ฒ ์ฃ ?)
import { useState, useEffect } from "react";
const Test = () => {
const [windowScrollY, setWindowScrollY] = useState<number>(window.scrollY);
const handleScroll = () => {
setWindowScrollY(window.scrollY);
};
useEffect(() => {
window.addEventListener("scroll", handleScroll);
console.log("effect");
return () => {
window.removeEventListener("resize", handleScroll);
console.log("clean up");
};
}, [windowScrollY]);
return <div style={{ height: '500vh' }}>{windowScrollY}</div>;
}
export default Test;
cleanup
ํจ์๊ฐ ๋จผ์ ํธ์ถ๋๊ณ ์ ๋ฆฌ๋ฅผ ํ๊ณ ๋์ effect
ํจ์๊ฐ ํธ์ถ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.