unstated로 react 해보기
react 해본 적 없는 사람이 이런 글 써도 되나;
참고: 아래 내용이 영 마음에 안 들어서 다시 써봤습니다.
시작은 유튜브에서 본 추천 동영상 이었습니다.
redux 대신 다른걸 쓴다고? unstated? 근데 뭔가 쉬워보이는데? 해서 알아보게 되었습니다.
Unstated
- 쉽게 설명하면.. 데이터와 뷰를 분리해서 자유롭게 결합시킬 수 있습니다.
- react v16 context API의 Provider, Consumer 개념을 사용
- ‘React components are designed to be very self-contained.’
-> 이런 리액트 컴포넌트의 state, render, 그리고 function을 분리합니다. - render는 Subscribe로,
state와 function은 Consumer로 표현합니다. - Subscribe는 동시에 여러 Consumer를 받을 수 있고,
Consumer는 동시에 여러 Subscribe에서 사용될 수 있습니다. - 이를 통해 컴포넌트간의 통신이 가능하고,
다른 방식의 개발이 가능합니다.
코드를 볼까요?
공홈에 있는게 약간 성에 안 차서 하나 만들어 봤습니다;
<Subscribe>
를 통해 위의 두 Add.js
가 서로 연결되었다고 눈치챌 수 있으면 좋겠습니다. 포인트는 #11과 #14인데요, AddContainer
의 함수를 호출할 때 UnitContainer
의 State
를 참고하고 있습니다. props
로 넘겨주는게 아니라요.. 이게 Unstated의 매력 같습니다.
엄밀하게 말하면 Global State Machine은 아니고, context API의 컴포넌트간의 통신을 응용해 view와 state, 그리고 function을 분리하고 자유롭게🥳 (하지만 간접적으로😢) 연결할 수 있다~ 인 것 같습니다. 코드를 조금 더 볼게요.
Unit 부분은 정말 별거 없죠? Unit의 state.unit
이 아까 Add
의 Subscribe
에서 사용된다~ 정도의 느낌입니다. 당연하지만, setState()
가 되면 Add
의 unit.state.unit
도 바뀌게 됩니다. react니까요!ㅎㅎ 쪼끔 더 봅시다.
아까 subscribe/Add
를 보셨다면 이거도 금방 이해 되실거에요. 마지막으로 Provider
의 모습을 보면 끝날 것 같습니다.
따로 미리 Container
객체를 준비해서 <Provider inject={[foo]}>
를 통해 주입시켜줄 수도 있고요, 특별히 만들지 않으면 Provider
내에서 알아서 Container
객체를 생성해서 이하 Subscribe
들과 같이 공유하게 됩니다. 그래서 위의 <ViewSubscribe />
, <AddSubscribe />
, 그리고 <UnitSubscribe />
들은 같은 state
와 function
을 서로 공유하며 사용하게 됩니다.
unstated는 redux의 대체재 라기보단.. 개발하는 방식 자체가 달라지게 될 것 같습니다. 어울리는 곳이 따로 있을 것 같아요. 읽어주셔서 감사합니다!
🙂🙂🙂