โ ย Hooks API
๐ย ๊ฒฐ๋ก
- Hook์ด ์ ์๊ฒจ๋ฌ๋์ง ์๊ณ ์ฐ์
โ๏ธย ๋ด์ฉ
- ์ Hooks API๊ฐ ์๊ฒจ๋ฌ๋?
HOC
- ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ ์ฌ์ฉํ๊ธฐ ์ํ React ๊ณ ๊ธ ๊ธฐ์
-
๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ React API์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ, React์ ๊ตฌ์ฑ์ ํน์ฑ์์ ๋์ค๋ ํจํด
const EnhancedComponent = higherOrderComponent(WrappedComponent); // ์ฌ์ฉ export default connect(mapStateToProps, mapDispatchToProps)(TodoApp);
Render Props
- React ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ํจ์ props๋ฅผ ์ด์ฉํ๋ ๊ฐ๋จํ ๊ธฐ์
-
๊ตฌํ๋ ์ปดํฌ๋ํธ๋ ์์ฒด์ ์ผ๋ก ๋ ๋๋ง ๋ก์ง์ ๊ตฌํํ๋ ๋์ , React ์๋ฆฌ๋จผํธ ์์๋ฅผ ๋ฐํํ๊ณ ์ด๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ ์ฌ์ฉ
<DataProvider render={(data) => <h1>Hello {data.target}</h1>} />
SFC
class ClassComponent extends React.Component {
render() {
return <div>{this.props.name}</div>
}
}
vs
const STatelessComponent = props = > <div>{props.name}</div>;
์ ๋ฆฌ
-
Hook ์ฌ์ฉ ๋ฐฉ๋ฒ
import React, { useState, useEffect } from 'react'; function Example() { // State ๊ด๋ฆฌ ์์ญ const [count, setCount] = useState(0); // State๊ฐ ๋ณํ์ ๋, ์ถ๊ฐ ๋ ๋๋ง ์์ ์์ญ // componentDidMount, componentDidUpdate์ ๋น์ท useEffect(( document.title = `You clicked ${count} times`; ) => {}, []) return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click Me </button> </div> ); }
โญ๏ธ ์์ฝ
- Hook ์๊ธด ์ด์ ์ ๊ทธ ๊ณผ์ ์ ์ ๋, ์ Hook์ ์ฌ์ฉํ๋์ง ์ ์ ์์
โ ย useEffect() ๊ธฐ๋ช ํจ์์ ํจ๊ป ์ฌ์ฉํ๊ธฐ
๐ย ๊ฒฐ๋ก
useEffect
์๋ฌ ํ์ ํ ๋, ๊ธฐ๋ช ํจ์ ์ฌ์ฉํ๋ฉด ํ์ ํ๊ธฐ ์ฌ์
โ๏ธย ๋ด์ฉ
-
useEffect
์์ ํ๊ฒ ์ฌ์ฉํ๊ธฐ- ์๋ฌ ํ์ cf) console.log, report, monitoring, React Devtools
- ๊ธฐ๋ช ํจ์๋ก ๋๊ธฐ๋ฉด ๋ก๊ทธ์ ๊ธฐ๋ช ํจ์๋ก ์ฐํ๊ธฐ ๋๋ฌธ์ ์๋ฌ ํ์ ์ด ์ฉ์ดํจ
// ๊ธฐ๋ช
ํจ์๋ก ๊ฐ์ฉํ๊ธฐ
useEffect(
function isInViewSomeComponent() {
// some logic
},
[isInView],
);
useEffect(
function onPopState() {
if (navigationType === 'POP') {
// some logic
}
},
[isInView],
);
useEffect(function onInit() {
// some logic
});
useEffect(function addEvent() {
document.addEventListener();
return function removeEvent() {
document.removeEventListener();
};
}, []);
โญ๏ธ ์์ฝ
- ๊ธฐ๋ช ํจ์๋ฅผ ์ ์ฌ์ฉํด์ ์๋ฌ ํ์ ๋ฐ ์ฝ๋ ํ์ ์ ์ฉ์ดํ๊ฒ ํ์
โ ย ํ ๊ฐ์ง ์ญํ ๋ง ์ํํ๋ useEffect
๐ย ๊ฒฐ๋ก
useEffect
๋ฅผ ์์ฑํ ๋, ํ๊ฐ์ง์ ์ญํ ์ ํ ์ ์๋๋ก ์์ฑํ์.
โ๏ธย ๋ด์ฉ
-
SRP - ๋จ์ผ์ฑ ์ ์์น
- ํ๋์ ์ญํ ๋ง ์ํํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ โ
useEffect()
- ํ์ธ ํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ๋ช ํจ์๋ฅผ ์์ฑํด๋ณด์
- Dependency Arrays๊ฐ ๋๋ฌด ๋ง์ ๊ด์ฐฐ ๋์์ด ๋ค์ด๊ฐ๊ณ ์๋๊ฒ ์๋์ง ํ์ธ
- ํ๋์ ์ญํ ๋ง ์ํํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ โ
function LoginPage({ token, newPath }) {
// โ ์ํ
useEffect(() => {
redirect(newPath);
const userInfo = setLogin(token);
// ... ๋ก๊ทธ์ธ ๋ก์ง
}, [token, newPath]);
// โ
๋ถ๋ฆฌ
useEffect(() => {
redirect(newPath);
}, [newPath]);
useEffect(() => {
const userInfo = setLogin(token);
// ... ๋ก๊ทธ์ธ ๋ก์ง
if (options) {
// ๋ถ๊ฐ์ ์ธ ๋ก์ง <= ์ถ๊ฐ ๋์ํด๋ ์ด์์ด ์๊ณ ๋ถ์์ฉ์ด ์๊ธธ ์ผ์ด ์
์ ๊ฒฝ์ฐ
}
}, [token, options]);
}
โญ๏ธ ์์ฝ
useEffect
๋ฅผ ์ฌ์ฉํ ๋, ํ ๊ฐ์ง ์ญํ ๋ง ํ ์ ์๋๋ก ์์ฑํ์.
โ ย Custom Hook ๋ฐํ์ ์ข ๋ฅ
๐ย ๊ฒฐ๋ก
- React์์ ์ ๊ณตํ๋ ์ปจ๋ฒค์ ์ ๋ง๊ฒ Custom Hook์ ์ฌ์ฉํ์
โ๏ธย ๋ด์ฉ
-
Custom Hook ์ฌ์ฉ์ ์ง์ผ์ผ ํ ๊ท์น๋ค
function ReturnCustomHooks() { // โ const [setValue, value] = useSomeHooks(true); // โ const [value, setValue] = useSomeHooks(true); // โ const [oneValue] = useSomeHooks(); // โ const oneValue = useSomeHooks(); // โ const [firstValue, secondValue, _, thirdValue] = useSomeHooks(true); // โ const { firstValue, secondValue, rest} = useSomeHooks(true) // โ const query = useQuery({ queryKey: ['hello', queryFn: getHello }) const data = query.data; const refetch = query.refetch; const isSuccess = query.isSuccess // โ const { data, refetch, isSuccess } = useQuery({ queryKey: ['hello', queryFn: getHello }) }
โญ๏ธ ์์ฝ
- Custom Hook์ ์ฌ์ฉํ ๋, ์ผ๊ด๋ ์ปจ๋ฒค์ ์ ์์ฑํ์.
โ ย useEffect ๋ด๋ถ์ ๋น๋๊ธฐ ํจ์
๐ย ๊ฒฐ๋ก
useEffect
์ฌ์ฉ์ Promise ๊ฐ์ ๋ฆฌํดํ๋ ๋น๋๊ธฐ ํจ์ ์ฌ์ฉ์ ์ฃผ์ํ์
โ๏ธย ๋ด์ฉ
-
useEffect
๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์ ์ฒ๋ฆฌ// โ // useEffect ๋ฆฌํด ๊ฐ์ undefined์ด๊ฑฐ๋ clean function์ useEffect(async () => { // ๋น๋๊ธฐ ์์ const result = await fetchData(); }, []); // โ useEffect(async () => { // ๋น๋๊ธฐ ์์ const fetchData = async () => { const result = await someFetch(); }; fetchData(); }, []);
โญ๏ธ ์์ฝ
useEffect
๋ด๋ถ์์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋, ์ปค์คํ ํ ์ด๋, ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ์