여러 컴포넌트에 사용되는 state를 분리 통합하여 관리할 수 있게 하고 애플리케이션의 안정성을 높일 수 있는 라이브러리
Action은 state를 바꾸는 방식 | 액션객체를 가지고있고, 반드시 type필드가 있어야한다.
Action을 발생시키는것 | action 객체를 파라미터로 받는다.
변화를 일으키는 함수 | Action의 결과로 state를 어떤식으로 바꿀지 구체적으로 정의하는 부분
Reducer가 현재상태와 전달받은 action객체를 파라미터로 받아서 새로운 상태로 반환해준다
파라미터 외의 값을 의존하면안되고, 이전상태는 건드리지 않은 상태로 새로운 상태객체를 만들어 반환하는 순수함수여야한다.
프로젝트에 리덕스를 적용하기 위해 필요한 것으로 프로젝트에는 단 한개의 Store만 가지며 상태의 중앙저장소라고 할수있다.
Store안에는 Reducer와 내장함수 등이 포함되어있다 | dispatch와 subscribe 등도 스토어의 내장함수이다.
상태를 읽을때는 getState(), 상태를 바꿀 때는 dispatch()를 호출한다.
context API 기반으로 구현된 함수형 컴포넌트에서만 사용 가능한 페이스북에서 만든 라이브러이이다.
호환성이나 단순함을 위해선 React에 내장된 상태 관리 기능을 사용하는게 가장 바람직하다.
예를들을 Hooks나 Context API를 사용하여 상태 관리를 할 수 있는데, 그런 경우에 여러가지 한계가 존재한다.
Recoil에서 상태의 단위를 의미함 | 업데이트, 구독이 가능
atom이 업데이트되면 각각의 구독된 컴포넌트는 새로운 값을 반영해서 리렌더링된다.
Atoms는 리액트의 로컬state대신 사용할 수 있다.
동일한 atom이 여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다.
Atoms에는 고유한 키가 필요하고, 이 키는 전역적으로 고유해야 한다. | React state처럼 디폴트값도 가진다.
컴포넌트에서 atom을 읽고 쓸 때는 useRecoilState라는 훅을 사용해야한다. 이건 리액트의 useState와 비슷하나, 상태가 컴포넌트간에 공유될 수 있다는 점에서 차이가 있다. 아래 두 컴포넌트의 state는 공유된다.
Selector는 atoms나 다른 selectors를 입력으로 받는 순수 함수(pure function) 이다. 상위 atoms이나 selectors가 업데이트 될 경우 하위 selectors도 재 실행된다. 컴포넌트는 atom 뿐만 아니라 selectors를 구독할 수 있고, 구독하고 있는 selectors가 변경되면 구독한 컴포넌트도 리렌더링된다. Selectors는 상태를 기반으로 데이터를 계산하고 최소한의 상태 집합만 atoms에 저장하고, 파생 데이터는 selector에서 계산하면서 불필요한 상태를 만들어내지 않는다. 컴포넌트 관점에서 atoms와 selectors는 동일한 인터페이스이므로 대체 가능하다.
여기서 get속성은 계산될 함수를 의미하고 전달되는 get인자를 통해 atoms와 다른 selectors에 접근 가능하다. 여기서 접근하면 자동으로 종속 관계가 생성되어 참조했던 atoms나 selectors가 업데이트되면 이 함수도 재실행된다.
Selectors는 useRecoilValue()를 통해 조회 가능하다. useRecoilState와는 다르게 writable 하지 않고, 반환 값의 조회만 가능하다. 필요하다면 writable한 selector 작성도 가능하다.