Flux는 사용자 입력을 기반으로 Action을 만들고 Action을 Dispatcher에 전달하여 Store(Model)의 데이터를 변경한 뒤 View에 반영하는 단방향의 흐름으로 애플리케이션을 만드는 아키텍처 스타일
switch
문으로 들어오는 Action 객체를 나누어 처리. 미리 정해둔 Action 객체의 type
을 구분해 미리 작성해둔 명령들을 수행.각 요소들은 단방향 흐름에 따라 순서대로 역할을 수행하고, View로부터 새로운 데이터 변경이 생기면 처음부터 다시 이 순서대로 실행. 이렇게 함으로써 예외 없이 데이터를 처리할 수 있음
// store
const initialState = {
number: 0
};
function reducer(state, action) {
switch (action.type) {
case 'ADD':
return {
number: state.number + 1
}
default:
return state;
}
}
// view
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState)
const onAdd = () => {
dispatch({type: 'ADD'})
}
return (
<div>
<h1>{state.number}</h1>
<button onClick={onAdd}>Add</button>
</div>
)
}
사람이 대화할 때 인터페이스 X
컴퓨터와 사람이 대화할 때 인터페이스 O
View : "User"가 볼 수 있는 화면.
Model : 앱의 유일한 상태와 데이터를 가지고 있는 불변 객체.
Intent : 앱의 상태를 변경하는 요청. (event)
siedEffect : 부수효과 (아직 정의를 못내리겠음)
특징
동작 방식
장점
코드
// Action (like reducer)
export const _INCREASE = action("_INCREASE")
export const _DECREASE = action("_DECREASE")
export const _RESET = action("_RESET")
// Model
export const store = createStore({count:0}, state => {
on(_INCREASE, (value) => state.count += value)
on(_DECREASE, (value) => state.count -= value)
on(_RESET, () => state.count = 0)
})
// Component
export const App = (props) => {
// Query
const count = SELECT(store.count)
// Intent
const onClick = () => dispatch(_INCREASE(+1))
// View
return <button onCLick={onClick}>{count}</button>
}
// Component1
const Component1 = (props) => {
const count = SELECT(store.count)
return <div>{count}</div>
}
// Component2
const Component2 = (props) => {
const onClick = () => dispatch(_INCREASE(+1))
return <>
<Component1/>
<button onCLick={onClick}>1 증가</button>
</>
}
intent를 통해 실행되고 결과는 event를 통해 전달
부수 효과를 실행함 (API 호출)
model에 새로운 입력값이 될 수 있고 다른 side effect를 발생 시킬수 있음