| μΌ | μ | ν | μ | λͺ© | κΈ | ν |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- μ½λ©ν μ€νΈ
- dbμ λ΅
- SpringBoot
- μ€λΈμ
- Personal Access Token
- node.js mysql μ°λ
- dockerhub
- μΏ λ²λ€ν°μ€
- λμμΈν¨ν΄
- μκ³ λ¦¬μ¦
- javaμ±ν
- μ½ν
- Jenkins
- injection곡격
- ν°μ€ν 리μ±λ¦°μ§
- MySQL
- Node.js
- Java
- μλ°
- ν¬λ‘μ€μ¬μ΄νΈ μ€ν¬λ¦½νΈ
- React
- oauth
- spring
- dbμν€ν μ³
- GoogleLogin
- @scheduler
- CICD
- spring scheduler
- λ ΌλΈλ‘νΉ
- docker
- Today
- Total
<Hello Hosungπ/>
[React, RN] 리μ‘νΈ ν (React Hooks) μκ°π λ³Έλ¬Έ
[React, RN] 리μ‘νΈ ν (React Hooks) μκ°π
μ’μΆ©μ°λ λ°±μλ κ°λ°μ μΌκΈ°π§ 2024. 11. 22. 23:36
리μ‘νΈλ 2013λ
μ μ²μ λ±μ₯ν μ΄νλ‘ μ§μμ μΌλ‘ μ§νν΄μκ³ , κ·Έ μ€ νλκ° λ°λ‘ 리μ‘νΈ ν
(React Hooks) μ
λλ€. ν
μ 2018λ
μ 리μ‘νΈ 16.8 λ²μ μμ λμ
λμμΌλ©°, ν¨μν μ»΄ν¬λνΈμμ μνμ λΌμ΄νμ¬μ΄ν΄ κΈ°λ₯μ μ¬μ©ν μ μκ² ν΄μ£Όλ κΈ°λ₯μ
λλ€. κ·Έ μ΄μ κΉμ§λ ν΄λμ€ν μ»΄ν¬λνΈμμλ§ μν κ΄λ¦¬λ λΌμ΄νμ¬μ΄ν΄ λ©μλλ₯Ό μ¬μ©ν μ μμλλ°, ν
μ ν΅ν΄ ν¨μν μ»΄ν¬λνΈμμλ μ΄λ₯Ό μ²λ¦¬ν μ μκ² λμμ΅λλ€.
ν μ΄λ 무μμΈκ°?
리μ‘νΈ ν
μ ν¨μν μ»΄ν¬λνΈμμ μν κ΄λ¦¬, λΆμ ν¨κ³Ό(side effect) κ΄λ¦¬, 컨ν
μ€νΈ μ¬μ© λ± μ¬λ¬ κΈ°λ₯μ κ°λ₯νκ² νλ ν¨μμ
λλ€. ν
μ μ¬μ©νλ©΄ μ»΄ν¬λνΈκ° λ κ°κ²°νκ³ μ½κΈ° μ½κ² μμ±λλ©°, μ¬μ¬μ©μ±λ μ¦κ°ν©λλ€.
ν
μ μ£Όμ νΉμ§
ν¨μν μ»΄ν¬λνΈμμλ§ μ¬μ©ν μ μμ΅λλ€.
리μ‘νΈμ μν κ΄λ¦¬μ λΆμ ν¨κ³Ό μ²λ¦¬ λ±μ κ°λ₯νκ² ν©λλ€.
μ»΄ν¬λνΈμ μλͺ
μ£ΌκΈ° λ©μλλ₯Ό λ κ°λ¨νκ³ μ§κ΄μ μΌλ‘ λ€λ£° μ μμ΅λλ€.
μ£Όμ 리μ‘νΈ ν
리μ‘νΈ ν
μλ λ€μν μ’
λ₯κ° μμ§λ§, κ·Έ μ€μμ κ°μ₯ λ§μ΄ μ¬μ©λλ κΈ°λ³Έ ν
λ€μ λ€μκ³Ό κ°μ΅λλ€.
1. useState
useState ν
μ μ»΄ν¬λνΈ λ΄μμ μνλ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λ©λλ€. ν΄λμ€ν μ»΄ν¬λνΈμμλ this.stateμ this.setStateλ₯Ό μ¬μ©νμ§λ§, ν¨μν μ»΄ν¬λνΈμμλ useState ν
μ μ¬μ©νμ¬ μνλ₯Ό μ μΈνκ³ μ
λ°μ΄νΈν©λλ€.
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increase</button>
</div>
);
}
2. useEffect
useEffect ν
μ μ»΄ν¬λνΈκ° λ λλ§λ ν νΉμ μμ
μ μνν μ μκ² ν΄μ£Όλ ν
μ
λλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ₯Ό fetchingνκ±°λ, DOM μ
λ°μ΄νΈ νμ side-effect μμ
μ μ²λ¦¬ν λ μ¬μ©ν©λλ€. ν΄λμ€ν μ»΄ν¬λνΈμμμ componentDidMount, componentDidUpdate, componentWillUnmount κ°μ μλͺ
μ£ΌκΈ° λ©μλμ μν μ ν©λλ€.
import React, { useState, useEffect } from 'react';
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => setSeconds(prev => prev + 1), 1000);
return () => clearInterval(interval); // μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλ λ μΈν°λ²μ ν΄λ¦¬μ΄ν©λλ€.
}, []); // λΉ λ°°μ΄μ λ£μΌλ©΄ μ»΄ν¬λνΈκ° λ§μ΄νΈλ λλ§ μ€νλ©λλ€.
return <p>Time: {seconds}s</p>;
}
3. useContext
useContext ν
μ 리μ‘νΈμ 컨ν
μ€νΈ(Context)λ₯Ό μ¬μ©ν λ μ°μ
λλ€. 컨ν
μ€νΈλ νΈλ¦¬ ꡬ쑰μμ λ°μ΄ν°λ₯Ό μ μμ μΌλ‘ μ λ¬ν λ μ¬μ©νλ©°, useContext ν
μ ν΅ν΄ λΆλͺ¨ μ»΄ν¬λνΈμμ λ΄λ €μ€ λ°μ΄ν°λ₯Ό μμ μ»΄ν¬λνΈμμ κ°νΈνκ² μ¬μ©ν μ μμ΅λλ€.
import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');
function ThemedComponent() {
const theme = useContext(ThemeContext);
return <div>The current theme is {theme}</div>;
}
function App() {
return (
<ThemeContext.Provider value="dark">
<ThemedComponent />
</ThemeContext.Provider>
);
}
4. useRef
useRef ν
μ μ»΄ν¬λνΈκ° λ λλ§λμ΄λ κ°μ΄ μ μ§λλ μ°Έμ‘°(ref)λ₯Ό λ§λλλ€. μ£Όλ‘ DOM μμμ μ κ·Όνκ±°λ, λ λλ§ κ°μ μ μ§λμ΄μΌ ν κ°μ μ μ₯νλ λ° μ¬μ©λ©λλ€.
import React, { useRef } from 'react';
function FocusInput() {
const inputRef = useRef(null);
const focusInput = () => {
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} />
<button onClick={focusInput}>Focus Input</button>
</div>
);
}
5. useMemo & useCallback
useMemoλ κ³μ° λΉμ©μ΄ λ§μ΄ λλ μ°μ°μ μ΅μ νν λ μ¬μ©ν©λλ€. μμ‘΄μ± λ°°μ΄μ κ°μ΄ λ³κ²½λμ§ μμΌλ©΄ μ΄μ μ κ³μ°λ κ°μ μ¬μ¬μ©ν©λλ€.
useCallbackμ ν¨μλ₯Ό λ©λͺ¨μ΄μ μ΄μ
ν λ μ¬μ©ν©λλ€. ν¨μκ° λΆνμνκ² λ€μ μμ±λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
import React, { useState, useMemo } from 'react';
function ExpensiveComputation({ number }) {
const expensiveResult = useMemo(() => {
return number * 2; // κ³μ° λΉμ©μ΄ λμ μ°μ°
}, [number]);
return <div>{expensiveResult}</div>;
}
ν
μ¬μ© μ μ£Όμμ¬ν
ν
μ νμ μ΅μμμμλ§ νΈμΆν΄μΌ ν©λλ€. 쑰건문μ΄λ λ°λ³΅λ¬Έ λ΄μμ νΈμΆλλ©΄ μ λ©λλ€.
ν
μ ν¨μν μ»΄ν¬λνΈ λ΄μμλ§ μ¬μ©ν΄μΌ νλ©°, ν΄λμ€ν μ»΄ν¬λνΈμμλ μ¬μ©ν μ μμ΅λλ€.
ν
μ μμ‘΄μ± λ°°μ΄(νΉν useEffect, useCallback, useMemoμμ)μ μ ννκ² μ€μ ν΄μΌ ν©λλ€. μμ‘΄μ± λ°°μ΄μ μλͺ» μ€μ νλ©΄ λ λλ§ μ΅μ νκ° μλͺ»λ μ μμ΅λλ€.
리μ‘νΈ ν
μ μ₯μ
κ°λ
μ±: ν¨μν μ»΄ν¬λνΈλ‘ μ½λλ₯Ό μμ±νλ©΄, ν΄λμ€ν μ»΄ν¬λνΈλ³΄λ€ μ½λκ° κ°κ²°νκ³ μ΄ν΄νκΈ° μ¬μμ§λλ€.
μ¬μ¬μ©μ±: ν
μ 컀μ€ν°λ§μ΄μ¦νμ¬ μ¬λ¬ μ»΄ν¬λνΈμμ λμΌν λ‘μ§μ μ¬μ¬μ©ν μ μμ΅λλ€.
μ±λ₯ μ΅μ ν: useMemo, useCallback λ±μ νμ©νλ©΄ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
λ§λ¬΄λ¦¬
리μ‘νΈ ν μ ν¨μν μ»΄ν¬λνΈμμ μν, λΆμ ν¨κ³Ό, μ°Έμ‘° λ±μ λ€λ£¨λ λ° ν° μ₯μ μ μ 곡νλ©°, μ½λμ κ°κ²°ν¨κ³Ό κ°λ μ±μ λμ¬μ€λλ€. 리μ‘νΈμ ν μμ€ν μ λμ± μ§κ΄μ μΈ κ°λ° κ²½νμ μ 곡νκ³ , 리μ‘νΈμ μ§νλ₯Ό μ΄λλ μ€μν μμμ λλ€. 리μ‘νΈμμ ν μ μ νμ©νλ λ°©λ²μ μ΅νλ©΄, λ ν¨μ¨μ μ΄κ³ μ μ§λ³΄μνκΈ° μ’μ μ ν리μΌμ΄μ μ κ°λ°ν μ μμ΅λλ€.
'π± JavaScript > γ €React, RN' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Expo + React Native] 1. νλ‘μ νΈ μ΄κΈ° ꡬ쑰 μλ²½ μ΄ν΄ (0) | 2025.11.30 |
|---|---|
| [React, RN] ν¨μ¨μ μΈ λ λλ§κ³Ό λΉ λ₯Έ λ‘λ©μ μν μ λ΅ (1) | 2024.11.25 |
| [React, RN] 리μ‘νΈ λΌμ°ν° μμ μ 볡 (1) | 2024.11.24 |
| [React, RN] 리μ‘νΈ μμνκΈ°π (0) | 2024.11.21 |