-
Notifications
You must be signed in to change notification settings - Fork 5
Redux
Yancy edited this page Nov 24, 2020
·
9 revisions
μ₯μ
- μ»΄ν¬λνΈ μ½λλ‘ λΆν° μν κ΄λ¦¬ μ½λλ₯Ό λΆλ¦¬ν μ μλ€.
- μλ² λ λλ§ μ λ°μ΄ν° μ λ¬μ΄ κ°νΈνλ€.
- λ‘컬 μ€ν 리μ§μ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λΆλ¬μ€λ μ½λλ₯Ό μ½κ² μμ±ν μ μλ€.
- κ°μ μν―κ°μ λ€μμ μ»΄ν¬λνΈμμ νμλ‘ ν λ μ’λ€.
- λΆλͺ¨ μ»΄ν¬λνΈμμ κΉμ κ³³μμ μλ μμ μ»΄ν¬λνΈμ μν―κ°μ μ λ¬ ν λ μ’λ€
- μλ¦Όμ°½κ³Ό κ°μ μ μ μ»΄ν¬λνΈμ μν―κ°μ κ΄λ¦¬ν λ μ’λ€.
- νμ΄μ§κ° μ νλμ΄λ λ°μ΄ν°λ μ΄μ μμ΄μΌ ν λ μ’λ€.
μμΉ
- μ 체 μν―κ°μ νλμ κ°μ²΄μ μ μ₯νλ€
- μν―κ°μ λΆλ³ κ°μ²΄λ€
- μν―κ°μ μμ ν¨μμ μν΄μλ§ λ³κ²½λμ΄μΌ νλ€.
ꡬμ±
- μ‘μ
- λ―Έλ€μ¨μ΄
- 리λμ
- μ€ν μ΄
- type μμ±κ°μ κ°μ§ js κ°μ²΄.
- action κ°μ²΄λ₯Ό dispatch λ©μλμ λ£μ΄μ νΈμΆνλ©΄ 리λμ€λ μν―κ°μ λ³κ²½νκΈ° μν΄ μ κ·Έλ¦Ό μ²λΌ μννλ€.
store.dispatch({ type: 'ADD', title: 'νμ΄ν μΆκ°ν λ΄μ©', priority:'high'})- 리λμκ° μ‘μ μ μ²λ¦¬νκΈ° μ μ μ€νλλ ν¨μλ€.
- λλ²κΉ λͺ©μ μΌλ‘ μν―κ° λ³κ²½ μ λ‘κ·Έλ₯Ό μΆλ ₯νκ±°λ, 리λμμμ λ°μν μμΈλ₯Ό μλ²λ‘ μ μ‘νλ λ±μ λͺ©μ μΌλ‘ νμ© νλ€.
const middleware = store => next => action => next(action)- 리λμ€μ μν―κ°μ κ°μ§λ κ°μ²΄λ€.
- μ‘μ μ λ°μμ μ€ν μ΄μ dispatch λ©μλλ‘ μμλλ€
- μ€ν μ΄λ μ‘μ μ΄ λ°μνλ©΄ λ―Έλ€μ¨μ΄ ν¨μλ₯Ό μ€ννκ³ , 리λμλ₯Ό μ€νν΄μ μν―κ°μ μλ‘μ΄ κ°μΌλ‘ λ³κ²½νλ€.
const INITIAL_STATE = { value: 0};
const reducer = createReducer(INITIAL_STATE, {
INCREMENT: state => (state.value +=1),
});
const store = createStore(reducer);- 리λμ μμμ λΉλκΈ°λ₯Ό νκ² λλ©΄ 3λ² μμΉμΈ 'μν―κ°μ μμ ν¨μμ μν΄μλ§ λ³κ²½λμ΄μΌ νλ€.' μλ°°λλ€. κ·Έλμ middlewareμμ μ²λ¦¬ νλλ° μ΄λ ν¨ν€μ§λ₯Ό μ΄λ€.
- redux-thunk, redux-observable, redux-saga
μΆμ²: μ€μ 리μ‘νΈ νλ‘κ·Έλλ°, μ΄μ¬μΉ, μΈμ¬μ΄νΈ(2020), pg 249~308
- 리μ‘νΈ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬
- μ»΄ν¬λνΈμ μν μ λ°μ΄νΈ κ΄λ ¨ λ‘μ§μ λ€λ₯Έ νμΌλ‘ λΆλ¦¬μμΌ ν¨μ¨μ μΈ κ΄λ¦¬ κ°λ₯
- μ μ μνλ₯Ό κ΄λ¦¬ν λ ν¨κ³Όμ (Context APIλ₯Ό ν΅ν΄μλ κ°λ₯)
- νλ‘μ νΈμ κ·λͺ¨κ° ν΄ κ²½μ° λ¦¬λμ€ > Context API
-
μ½λμ μ μ§ λ³΄μμ± λμ¬μ£Όκ³ μμ ν¨μ¨μ κ·Ήλνν΄μ£ΌκΈ° λλ¬Έ
ex) TODO
-
-
μνμ μ΄λ ν λ³νκ° νμνλ©΄ μ‘μ (action)μ΄ λ°μ
-
νλμ κ°μ²΄λ‘ ννλλ€
-
νμ
{ type: 'ADD_TODO' }
-
μ‘μ κ°μ²΄λ type νλλ₯Ό λ°λμ κ°μ§λ€
- type β μ‘μ μ μ΄λ¦μ΄λΌκ³ μκ°νλ©΄ λλ€
- ex)
{ type: 'ADD_TODO', data: { id: 1, text: '곡λΆνκΈ°' } } { type: 'CHANGE_INPUT', text: 'μλ νμΈμ' }
- μ‘μ κ°μ²΄λ₯Ό λ§λ€μ΄ μ£Όλ ν¨μ
const addTodo = (data) => ({
type: 'ADD_TODO',
data
}) - λ³νλ₯Ό μΌμΌμΌμΌ ν λ, μ§μ μ‘μ κ°μ²΄λ₯Ό λ§λ€κΈ°λ³΄λ€ ν¨μλ‘ λ§λ€μ΄μ κ΄λ¦¬
- λ³νλ₯Ό μΌμΌν€λ ν¨μ
- μ‘μ μ λ§λ€μ΄μ λ°μμν€λ©΄ 리λμκ° νμ¬ μνμ μ λ¬λ°μ μ‘μ κ°μ²΄λ₯Ό μΈμλ‘ λ°μ μ΄
- μΈμλ‘ λμ΄μ¨ λ κ°μ μ°Έκ³ νμ¬ μλ‘μ΄ μνλ₯Ό λ§λ€μ΄μ λ°ν
const initialState = {
counter: 1
};
const reducer(state = initialState, action) {
switch(action.type) {
case INCREMENT:
return {
counter: state.counter + 1
};
default:
return state;
}
}- ν κ°μ νλ‘μ νΈλ λ¨ νλμ μ€ν μ΄λ₯Ό κ°μ§λ€
- μ€ν μ΄ μμλ νμ¬ μ ν리μΌμ΄μ
μν&리λμ+ λͺ κ°μ§ μ€μνλ΄μ₯ ν¨μ- μ€ν μ΄μ λ΄μ₯ν¨μ
- λμ€ν¨μΉ(dispatch)
- μ‘μ μ λ°μμν€λ κ²
dispatch(action)- λμ€ν¨μΉ νΈμΆ β μ€ν μ΄λ 리λμ ν¨μλ₯Ό μ€νμμΌμ μλ‘μ΄ μν λ§λ λ€
- ꡬλ
(subscribe)
- 리μ€λ ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ£μ΄μ νΈμΆν΄μ£Όλ©΄, 리μ€λ ν¨μκ° μ‘μ μ΄ λμ€ν¨μΉ λ λ (μνκ° μ λ°μ΄νΈ λ λ) νΈμΆλλ€.
- λμ€ν¨μΉ(dispatch)
- μ€ν μ΄μ λ΄μ₯ν¨μ
- λ¨μΌ μ€ν μ΄
- 1 app = 1 store
- λ€μ€ μ€ν μ΄κ° λΆκ°λ₯νμ§λ μλ€
- μν κ΄λ¦¬κ° 볡μ‘ν΄μ§ μ μμΌλ―λ‘ κΆμ₯ X
- μ½κΈ° μ μ© μν
- μνλ₯Ό μ λ°μ΄νΈ ν λ κΈ°μ‘΄μ κ°μ²΄ 건λλ¦¬μ§ μκ³ μλ‘μ΄ κ°μ²΄ μμ±
- λΆλ³μ± μ§μΌμ£ΌκΈ° μν΄ spread μ°μ°μ or immerμ κ°μ λΆλ³μ± λΌμ΄λΈλ¬λ¦¬ μ¬μ©
- 리λμ€μμλ λ΄λΆμ μΌλ‘ λ°μ΄ν°κ° λ³κ²½λλ κ²μ κ°μ§νκΈ° μν΄ μμ λΉκ΅κ²μ¬λ₯Ό νλ€
- 리λμλ μμν ν¨μ
- λ³νλ₯Ό μΌμΌν€λ 리λμ ν¨μλ μμ ν¨μμ¬μΌ νλ€.
- 리λμ ν¨μλ μ΄μ μνμ μ‘μ κ°μ²΄λ₯Ό μΈμλ‘ λ°λλ€
- νλΌλ―Έν° μΈμ κ°μ μμ‘΄νλ©΄ μλλ€
- μ΄μ μνλ 건λλ¦¬μ§ μκ³ , λ³νλ₯Ό μ€ μλ‘μ΄ μν κ°μ²΄λ₯Ό λ§λ€μ΄ λ°ννλ€
- λκ°μ νλΌλ―Έν°λ‘ νΈμΆλ 리λμ ν¨μλ κ°μ κ²°κ³Ό κ°μ λ°νν΄μΌ νλ€
- 리λμ ν¨μ λ΄λΆμμ λλ€κ° λ§λ€κΈ°, Date ν¨μ μ¬μ©νκΈ°, λ€νΈμν¬ μμ²νκΈ° X
- λ³νλ₯Ό μΌμΌν€λ 리λμ ν¨μλ μμ ν¨μμ¬μΌ νλ€.
리μ‘νΈ νλ‘μ νΈμμ 리λμ€λ₯Ό μ¬μ©ν λ κ°μ₯ λ§μ΄ μ¬μ©νλ ν¨ν΄μ νλ μ ν
μ΄μ
λ μ»΄ν¬λνΈμ 컨ν
μ΄λ μ»΄ν¬λνΈλ₯Ό λΆλ¦¬νλ κ².
- νλ μ ν
μ΄μ
λ μ»΄ν¬λνΈ
- μν κ΄λ¦¬ X
- propsλ₯Ό λ°μμμ νλ©΄μ UIλ₯Ό 보μ¬μ£ΌκΈ°λ§ νλ μ»΄ν¬λνΈ
- 컨ν
μ΄λ μ»΄ν¬λνΈ
- 리λμ€μ μ°λλμ΄ μλ μ»΄ν¬λνΈλ‘
- 리λμ€λ‘λΆν° μνλ₯Ό λ°μμ€κΈ°λ, 리λμ€ μ€ν μ΄μ μ‘μ μ λμ€ν¨μΉ νκΈ°λ νλ€.
μ₯μ
- μ½λμ μ¬μ¬μ©μ±
- κ΄μ¬μ¬μ λΆλ¦¬κ° μ΄λ£¨μ΄μ Έ UIλ₯Ό μμ±ν λ μ’ λ μ§μ€ν μ μλ€.

- UIμ κ΄λ ¨λ νλ μ ν μ΄μ λ μ»΄ν¬λνΈ β src/components
- 리λμ€μ μ°λλ 컨ν μ΄λ μ»΄ν¬λνΈ β src/containers
- Redux κ°λ°μ λꡬ
- ν¬λ‘¬ νμ₯ νλ‘κ·Έλ¨μΌλ‘ μ€μΉνμ μ¬μ©κ°λ₯
- ν¨ν€μ§λ₯Ό μ€μΉνμ¬ μ μ©νλ κ² μΆμ²
- yarn add redux-devtools-extension
import React from "react";
import ReactDOM from "react-dom";
import { createStore } from "redux";
import { Provider } from "react-redux";
import { composeWithDevTools } from "redux-devtools-extension";
import App from "./App";
import rootReducer from "./modules";
const store = createStore(rootReducer, composeWithDevTools());
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById("root")
);
μΆμ²: 리μ‘νΈλ₯Ό λ€λ£¨λ κΈ°μ (velopertλ)