๐ด useState
const [ state, setState ] = useState(0); // ๋ณ์ ์ ์ธ
// setState ํจ์์ ์ฒซ ๋ฒ์งธ argument๋ ํ์ฌ state ๊ฐ์ด๋ค.
setState((current) => current + 1); // ๊ฐ ๋ณ๊ฒฝ(๋น๋๊ธฐ) + ๋ ๋๋ง
state = state + 1; // ๊ฐ ๋ณ๊ฒฝ(๋น๋๊ธฐ)
// ๐ state ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
const [fruit, setFruit] = useState({ color: "red", name: "apple" });
// 1๏ธโฃ ์๋ก์ด ๊ฐ์ฒด ๋ง๋ค๊ธฐ
setFruit({ color: "red", name: "strawberry" });
// 2๏ธโฃ prevState ๊ฐ์ ์ด์ฉํ์ฌ ์ด์ state๋ฅผ ์ฌ์ฉํ๊ธฐ
setFruit(prev => ({ ...prev, name: "strawberry" }));
โช state์ ๋ฐฐ์ด ๊ณ์ด์ ์ง์ ํ ๋๋ setState์ ์๋ก์ด ๋ฐฐ์ด(spread, new Set)์ ์ง์ ํด์ค์ผ ๋ ๋๋ง์ด ์ผ์ด๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด state๊ฐ ๋ฐฐ์ด์ ๊ฐ์ด ์๋ ๋ฐฐ์ด์ ์ฃผ์๊ฐ์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณํ์ง ์์๋ค๊ณ ํ๋จํ์ฌ ๋ ๋๋ง์ด ์ผ์ด๋์ง ์๋๋ค.
๐ useEffect
โช ๋ ๋๋ง ํ ํน์ ํ ์๊ธฐ์๋ง ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ Hook
โช ์ปดํฌ๋ํธ๊ฐ ์์๋ ๋ ์คํํ ์ง, ์ปดํฌ๋ํธ๊ฐ ๋๋ ๋ ์คํํ ์ง ์๋๋ฉด ๋ฌด์ธ๊ฐ ๋ณํ ๋ ์คํํ ์ง ์ ํ ์ ์๋ค.
import { useEffect } from "react";
useEffect(effect, [deps]);
โช effect
โช ์ปดํฌ๋ํธ ๋ ๋๋ง ์ดํ ์คํํ ํจ์
โช ๋ฆฌ์กํธ๋ ์ด ํจ์๋ฅผ ๊ธฐ์ตํ๋ค๊ฐ DOM ์ ๋ฐ์ดํธ ์ดํ ๋ถ๋ฌ๋ธ๋ค.
โช deps
useEffect(() => {
console.log("useEffect");
});
โช deps ๋ฐฐ์ด ์ธ์๊ฐ ์์ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค useEffect๊ฐ ์คํ๋๋ค.
useEffect(() => {
console.log("useEffect");
}, []);
โช ๋น ๋ฐฐ์ด์ ์ธ์๋ก ๋ฃ์ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋์๋ง ์คํ๋๋ค.
useEffect(() => {
console.log("useEffect");
}, [count]);
โช ํน์ ๋ณ์๋ฅผ ๋ฐฐ์ด ์์๋ก ๋ฃ์ ๊ฒฝ์ฐ, ์ด๊ธฐ ๋ ๋๋ง ์งํ์ ํด๋น ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์คํ๋๋ค.
useEffect(() => {
console.log("useEffect");
return () => console.log("goodbye");
}, [count]);
โช ํจ์๋ฅผ return ํ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋(์ธ๋ง์ดํธ ๋ ๋) return ๋๋ ํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ์คํ๋๋ค.
๐ก useRef
๐ useRef๋ ์ปดํฌ๋ํธ์ DOM ๋ ธ๋์ ์ง์ ์ ๊ทผํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
โช useRef๋ current๋ผ๋ ๊ฐ์ ๋ด๊ณ ์๋ ์์์ด๋ฉฐ, ๋ฐํ๋ ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ์ ์ ์์ ์ฃผ๊ธฐ๋ฅผ ํตํด ์ ์ง๋๋ค.
โช Reference๋ ๋ ธ๋์ ๋ํ ์ฃผ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. ๋ฆฌ์กํธ์์๋ current์ ์ด๋ฌํ ref ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค.
โช ์๋ฅผ ๋ค๋ฉด, <div ref={myRef} /> ์ ๊ฐ์ด ์ ์ธํ๋ฉด, myRef.current์ div์ DOM ๋ ธ๋์ ๋ํ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ค.
// input ๋
ธ๋์ ์ ๊ทผํด์ focus() ๋ถ์ฌ
const focusBtn = () => {
const inputEl = useRef(null);
const handleClick = () => {
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onClick}>Focus input</button>
</>
);
}
// ํด๋น ๋
ธ๋์์ ํฐ์น ์ ์ผ์ด๋๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ์ค๋จํ๊ธฐ
import { useEffect, useRef } from "react";
const Component = () => {
const targetRef = useRef(null);
useEffect(() => {
const handleTouch = (event) => {
console.log(event.target);
event.stopPropagation(); // ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ์ค๋จ
}
const element = targetRef.current;
// ref์ ์ด๋ฒคํธ ๋ถ์ฌ
element.addEventListener("touchstart", handleClick);
element.addEventListener("touchend", handleClick);
return () => {
element.removeEventListener("touchstart", handleClick);
element.removeEventListener("touchend", handleClick);
}
}, []);
return (
<div ref={targetRef}></div>
);
}
๐ useRef์ ๋ ๋ค๋ฅธ ํน์ง์ setter๊ฐ ์์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌ๋ ๋๋ง ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๐ข useLayoutEffect
โช useLayoutEffect ํธ์ถ ์์
๐ ๋ ๋๋ง
๐ useLayoutEffect ํธ์ถ
๐ ๋ธ๋ผ์ฐ์ ํ๋ฉด ๊ทธ๋ฆฌ๊ธฐ : ์ด ์์ ์ ์ปดํฌ๋ํธ์ ํด๋นํ๋ ์๋ฆฌ๋จผํธ๊ฐ ์ค์ ๋ก DOM์ ์ถ๊ฐ๋จ
๐ useEffect ํธ์ถ
// ๐ ์์ : ์ฐฝ์ ํฌ๊ธฐ๊ฐ ๋ฐ๋ ๊ฒฝ์ฐ ์๋ฆฌ๋จผํธ ๋๋น์ ๋์ด ๋ฐ๊ธฐ
function useWindowSize {
const [ width, setWidth ] = useState(0);
const [ height, setHeight ] = useState(0);
const resize = () => {
setWidth(window.innerWidth);
setHeight(window.innerHeight);
};
useLayoutEffect(() => {
window.addEventListener("resize", resize);
resize();
return () => window.removeEventListener("resize", resize);
}, []);
return [width, height];
};
'React > Concept' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] Props (0) | 2022.07.14 |
---|---|
[ React ] ์น ์์ผ ํต์ + Web Audio API (0) | 2022.06.02 |