์๋ ํ์ธ์ Foma ์ ๋๋ค!
์์ฆ React Native๋ฅผ ๊ณต๋ถํ๋๋ฐ useState,useEffect๊ฐ ์ ๋ง ๋ง์ด ๋ณด์ด๋๋ผ๊ตฌ์.
์ด๊ฒ ๋ญ์ง ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ ํํ ์๊ณ ์ ์ด ๊ธ์ ์ ๋ฆฌํ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
์ธ์ด๋ TypeScript, ํ๊ฒฝ์ Expo๋ก ์งํ ํ๊ฒ ์ต๋๋ค!
Hooks
Hooks์ ๋ํด ์ ๋ง ์ ๋ง ๊ฐ๋จํ๊ฒ ์ค๋ช ํด ๋๋ฆด๊ฒ์.
(์๋ํ๋ฉด useState,useEffect๊ฐ ๋ชจ๋Hooks์ด๊ธฐ ๋๋ฌธ์ด์ฃ .)
๊ธฐ์กด์ React Native์์ ์ํ ๊ด๋ฆฌ์ ๋ผ์ดํ ์ฌ์ดํด์ ๊ด๋ฆฌํ๊ธฐ ์ํด์ Class ํํ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ต๋๋ค.
์ด์ ๊ฐ์ด Class๋ก ์์ฑํ๊ฒ ๋๋ฉด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ํ๊ธฐ๊ฐ ํ๋ค๊ณ , ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋๊ฐ ์ถ๊ฐ ๋๋ฉด์ ์ธ ๋ฐ ์์ด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ฐ๋ก ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด(์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด) ํ์ํ ๊ธฐ๋ฅ์ ๋๋ค.
๊ธฐ์กด Class์ ๋ฌธ์ ์ ์ฝ๋๋ก ์ดํด๋ณด๊ธฐ
์๋์ ๊ฐ์ด Increase ๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์๊ฐ 1 ์ฆ๊ฐํ๊ณ , Decrease ๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์๊ฐ 1 ๊ฐ์ํ๋ ํ๋ฉด์ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
1. state๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค.
๊ฐ์ฅ ๋จผ์ ์ ์ซ์์ ์ํ๋ฅผ ๋ํ๋ผ state๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ ์ด๊ธฐ๊ฐ์ ์ง์ ํด ์ค์ผ ํฉ๋๋ค.
import React from "react";
export default class CounterComponent extends React.Component<
{},
{ count: number }
> {
state = {
count: 0,
};
}
2. ํด๋น ๊ธฐ๋ฅ์ ๋ฉ์๋๋ฅผ ์ง์ ๋ง๋ค์ด ์ค์ผ ํ๋ค.
ํ๋ฉด์ ๋ ๋๋ง ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑ๋ ๊ฒ์ ๋๋ค.
render() {
return (
<div>
<div style={{ fontSize: "100px" }}>{this.state.count}</div>
<div></div>
<button onClick={this.increaseNumber}>Increase</button>
<button onClick={this.decreaseNumber}>Decrease</button>
</div>
);
}
onClick์ ์ง์ ๊ธฐ๋ฅ์ ์์ฑํ ์๊ฐ ์์ด ๋ฐ๋ก ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ค์ผ ํฉ๋๋ค.
increaseNumber = () => {
this.setState((state) => ({
count: state.count + 1,
}));
};
decreaseNumber = () => {
this.setState((state) => ({
count: state.count - 1,
}));
};
3. Life Cycle์ ๋ฐ๋ผ setState ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํด ์ค์ผ ํ๋ค.
state์ ํด๋น ๋ฌธ์ฅ์ ๋ํ๋ผ title์ ๋ง๋ค์ด ์ค๋๋ค.
state = {
count: 0,
title: "",
};
component๊ฐ mount ๋์์ ๋์ update ๋์์ ๋ setState๋ฅผ ๋ฐ๋ก ์์ฑํด ์ค์ผ ํฉ๋๋ค.
componentDidMount() {
setTimeout(() => {
this.setState({
title: `Initial count is ${this.state.count}`,
});
}, 1000);
}
componentDidUpdate() {
setTimeout(() => {
this.setState({
title: `Updated count is ${this.state.count}`,
});
}, 1000);
}
Hooks๋ก ์ ๋ฌธ์ ๊ฐ์ ํ๊ธฐ
๋จผ์ Component๋ฅผ class ํํ๊ฐ ์๋ function ํํ๋ก ๋ง๋ค์ด ์ค๋๋ค.
1. useState
๋จผ์ Hooks์์ ์ ๊ณตํ๋ useState๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ๊ด๋ฆฌํ ๊ฑด๋ฐ์.
๊ท์น์ [์ํ๋ฅผ ๋ํ๋ผ ๋ณ์, ์ํ๋ฅผ ๋ฐ๊ฟ ํจ์] = useState(๊ธฐ๋ณธ๊ฐ) ์ผ๋ก ์์ฑํด ์ค๋๋ค.
export default function CounterComponent() {
const [count, setCount] = useState(0);
}
2. onClick ๋ฉ์๋์ ๋ฐ๋ก ์ ์ฉํ๊ธฐ
์์์ setCount๊ฐ ์ํ๋ฅผ ๋ฐ๊ฟ ํจ์๋ผ๊ณ ์ค๋ช ๋๋ ธ์ฃ ?
onClick์ ํ์ ๋ setCount๋ก count๋ฅผ +1 ๋๋ -1 ํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํด ์ค ์ ์์ต๋๋ค.
return (
<div>
<div style={{ fontSize: "100px" }}>{count}</div>
<div></div>
<button onClick={() => setCount(count + 1)}>Increase</button>
<button onClick={() => setCount(count - 1)}>Decrease</button>
</div>
);
3. useEffect
์ class๋ก ๊ตฌํ ํ์ ๋ ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋ ๋ง๋ค setState๋ฅผ ๊ฐ ์์ฑํด ์ค์ผ ํ๋๋ฐ์.
useEffect๋ฅผ ์ฐ๋ฉด ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ์ค์ฌ์ค ๋ฟ๋ง ์๋๋ผ ๋ ๋๋ง ์ ๋ฐ์ํ๋ side effect๋ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
useEffect(() => {})
์ด๋ ๊ฒ ์์ฑํ๋ฉด ํ๋ฉด์ด ๋ ๋๋ง ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค.
๊ณ ๋ก ์์ ๊ฐ์ด ์์ฑํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค.
useEffect(() => {},[])
์ด์ ๊ฐ์ด ์์ฑํ๋ฉด ๋ ๋๋ง ํ ๋ฑ ํ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
useEffect(() => {},[์ํ๋ฅผ ๋ํ๋ด๋ ๋ณ์)
๋ ๋๋ง ํ ํ๋ฒ ์คํ๋๊ณ , ์ํ๋ฅผ ๋ํ๋ด๋ ๋ณ์๊ฐ ๋ฐ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค.
๋๊ฐ์ด title์ useState๋ก ๋ง๋ค์ด ์ฃผ๊ณ ,
const [title, setTitle] = useState(`Initial count is ${count}`);
useEffect๋ฅผ ๋จ ํ๋ฒ๋ง ์คํ๋ ์ ์๋๋ก useEffect(() => {},[]) ๊ฐ์ด ์์ฑํด ์ค๋๋ค.
์ค๊ดํธ ์ฌ์ด์ setTitle์ ์์ฑํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
useEffect(() => {
setTitle(`Updated count is ${count}`);
}, []);
์ฝ๋๋ ๋น๊ต
์ผ์ชฝ์ด Hooks๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ด class๋ก ๊ตฌํํ ๊ฒฝ์ฐ์ ๋๋ค.
์์ฃผ ๊ฐ๋จํ ์์ ์์๋ ๋ถ๊ตฌํ๊ณ ์ฝ๋ ๊ธธ์ด๊ฐ ์ฝ 2๋ฐฐ ์ฐจ์ด๊ฐ ๋๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํตํด์ class๋ก ๊ตฌํํ์ ๋์ ๋น๊ตํ์ฌ Hooks๋ฅผ ์ด์ฉํด ๊ตฌํํ์ ๋์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ์ฌ์ฉํ๊ธฐ๊ฐ ๋๋ฌด ํธ๋ฆฌํ๋ค๋ ๊ฑธ ๋๊ผ์ต๋๋ค.
Hooks๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
1. ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
2. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
3. ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
4. Class ์์ด ๋ฆฌ์กํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
Reference
๋๊ธ