State
ํด๋์คํ ์ปดํฌ๋ํธ์์ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ state๋ฅผ ์ฌ์ฉํ๋ค.(๊ธ๋ก๋ฒ ๋ณ์๋ผ๊ณ ์๊ฐ)
setState
state์ ์๋ ๊ฐ์ ๋ฐ๊พธ๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด this.setState๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.
๋ฆฌ์กํธ์์ ์ด ํจ์๊ฐ ํธ์ถ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋๋ก ์ค๊ณ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
setState๋ ๊ฐ์ฒด๋ก ์ ๋ฌ๋๋ ๊ฐ๋ง ์ ๋ฐ์ดํธ ํ๋ค
state๋ฅผ ์ด์ฉํ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ซ์(number)๊ฐ ์นด์ดํธ ๋๋ ์ฝ๋
import React, { Component } from 'react';
import {View, Text, Button} from 'react-native';
class App extends Component {
state = {
number: 0
};
up = () => {
this.setState({
number: this.state.number + 1
});
};
down = () => {
this.setState({
number: this.state.number - 1
});
};
render() {
return (
<View>
<Text style={{fontSize:30}}>์นด์ดํฐ</Text>
<Text style={{fontSize:30}}>๊ฐ:
{this.state.number}</Text>
<Button onPress={this.up} title="+">
</Button>
<Button onPress={this.down} title="-">
</Button>
</View>
);}}
export default App;
up๊ณผ down์ ํ์ดํ ํจ์๋ฅผ ์ฐ๋ ์ด์ , - this๋ฅผ ์๋์ผ๋ก ๋ฐ์ธ๋ฉ ํด์ค๋ค.
JS์์ ํด๋์ค ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ธ๋ฉ ๋์ด ์์ง ์๋ค.
this.up์ ๋ฐ์ธ๋ฉ ํ์ง ์๊ณ onPress์ ์ ๋ฌํ์๋ค๋ฉด, ํจ์๊ฐ ์ค์ ๋ก ํธ์ถ๋ ๋ this๋ undefined ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก onPress={this.up}๊ณผ ๊ฐ์ด ๋ค์ ()๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ, this.down.bind(this)์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉ ํด์ผํ๋ค.
ํ์ง๋ง, ํ์ดํํจ์๋ฅผ ์ฌ์ฉํ๋ฉด this๋ ์์ ํ๊ทธ๋ฅผ ๊ฐ๋ฅดํค๊ธฐ ๋๋ฌธ์ bindํ์ง ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
โ
๋ฐ์ธ๋ฉ(React Binding)์ ๋ฆฌ์กํธ์์ ์ปดํฌ๋ํธ์ ์ด๋ฒคํธ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ํจ์์์ ์ฌ์ฉํ๋ this์ ๋์์ ์ง์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
โ
renderํจ์ ์์์ this๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง๋ง ์ด๋ฒคํธ (onPress)ํจ์ ์์์ this๋ ์๋ฌด๊ฒ๋ ๊ฐ๋ฅดํค์ง ์๊ธฐ ๋๋ฌธ์ onPressํจ์๋ฅผ bind๋ก this๋ฅผ ๋ฐ์ธ๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.
React Hook
Hook์ ๋ฆฌ์กํธ v16.8์ ์๋ก ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ์ Hook์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ์ฆ, Hook์ ํจ์ ์ปดํฌ๋ํธ์์ React state(์ํ๋ณํ)์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ(lifecycle features)์ “์ฐ๋(hook into)”ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ด๋ค.
โ
๊ธฐ์กด์๋ ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค๊ฐ state๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด ํด๋์ค ์ปดํฌ๋ํธ๋ก ๋ฐ๊พธ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์๋ค.
Hook์ ๋ง๋ค์ด์ง ๋ชฉ์ ์์ฒด๊ฐ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด์์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ปดํฌ๋ํธ ์์์๋ ๋์ํ์ง ์๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ ๋จ์
Logic์ ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์์ง๋ง, ์ปดํฌ๋ํธ ํด๋์ค ๋ถ๋ถ์ ์ธ API ์ฌ์ฉ ๋ฐ state๋ฅผ ๋ค๋ฃจ๋ ๋ฑ์ ์ฒ๋ฆฌ์๋ ์ฌ์ฌ์ฉ์ ์ ์ฝ์ด ๋ฐ๋ฅธ๋ค.
โ
์ฝ๋๊ฐ ๊ธธ๊ณ ๋ณต์กํด์ง๋ค.
๊ธฐ๋ณธ ๊ท์น์ ๋ฐ๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ณต์กํ๊ณ ๊ธธ๋ค
โ
Hook ์ฒ๋ฆฌ์ ์ฅ์
ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ํ๋ ๊ธฐ๋ฅ์ ํจ์๋ก ๋ง๋ ํ ํ์ํ ๊ณณ์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ก์ง์ ์ฌ์ฌ์ฉ์ด ์ ์ฐํด์ง๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ณต์ก์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๋จ์ ๋ค์ด ํด๊ฒฐ๋๋ค.
๊ธฐ๋ณธ Hook์ธ useState
ํด๋์ค ์ปดํฌ๋ํธ๋ state๋ฅผ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ํจ์์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์์๋ ๋ฆฌ์กํธ์์ ์์ฒด์ ์ผ๋ก ์ง์ํ๋ ‘useState’๋ผ๋ React hooks๋ฅผ ์ฌ์ฉํด์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
ํ์
// import ํ๊ธฐ
import React, {useState} from "react";
// useState ์ ์ธ
const [<์ํ ๊ฐ ์ ์ฅ ๋ณ์>, <์ํ ๊ฐ ๊ฐฑ์ ํจ์>] = useState(<์ํ ์ด๊ธฐ ๊ฐ>);
useState๋ฅผ ์ด์ฉํ ์ซ์(number) ์นด์ดํธ ์์
import React, {useState} from "react";
import {View, Text, Button} from 'react-native';
function App(){
const [number, setNumber] = useState(0)
const up = () =>{
setNumber(number+1)
}
const down = () =>{
setNumber(number-1)
}
return(
<View>
<Text style={{fontSize:30}}>์นด์ดํฐ</Text>
<Text style={{fontSize:30}}>๊ฐ: {number}</Text>
<Button title="+" onPress={up} />
<Button title="-" onPress={down} />
</View>
);
}
export default App;
Hook API
ํ
|
๋ชฉ์
|
|
๊ธฐ๋ณธ ํ
|
useState
|
์ํ ์ ์ง ๋ฐ ๋ณ๊ฒฝ
|
useEffect
|
์ด๋ฒคํธ ์ฒ๋ฆฌ
|
|
useContext
|
์ ๋ณด ๊ณต์
|
|
์ถ๊ฐ ํ
|
useReducer
|
์ํ ์ ์ง ๋ฐ ๋ณ๊ฒฝ
(Redux)
|
useCallback
|
์ฝ๋ฐฑ ํจ์ ์บ์
|
|
useMemo
|
๋ฐ์ดํฐ, ๊ฐ ์บ์
|
|
useRef
|
์ปดํฌ๋ํธ๋ HTML ์์๋ฅผ ๋ํผ๋ฐ์ค๋ก ๊ด๋ฆฌ
|
'๐ Development > React Native' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React Native] ์ปดํฌ๋ํธ ์คํ์ผ๋ง (0) | 2023.06.15 |
---|---|
[React Native] context API๋ (0) | 2023.06.15 |
[React Native] Props ๋? ์์ (0) | 2023.06.15 |
React Native ์ปดํฌ๋ํธ๋? / ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์ ํน์ง (0) | 2023.06.15 |
[React Native] JSX ๋? / JSX ๋ฌธ๋ฒ (0) | 2023.06.15 |