일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 컬러구성
- rebase
- CSS
- pull
- 가상회선교환
- 비동기처리
- list
- equalityFn
- 리액트를 다루는 기술
- javascript
- php문법
- createPortal
- async
- redux
- 자동반영
- 리사이클러뷰
- await
- react
- 리액트
- merge
- 웹
- Git
- hot Reloading
- list.map
- Kotlin
- 리덕스
- useCallback
- 공부
- typescript
- useState
- Today
- Total
공부블로그
Recoil 상태 관리 라이브러리 본문
Atoms = Recoil의 상태
atom이 업데이트되면 각각의 구독된 컴포넌트는 새로운 값을 반영하여 다시 렌더링된다.
동일한 atom이 여러 컴포넌트에서 사용되는 경우 모든 컴포넌트는 상태를 공유한다.
선언법 : const '원하는 상태 이름' = atom({
key : '보통은 상태 이름과 동일',
default : '초기값 like useState의 괄호안의값'
})
Selector = 파생된 상태
파생된 상태는 다른 데이터에 의존하는 동적인 데이터를 만들 수 있기 때문에 강력한 개념이다
get으로 가져온 atom을 가공해서 리턴해준다.
선언법 : const '원하는 상태 이름' = selector({
key : '보통은 상태 이름과 동일',
get : ({get}) => {
const filter = get(의존성을 갖는 상태)
switch(filter) {
case 'show completed':
...
}
}
})
<중요 함수들>
● useRecoilState(state) = useState와 비슷, 모든 컴포넌트에서 불러와서 사용할 수 있다는 점만 다름
//state = atom 혹은 쓰기가능한 selector(set 함수가 있는)
● useRecoilValue(state) = 읽기만 할 때 많이 사용
//state = atom 혹은 selector
● useSetRecoilState = Recoil 상태값을 업데이트하기 위한 setter 함수를 리턴해주면 현재값에서 어떻게 변경할 지 작성할 수 있다.
쓰기만 할 때 많이 사용
//state = atom 혹은 쓰기가능한 selector(set 함수가 있는)
Todo 예제 (코드는 Recoil 자습서에 있다^^)
첫번째 : 아이템 생성 및 보여주기
1. 투두리스트를 관리하는 상태를 만들어줌 = todoListState = atom
2. useRecoilValue로 가져온 상태값( todoListState )을 <TodoItem /> 컴포넌트의 인자로 뿌려줌
3. 아이템 추가 컴포넌트에서는 useSetRecoilState로 [현재 상태값, setter] 튜플을 받아서 setter로 todoListState값을 업데이트
( 아이템 변경, 삭제, 완료 토글 )
두번째 : 필터에 따라 아이템 보여주기
4. 선택한 필터에 맞는 리스트를 보여주기 위해 filter를 관리하는 상태를 만들어줌 = filterState = atom
5. filter라는 상태에서 파생된 상태, 즉 필터에 맞는 리스트를 반환하기 위해 selector를 만들어줌
= filteredTodoListState = 읽기 가능한 selector
6. 필터와 투두리스트에 의존성을 가져야하므로 selector의 get 함수를 통해 두가지의 상태값을 받아와서 switch문을 작성한다. 리턴값은 RecoilValueReadOnly
6. 리스트를 뿌려주는 컴포넌트에서 useRecoilValue로 selector상태를 가져와서 뿌려주면 처음에는 ( todoListState )atom을 그대로 보여준 것과 달리 한번 가공된 ( filteredTodoListState )selector상태가 보이게 된다.
( get 함수만 제공되면 Selector는 읽기만 가능한 RecoilValueReadOnly 객체를 반환하고 set 함수 또한 제공되면 Selector는 쓰기 가능한 RecoilState 객체를 반환한다. )
세번째 : 리스트 통계 만들기
7. 투두리스트 상태를 가져와서 필요한 값들만 뽑아서 보여주기 위해 상태에서 파생된 상태인 selector를 만든다 = todoListStatusState
8. 의존성은 투두리스트에 가지므로 get 함수로 가져오고 계산한 통계값들을 selector의 리턴값으로 반환한다.
9. 통계를 보여주는 컴포넌트에서 useRecoilValue( todoListStatusState )로 상태값을 가져와서 보여준다.
+ 마지막은 굳이 왜 selector를 써야할까 생각했는데, 그냥 useRecoilState로 받아와서 뿌려보려고 하니까 첫번째 문제로 undefined에러가 나서 물음표 함수를 써야했고, 두번째로 각각의 요소들을 계산하는 함수를 따로 작성해서 보여주는 게 번거롭다는 생각이 들었다.
잘 생각해보면 왜 페이스북이 만들었는지 알 정도로 반응이 빠르다
맨위에서 상태를 관리하고 바로바로 적용되는 느낌이라 페이스북처럼 하위컴포넌트의 이벤트가 상위의 많은 컴포넌트에 적용되어야할 때 유용할 것 같다. 특정 게시물의 댓글을 달았을 때 몇번째 댓글인지 등등..
'리액트 > 리액트 공부' 카테고리의 다른 글
Props를 useState의 초기값으로 넣었을 때의 문제 (0) | 2022.12.20 |
---|---|
리덕스 미들웨어 redux-thunk (0) | 2022.09.19 |
리덕스 (with typesafe-actions) (1) | 2022.09.19 |
리액트 진짜 초급 강의 (0) | 2022.04.14 |
리액트 Router DOM 사용하기 (0) | 2021.08.01 |