1. ํด๋์ค ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ
ํด๋์ค ์ปดํฌ๋ํธ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ์์ํ ๋ ์์ฑ์๊ฐ ์์ฑ๋๊ณ ,
render() ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ๋์๊ฐ ๋ ์์ฑ์ด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ํ ๋, Spring ์ ์ฒ๋ฆฌ๊ธฐ ์ฒ๋ผ componentDidMount๊ฐ ์์๋๋ค.
componentDidUpdate๋ ์ปดํฌ๋ํธ๊ฐ run ๋๋ ๋์ค์, ์ ๋ฐ์ดํธ(์ฌ์ฉ์์ ์์ง์, ๊ทธ์ ๋ฐ๋ฅธ ํผ๋๋ฐฑ)๊ฐ ์์ ๋๋ง๋ค ํธ์ถ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ปดํฌ๋ํธ๊ฐ ์ข ๋ฃ๋ ๋ componentWillUnmount๊ฐ ํธ์ถ๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ ๋ด๋ถ์๋ componentDidMount, componentDidUpdate, componentWillUnmount๋ผ๋ ํจ์๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ณ , ์ด๋ค์ด ์์ ์ด ํธ์ถ๋์ด์ผ ํ๋ ํ์ด๋ฐ์ ์๋ ํธ์ถ์ด ๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ์ด๋ ๊ฒ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
2. ํจ์ํ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ
์๋ค์ํผ ํจ์ํ ์ปดํฌ๋ํธ๋ ์๋ช ์ฃผ๊ธฐ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ธฐ ์ํด์๋ useEffect๋ผ๋ Hook์ ์จ์ผ ํ๋ค.
(1) useEffect์ ํํ์ ๊ธฐ๋ฅ
import {useEffect} from "react";
useEffect(() => {}, [])
useEffect์ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์์กด์ฑ ๋ฐฐ์ด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฌ๊ธฐ์ ํน์ ๋ณ์๊ฐ ๋ค์ด๊ฐ๋ค . ๋ฐฐ์ด ์ ๋ณ์๊ฐ ๊ฐ์ด ๋ฐ๋ ๋, ์ฒซ ๋ฒ์งธ ์ธ์์ธ ํจ์๊ฐ ์คํ๋๋ค.
(2) useEffect๋ก ํจ์ํ ์ปดํฌ๋ํธ์์ ์๋ช ์ฃผ๊ธฐ ๊ตฌํํ๊ธฐ
// didMount๋ฅผ ๋ํ๋ด๋ useEffect
// ์์กด์ฑ ๋ฐฐ์ด์ ์๋ฌด ๊ฐ๋ ์ ์ง ์์์, ๋งจ ์ฒ์ ์ปดํฌ๋ํธ๊ฐ run ๋ ๋ ์คํ ๋๋ ๊ฒฝ์ฐ ๋นผ๊ณ ์ ๋ํ๋๊ฒ ํ๋ค.
useEffect(() => {
console.log('didMount')
}, []);
// did update๋ฅผ ๋ํ๋ธ useEffect
// ์์กด์ฑ ๋ฐฐ์ด์ ํ์ธํ update๋ฅผ ์ ๊ณ , ํด๋น update๊ฐ ์ผ์ด๋ฌ์ ์ ํด์ผํ ์กฐ์น๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์์ ์ ๋๋ค.
useEffect(() => {
console.log('didUpdate - count', count)
}, [count]);
2. ์ฝ๋๋ฆฌ๋ทฐ
import React, { useEffect, useState } from "react";
import {
View,
Text,
Button,
TextInput,
Switch,
ActivityIndicator,
} from "react-native";
const Component = () => {
const [count, setCount] = useState(0);
const [isOn, setIsOn] = useState(true);
const [input, setInput] = useState("");
const [isRefresh, setIsRefresh] = useState(false);
useEffect(() => {
console.log('didMount')
}, []);
useEffect(() => {
console.log('didUpdate - count', count)
}, [count]);
useEffect(() => {
console.log('didUpdate - isOn', isOn)
}, [isOn]);
useEffect(() => {
console.log('didUpdate - input', input)
}, [input]);
useEffect(() => {
if(isRefresh){
setTimeout( () => {
setIsRefresh(false);
}, 2000);
}
}, [isRefresh]);
return (
<View style={{ alignItems: "center" }}>
<Text>You clicked {count} times</Text>
<Button title="Click me" onPress={() => setCount(count + 1)} />
<Text style={{ marginVertical: 5}}>
-------------------------------------------------
</Text>
<Switch value={isOn} onValueChange={setIsOn} />
<Text style={{ marginVertical: 15 }}>
-------------------------------------------------
</Text>
<Text>input: {input}</Text>
<TextInput
value={input}
onChangeText={setInput}
style={{ borderBottomWidth: 1, borderColor: "grey" }}
/>
<Text style={{ marginVertical: 15 }}>
-------------------------------------------------
</Text>
<Button
title="์๋ก๊ณ ์นจ!"
onPress={() => {
setIsRefresh(true)
}}
/>
{isRefresh && <ActivityIndicator/>}
</View>
);
};
export default Component;
(1) ํด๋ฆญ ์ count์ ๋ํ ๊ฒ, ์ค์์น on/off์ ๋ํ ๊ฒ, input์ ๊ฐ ์ ์์ ๋์ ๋ํ ๊ฒ์ didUpdate๊ฐ ๋ฐ๋ก ์๋ค.
(2) {isRefresh && <ActivityIndicator/>}์์ &&๋ฌธ์ if ๋ฌธ๊ณผ ๊ฐ๋ค. {1๋ฒ ๋ณ์ && ํํ๋ฌธ} 1๋ฒ ๋ณ์๊ฐ true์ผ ๋๋ง ํํ๋ฌธ์ด ์คํ๋๋ค.
(3) <ActivityIndicator/>๋ ๊ทธ ์๋ก๊ณ ์นจ ์ ๋จ๋ ๋ก๋ฉ ์ค ํ์UI ์ด๋ค.
(4) ์๋ก ๊ณ ์นจ ๋ฒํผ์ ๋๋ฅด๋ฉด useState Hook ๋๋ถ์ isReFresh๊ฐ true๊ฐ ๋๋ค.
- ์ด๋ ๋ ๊ฐ์ง ๋ช ๋ น์ ์ํฅ์ ์ฃผ๋๋ฐ, isRefresh๊ฐ true๊ฐ ๋์ ๋ฐ์ ๋ก๋ฉ ์ค ํ์๊ฐ ๋์๊ฐ ๊ฒ์ด๊ณ ,
- ๊ณ์ ๋ก๋ฉ ์ค์ด๋ฉด ์๋๋๊น, useEffect๋ฅผ ํตํด isRefresh ๊ฐ์ด true๋ก ๋ฐ๋ ์ 2์ด ๋ค์ false๋ก ํ ๊ธํ๋ ํจ์๊ฐ ์คํ๋๋ค.
3. ์ค์ค๋ก ํด๋ณด๊ธฐ (ํด๋ฆญ ์ ์นด์ดํธ ์ธ์ฃผ๋ didUpdate, ํ ๊ธ ์๋ boolean ๊ฐ ์ฐ์ด์ค๋ didUpdate, ๋ก๋ฉ ์ค ๋ก์ง, ์ธํ ์๋ ค์ฃผ๋ didUpdate ๋ง๋ค๊ธฐ)
import React, { useEffect, useState } from "react";
import {
View,
Text,
Button,
TextInput,
Switch,
ActivityIndicator,
} from "react-native";
const component = () => {
const [count, setCount] = useState(0);
const [IsOn, setIsOn] = useState(false);
const [name, setName] = useState("");
const [IsFresh, setIsFresh] = useState(false);
useEffect(
() => {console.log("count", count)},
[count])
useEffect(
() => {console.log("IsOn", IsOn)},
[IsOn])
useEffect(
() => {console.log("name", name)},
[name])
useEffect(
() => {
console.log("IsFresh", IsFresh)
if(IsFresh){
setTimeout( ()=> {
setIsFresh(false)}
, 2000);
}
},
[IsFresh])
return (
<View style = {{alignItems : "center"}}>
<Text>์ง๊ธ๊น์ง {count}๋ฒ ํด๋ฆญ ํ์
จ์ต๋๋ค.</Text>
<Button title="Click ME!" onPress={() => {setCount(count + 1)}}/>
<Text style={{marginVertical: 15}}>--------------------------------------</Text>
<Switch value={IsOn} onValueChange={(v) => {setIsOn(v)}}/>
<Text style={{marginVertical: 5}}>--------------------------------------</Text>
<TextInput
style={{backgroundColor:"pink"}}
placeholder="๊ฐ์ ์
๋ ฅํ์ธ์."
onChangeText={(v) => {
setName(v)
}}
/>
<Button
title="์๋ก๊ณ ์นจ"
onPress={()=>{setIsFresh(true)}}
/>
{IsFresh && <ActivityIndicator/>}
</View>
)
}
export default component
** Hook์ return ๋ฐ์๋ค๊ฐ ์ ์ธํ๋ค.
** setTimeOut() ์ ๊ดํธ ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋๋ค์, ๋๋ฒ์งธ ์ธ์๋ ์๊ฐ ์ด๋ ms