State
는 컴포넌트 안에서 관리 되고 시간이 지나면서 바뀌는 동적인 데이터다.
Flux 구조란?
단방향 데이터 흐름을 가지는 구조이다.
상태의전이현상
(뷰와 모델 사이의 데이터 변경이 연결된 수많은 곳으로 따라 변경되는 현상)을 없애주고, 데이터를 예측가능
하게 해준다.데이터의 흐름은 dispatcher => store => view 순서 이며
view 에서 입력이 발생하면 action을 통해서 dispatcher로 향하게 됩니다.
Dispatcher
Action Creator
Action
action의 구성
type
: 어떤 행위 인가?payload
: 그 행위로부터 넘겨 받을 값? 이전의 상태를 새로운 상태로 바꾸는 행위이다.
Store
View Controller 와 View
준비과정
스토어(store)가 디스패처(dispatcher)에게
"액션 생성자(the action creator)한테 액션 메시지가 오면 알려줘!"
라고 말해둔다.
그 다음 컨트롤러 뷰(the controller view)는 스토어(store)에게
"현재 보여줘야하는 최신 상태(state)가 뭐야?"
라고 묻는다.
그럼 스토어(store)는 컨트롤러 뷰(the controller view)에게
"이게 최신 상태(state)야!"
라는 답과 함께 상태(state)를 전해주고,
상태를 전달받은 컨트롤러 뷰(the controller view)는 이 상태를 렌더링 하기 위해 모든 자식 뷰(the view)에게
"이게 현재 최신 상태(state) 니까 rendering 해!"
라고 말하며 상태를 넘겨준다.
마지막으로 컨트롤러 뷰(the controller view)는 스토어(store)에게
"상태(state)가 바뀌면 또 알려줘야 돼!"
라고 다시 부탁한다.
데이터 흐름(data flow)
사용자의 입력이 들어온다.
뷰(view)는 액션 생성자(the action creator) 에게
"사용자한테 입력 들어왔어! 액션 준비해!"
라고 말하며,
사용자에게 들어온 액션을 액션 생성자(the action creator) 에게 넘겨준다.
액션 생성자(the action creator)는 액션을 포맷에 맞게 가공 한 다음,
디스패처(dispatcher)에게 넘겨준다.
디스패처(dispatcher)는 들어온 액션의 순서에 따라 액션을 스토어(store)로 보낸다.
각 스토어(store)는 모든 액션을 받게 되지만 필요한 액션 만을 골라 상태(state)를 필요에 맞게 변경한다.
상태(state) 변경이 완료되면 스토어(store)는 자신을 구독(subscribe) 하고 있는 컨트롤러 뷰(the controller view)에게 그 사실을 알린다.
연락을 받은 컨트롤러 뷰(the controller view)들은 스토어(store)에게 변경된 상태를 요청하고, 스토어(store)는 상태(state)를 컨트롤러 뷰(the controller view)에게 전달한다.
스토어(store)에게 새로운 상태(state)를 전달받은 컨트롤러 뷰(the controller view)는 자신 아래의 모든 뷰(the view)에게 새로운 상태(state)에 맞게 렌더링(re-rendering) 하라고 알린다.
export const context명 = React.createContext(초기값);
import { context명 } from './context';
const App = () => {
return (
<context명.Provider value={ 값 }>
...
</context명.Provider>
)
}
하위 컴포넌트에서 App 컴포넌트에서 생성한 Context object를 import한 후,
useContext를 이용하여 value를 가져옴
<context명.Consumer>
로 감싸줌import { context명 } from './context';
// useContext 사용x
const ColorBox = () => {
return (
<context명.Consumer>
...내용
</context명.Consumer>
)
}
혹은
// useContext 사용o
const ColorBox = () => {
const 담을곳 = useContext(context명);
return (
<>
...내용
</>
)
}