기존에 보편적으로 사용되었던 MVC 패턴은 Model이 View를 반영하고 View가 Model을 변경하는 서로 간의 양방향 데이터 흐름으로 인해 각 Model에서 발생한 이벤트가 어떤 변화를 일으킬지에 대해 예측하기가 어렵다는 문제가 있었다.
그래서 facebook에서는 이러한 문제를 해결하기 위해 Flux 패턴을 만들었고 이로 인해 대규모 어플리케이션에서 보다 일관된 데이터 관리를 할 수 있게 되었다.
Action, Dispatch, Reducer, Store으로 구성된다.
<script>
// 액션의 네이밍을 상수로 선언
const CHANGE_NAME = 'CHANGE_NAME';
const changeName = (newName) => { type: CHANGE_NAME, payload: newName }
</script>
store.dispatch(actionChangeName(name));
입력창에 입력된 이름을 Dispatch()메서드를 사용해서 상태 변경을 트리거하는 모습
<script>
Form();
function Form() {
document.querySelector('div').innerHTML = `
<form>
<p><input type="text" name="name" placeholder="바꿀 이름을 입력해주세요."></p>
<p><button type="submit" value="수정"></p>
</form>
`;
}
</script>
<script>
const initialState = { name: 'who are you' };
const userReducer = (state = initialState, action) => {
switch(action.type) {
case CHANGE_NAME: {
return {
...state,
name: action.payload
}
}
default:
return state;
}
}
</script>
<script>
const store = Redux.createStore(userReducer);
</script>
여기는 바닐라 JS라서 store.getState() 메서드를 사용했는데 React에서 쓸 때는 useSelector 등의 hook이 있다.
function Title() {
const { name } = store.getState();
document.querySelector('h1').innerHTML = `
<span>${name}</span>
`;
}