25.06.12 - se5ri/React GitHub Wiki
- μ»΄ν¬λνΈ μλͺ μ£ΌκΈ° μ΄λ²€νΈλ₯Ό λ±λ‘νκΈ° μν ν
- ν΄λμ€ κΈ°λ° μ»΄ν¬λνΈμμλ μλ λ©μλλ₯Ό μ€λ²λΌμ΄λν΄μ ꡬν
-
componentDidMount()
: μ»΄ν¬λνΈκ° λ§μ΄νΈ μλ£λκ³ λΈλΌμ°μ DOM νΈλ¦¬μ λ°μλ ν νΈμΆ -
componentDidUpdate()
: λΈλΌμ°μ DOM μ λ°μ΄νΈ μλ£ ν νΈμΆ -
componentWillUnmount()
: μ»΄ν¬λνΈκ° μμ λκΈ° μ§μ μ νΈμΆ - ...
-
- useEffectμμ μ£Όλ‘ κ΅¬ννλ κΈ°λ₯
- μ»΄ν¬λνΈμ λ λλ§ μμ
μΈμ λΆκ°μ μΈ μμ
- νμ΄λ¨Έ μ€μ
- λ‘κΉ
- μ»΄ν¬λνΈμ λ λλ§ μ΄νμ μ²λ¦¬ν μμ
- DOM μλ μ‘°μ
- side effectκ° λ°μνλ μμ
(μ»΄ν¬λνΈλ₯Ό μμ ν¨μλ‘ μ μ§)
- λ°μ΄ν° fetching
- μ»΄ν¬λνΈμ λ λλ§ μμ
μΈμ λΆκ°μ μΈ μμ
useEffect(setup, dependencies?);
-
setup
: μ»΄ν¬λνΈκ° λ§μ΄νΈ(1-4), μ λ°μ΄νΈ(2-5), μ κ±°(3-1) λ λ νΈμΆλλ ν¨μ-
setup
μ΄ ν¨μλ₯Ό 리ν΄νλ©΄, 리ν΄ν ν¨μλ₯Όcleanup
μ΄λΌκ³ λΆλ₯΄λ©°, μ»΄ν¬λνΈκ° μ λ°μ΄νΈλκ±°λ μΈλ§μ΄νΈ λ λ νΈμΆλ¨ (cleanupμ΄ λ¨Όμ μ€νλκ³ setupμ΄ λ€μ μ€νλ¨)
-
-
dependencies
(μ ν): μμ‘΄ κ°μ²΄ λ°°μ΄- μ»΄ν¬λνΈκ° μ
λ°μ΄νΈλ λ
setup
ν¨μλ₯Ό νΈμΆν μ§ λ§μ§ μ¬λΆλ₯Ό κ²°μ νλλ° μ¬μ© - μ»΄ν¬λνΈκ° λ§μ΄νΈλ λλ
dependencies
μ¬λΆμ μκ΄μμ΄setup
μ΄ νΈμΆλ¨ -
dependencies
λ₯Ό μλ΅νλ©΄, μ»΄ν¬λνΈκ° μ λ°μ΄νΈλ λ νμsetup
μ΄ νΈμΆλ¨ -
dependencies
μ λΉ λ°°μ΄μ μ§μ νλ©΄ μ λ°μ΄νΈμμλ νΈμΆλμ§ μμ -
dependencies
λ₯Ό μ§μ νλ©΄, ν΄λΉ κ°λ€μ΄ λ³κ²½λ λλ§setup
ν¨μκ° νΈμΆλ¨
- μ»΄ν¬λνΈκ° μ
λ°μ΄νΈλ λ
π 02 useEffect - side effect κ΄λ¦¬
- π» Counter.tsx
-
useState
μ λΉμ·νμ§λ§, μν κ΄λ¦¬κ° λ 볡μ‘ν κ²½μ°μ μ¬μ© -
useState
λ₯Ό μ¬μ©ν λ μ»΄ν¬λνΈ λ΄λΆμμ μν λ³κ²½ λ‘μ§μ ꡬνν΄μΌ νκΈ° λλ¬Έμ μ»΄ν¬λνΈκ° 볡μ‘ν΄μ§ - μ»΄ν¬λνΈ μΈλΆμμ μν κ΄λ¦¬λ₯Ό νκ³ μΆμ λ μ μ©
- μ¬λ¬ μ»΄ν¬λνΈκ° μ μ¬ν μν κ΄λ ¨ λ‘μ§μ μ¬μ©ν κ²½μ° κΈ°λ₯μ 곡μ ν μ μμ
-
state
κ°μ λΆλ³μ±μ΄ μμ΄ μν λ³κ²½μ λ΄μμ μΆμ ν μ μμ - 리λμλ μμ ν¨μλ‘ λ§λ€μ΄μΌ ν¨
- μ λ ₯ κ°μ΄ λμΌνλ©΄ μΆλ ₯ κ°λ λμΌ
- μΈλΆ κ°μ μν₯μ μ£Όκ±°λ λ°μΌλ©΄ μ λ¨
- 리λμλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ
μ μ μμ€μ μνλ₯Ό κ΄λ¦¬νλ λΌμ΄λΈλ¬λ¦¬κ°
Redux
function reducer(state, action){ ... }
const [state, dispatch] = useReducer(reducer, initialArg, init?);
-
reducer
:state
μaction
μ μΈμλ‘ λ°μ μλ‘μ΄state
λ₯Ό λ°ννλ ν¨μ-
state
: 리λμμ μ λ¬λλ μνκ° -
action
:dispatch
μ μ λ¬ν μΈμκ°μΌλ‘, μνν μμ μ μ’ λ₯μ νμν μΈμκ°μ ν¬ν¨ν κ°μ²΄
-
-
initialArg
: μ΄κΈ° μνλ‘ μ§μ ν κ° -
init
(μ ν):initialArg
λ₯Ό μΈμλ‘ λ°κ³ , 리ν΄ν κ°μ΄ μ΄κΈ° μνλ‘ μ§μ λλ ν¨μ
-
state
: μνκ°μ΄ μ μ₯λ getter -
dispatch
: μνκ°μ λ³κ²½νλ setter ν¨μ.dispatch
μ μ λ¬ν μΈμκ°μ΄reducer
μ λλ²μ§Έ μΈμκ°(action
)μΌλ‘ μ λ¬λ¨
-
useReducer
λ₯Ό μ¬μ©νλ©΄reducer
ν¨μμdispatch
μ‘μ μ μμ±ν΄μΌ νκΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘ μ½λ ν¬κΈ°κ°useState
λ₯Ό μ¬μ©ν λλ³΄λ€ λ§μμ§const TodoReducer = function(state, action) { // μν λ³κ²½ λ‘μ§ }; itemListDispatch({ type: 'TOGGLE', item: { _id }});
-
μ¬λ¬ μ΄λ²€νΈ νΈλ€λ¬κ° λΉμ·ν μν κ΄λ¦¬ λ‘μ§μ κ°μ§κ³ μλ€λ©΄
reducer
ν¨μμ 곡ν΅μΌλ‘ μμ±ν΄μ μ½λλ₯Ό μ€μΌ μ μμconst TodoReducer = function(state, action){ const index = state.findIndex(item => item._id === action.item._id); switch(action.type){ case 'TOGGLE': return produce(state, draft => { draft[index].done = !draft[index].done; }); default: case 'DELETE': return produce(state, draft => { draft.splice(index, 1); }); } };
- μν λ³κ²½ λ‘μ§μ΄ 볡μ‘νκ³ μ¬λ¬ μ΄λ²€νΈ νΈλ€λ¬μμ λΉμ·ν λ‘μ§μ μ¬μ©ν΄μΌ νλ€λ©΄,
useState
λ‘ μνλ₯Ό μ§μ κ΄λ¦¬ν기보λ€λuseReducer
μ μν λ³κ²½ λ‘μ§μ μ§μ€μν€κ³ μ»΄ν¬λνΈμ λΆλ¦¬νλ©΄ μ»΄ν¬λνΈλ₯Ό λ¨μνν μ μμ
-
useState
λ μν λ³κ²½ λμ€ μ€λ₯κ° λ°μνλ©΄ μ¬λ¬ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό νμΈν΄μΌ νμ§λ§,useReducer
λ μν λ³κ²½ λ‘μ§μ΄ ν κ³³μ μκΈ° λλ¬Έμ λλ²κΉ μ΄ νΈν¨
-
reducer
ν¨μλ μ»΄ν¬λνΈμ λ 립μ μΈ μμ ν¨μμ΄κΈ° λλ¬Έμ λ°λ‘ ν μ€νΈκ° κ°λ₯ν¨
- actionμ νμ μ λͺ ννκ² μ μ
π 03 useReducer - μν κ΄λ¦¬ λ‘μ§μ νκ³³μ
- π» Counter.tsx
- π» CounterReducer.ts
- μ»΄ν¬λνΈκ° λ€μ λ λλ§λλλΌλ κΈ°μ‘΄ μνκ°μ μ μ§νλ λ³μλ₯Ό μμ±
- ν¨μ λ΄λΆμ μ μνλ μ§μ λ³μλ μ»΄ν¬λνΈκ° λ€μ λ λλ§λλ©΄(ν¨μ μ¬νΈμΆ) κ°μ΄ μ΄κΈ°ν λ¨
-
useState
λ κ°μ΄ λ³κ²½λλ©΄ μ»΄ν¬λνΈκ° λ€μ λ λλ§λμ§λ§useRef
λ κ°μ΄ λ³κ²½λμ΄λ μ»΄ν¬λνΈκ° λ€μ λ λλ§λμ§ μμ - JSX νκ·Έμ
ref
μμ±μ μΆκ°νλ©΄ λΈλΌμ°μ DOM μ리먼νΈμ μ§μ μ κ·Ό κ°λ₯- ν¬μ»€μ€, λ―Έλμ΄ μ¬μ, μ λλ©μ΄μ
μ€ν λ±κ³Ό κ°μ μμ
μ
useRef
λ₯Ό μ¬μ©ν΄ λΈλΌμ°μ DOMμ μ§μ μ κ·Όνμ¬ μ μ΄ν΄μΌ ν¨
- ν¬μ»€μ€, λ―Έλμ΄ μ¬μ, μ λλ©μ΄μ
μ€ν λ±κ³Ό κ°μ μμ
μ
const ref = useRef(initialValue);
-
initialValue
: μ΄κΈ°κ°
-
current
λΌλ μνκ° λλ DOM μμκ° μλ μμ± νλκ° μ μλ κ°μ²΄
- value μμ±μΌλ‘ μνκ° μ§μ
- 리μ‘νΈμμ μ§μ μνκ΄λ¦¬λ₯Ό νλ μ μ΄ μ»΄ν¬λνΈλ₯Ό ꡬν
- input κ°μ΄ λ³κ²½λλ μ¦μ 리λ λλ§ λμ΄μΌ ν λ
- 리λ λλ§μ΄ μμ£Ό λλ―λ‘ μ€λ²ν€λ λ°μ
function App(){
const [msg, setMsg] = useState('');
return (
<>
<h1>01 useState - μν κ΄λ¦¬</h1>
<div>
<input type="text" value={ msg } onChange={ e => setMsg(e.target.value) } />
<br/>
<span>μ
λ ₯ λ©μΈμ§: { msg }</span>
</div>
</>
);
}
- defaultValue μμ±μΌλ‘ μ΄κΈ°κ° μ§μ
- λΈλΌμ°μ μμ μ λ ₯κ°μ κ΄λ¦¬νλ λΉμ μ΄ μ»΄ν¬λνΈλ₯Ό ꡬν
- input κ°μ΄ λ³κ²½ λμ΄λ 리λ λλ§ λ νμκ° μμλ
- 리λ λλ§μ΄ λμ§ μμΌλ―λ‘ μ±λ₯ μ΅μ ν
function Counter() {
const step = useRef(1);
return (
<div id="counter">
<input type="number" defaultValue={ step.current } onChange={ e => step.current = Number(e.target.value) } />
<Button color="red">-</Button>
<Button>0</Button>
<Button color="blue">+</Button>
<span>0</span>
</div>
);
}
π 04 useRef-κ°μ΄ μ μ§λλ λ°μ΄ν° κ΄λ¦¬, DOM μλ¦¬λ¨ΌνΈ μ°Έμ‘°
- π» Counter.tsx