2020. 6. 14. 10:36ใETC/Programming
ํด๋น ํฌ์คํ ์์๋ React์ ๋ด์ฅ๋ Hook API์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
1๏ธโฃ useState
2๏ธโฃ useEffect
โ๏ธ useState
ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ ๊ด๋ฆฌ
state = {
isLoading : true,
recipeList : []
}
// AA๋ผ๋ list๊ฐ ์๋ค๊ณ ๊ฐ์ .
this.setState({recipeList:AA, isLoading:false});
ํด๋์ค์์๋ state๋ฅผ ๊ฐ์ฒด๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํฉ๋๋ค.
const [value, setValue] = useState(100);
useState๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
- value : state ๊ฐ
- setValue : state๋ฅผ ์ค์ ํ๋ ํจ์
- value์ ์ด๊ธฐ๊ฐ์ 100์ผ๋ก ์ค์ .
(value, setValue๋ ์ํ๋ ์ด๋ฆ์ ๋ณ์๋ก ์๋ฌด๋ ๊ฒ๋ ๋ค์ด๋ฐํด๋ ์๊ด์์ต๋๋ค.
ํ์ง๋ง, [A, setA] ๋ผ ๋ค์ด๋ฐํ๋ ๊ฒ์ด ์ฝ๋ฉํ๋ ๋ฐ ํธํ ๊ฑฐ์์ใฐ๏ธ)
setValue(0);
setValue(value-1);
- setValue์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด์ ํธ์ถํฉ๋๋ค
- ์ ๋ฌ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ก value๋ก ๊ฐ์ด ๋ฐ๋๊ฒ ๋๊ณ ์ปดํฌ๋ํธ๋ ์ ์์ ์ผ๋ก ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
์ฌ๊ธฐ์, useState๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์โ
// useState๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ๊ธฐ
setResult(value);
setFirst(Math.ceil(Math.random() * 9));
setSecond(Math.ceil(Math.random() * 9));
setValue('');
setState()๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง๋๋ค๊ณ ํ๋๋ฐ, ์์ ๊ฐ์ด ํ ๋ฒ์ useState๋ฅผ ํธ์ถํ๋ฉด 4๋ฒ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋ ๊น์?
์๋๋๋ค. ๋ ๋๋ง์ ๋ฑ ํ ๋ฒ ์ผ์ด๋๋๋ฐ์, ์ด๊ฒ์ ํตํด์ ๋น๋๊ธฐ์์ ์ ์ ์์ต๋๋ค.
โ๏ธ useEffect
React Life Cycle(componentDidMount, componentDidUpdate, componentWillUnmount)์ ํด๋นํ๋ ๋ก์ง์ ์ฌ์ฉ ๊ฐ๋ฅ
function useEffect(effect: EffectCallback, inputs?: InputIdentityList)
- effect : renderํ ๋๋ง๋ค ๋งค๋ฒ ํธ์ถ๋ฉ๋๋ค.
- input? : ํน์ state๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง effect๊ฐ ์คํ๋๊ฒ input์ ์ง์ ํ ์ ์์ต๋๋ค.
( ๋ฆฌ์กํธ ๊ณต์ ๊ฐ์ด๋์ ๋ฐ๋ฅด๋ฉด, ๋น๋๊ธฐ ์์ ์ ํจ์นญํ ๋ useEffect ์ฝ๋ฐฑ ํจ์ ์์ ์ง์ ๋ฃ์ง ๋ง๊ณ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค์ใฐ๏ธ )
1๏ธโฃ Class์์ componentDidMount()๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
// API๋ก๋ถํฐ data๋ฅผ fetchํ๋ ๊ณผ์ . ์๋ฃ ์ ๊น์ง๋ Loading...์ ๋์์ค.
class Data extends React.Component {
constructor(props) {
super(props);
this.state = { item : null };
this.setData = this.setData.bind(this);
}
componentDidMount() {
API.getData()
.then((response) => { this.setData(response) });
}
setData(data) {
this.setState({ item: data });
}
render() {
const isLoading = (this.state.item == null);
return { isLoading ? "Loading..." : this.state.item }
}
}
์คํ ์์ : constructor → render → componentDidMount ( setData ) → render → componentDidUpdate
2๏ธโฃ ํจ์ํ ์ปดํฌ๋ํธ์์ useState()๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
// useEffect๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ
import { useState, useEffect } from 'react';
export function Data() {
const [data, setData] = useState(null);
useEffect(() => {
API.getData()
.then((response) => { setData(response) });
}, []);
const isLoading = (data == null);
return { isLoading ? "Loading..." : data }
}
์ ์ฝ๋์์ useEffect์ ๋ ๋ฒ์งธ ์ธ์๋ ๋น ๋ฆฌ์คํธ([])์ ๋๋ค. ์ด๋ก ์ธํด ์ฒ์ ๋ง์ดํธ ์๋ฃ ํ(componentDidMount)์๋ง useEffect๊ฐ ์คํ๋ฉ๋๋ค.
๋ง์ฝ ๋๋ฒ์งธ ์ธ์๊ฐ ์์ ์์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์โ๋ฌดํ ๋ฐ๋ณต์ผ๋ก ๋ฆฌ๋ ๋๋ง๋ ๊ฒ์ ๋๋ค. ์ด์ฒ๋ผ, useEffect๋ฅผ ์ฌ์ฉํ ๋๋ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์ ์ํด์ ์ฌ์ฉํ๋๋ก ํ์ธ์!
๐ก clean-up
: effect๊ฐ ํจ์๋ฅผ ๋ฐํํ๋ฉด ๋ฆฌ์กํธ๋ ๊ทธ ํจ์๋ฅผ ์ ๋ฆฌ๊ฐ ํ์ํ ๋์ ์คํ์ํต๋๋ค.
- ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๋ ๋์ ์ ๋ฆฌ(clean-up)๋ฅผ ์คํํฉ๋๋ค.
- ์ ๋ฆฌ(clean-up)๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ์๋ ๋ฐํ์ ํ์ง ์์ผ๋ฉด ๋ฉ๋๋ค.
const useBeforeLeave = (onBefore) => {
const handle = (e) => {
const {clientY} = e;
if (clientY <= 0) // ์๋ก ๊ฐ๋ฉด ๋ฐ์
onBefore() ;
}
useEffect(() => {
document.addEventListener("mouseleave", handle);
return () => document.removeEventListener("mouseleave", handle);
}, []);
};
๐ก ํ ์ปดํฌ๋ํธ ๋ด์์ effect๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค !
- ์๋ก ๊ด๋ จ ์๋ ๋ก์ง์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ์ ์ฌ์ฉ๋ ๋ชจ๋ effect๋ฅผ ์ง์ ๋ ์์์ ๋ง์ถฐ ์ ์ฉํฉ๋๋ค.
๐ ์ฐธ๊ณ ๋งํฌ
'ETC > Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] Nodejs์์ Discord Webhook์ผ๋ก ๋ฉ์์ง ๋ฐ์กํ๊ธฐ (0) | 2024.02.11 |
---|---|
[Python] Python ๊ฐ์ํ๊ฒฝ (venv) ์์๋ณด๊ธฐ (0) | 2023.08.29 |
[ReactJS] Hook ๊ฐ๋ ์์๋ณด๊ธฐ (4) | 2020.06.03 |