반응형
https://learnrecoil.com/video/intermediate-selectors
Intermediate Selectors - Free Recoil.js Course
We make use of an "intermediate selector" to control when the data fetching happens.
learnrecoil.com
아래와 같은 atomFamily가 있다고 하자.
해당 아톰은 드래그, 크기 조정 시마다 position이 변경된다.
export type ElementStyle = {
position: {top: number; left: number}
size: {width: number; height: number}
}
export type Element = {
style: ElementStyle
image?: {src: string; id: number}
}
export const defaultStyle = {
position: {top: 0, left: 0},
size: {width: 200, height: 200},
}
export const elementState = atomFamily<Element, number>({
key: 'element',
default: {
style: defaultStyle,
},
})
// 선택된 atom id를 기억
export const selectedElementState = atom<number | null>({
key: 'selectedElement',
default: null,
})
만약 해당 atom(Element)의 img.id 변경 시에만 상태틀 업데이트 하고 싶다면 어떻게 할까? (혹은 데이터 조회)
이를 위해 중간 Selector를 이용한다.
// 해당 상태는 elementState가 변경될 때마다 상태를 다시 계산하지만, 리턴하는 id는 변경되지 않을 수 있다.
const imageIdState = selector({
key: 'imageId',
get: ({get}) => {
const id = get(selectedElementState)
if (id == null) return
return get(elementState(id)).image?.id
},
})
// imageIdState가 변경되지 않으면 해당 아톰을 구독하는 컴포넌트는 호출되지 않는다.
const imageInfoState = selector({
key: 'imageInfo',
get: ({get}) => {
const imageId = get(imageIdState)
if (imageId == null) return
return callApi('image-details', {queryParams: {seed: imageId}})
},
})
반응형
'FrontEnd' 카테고리의 다른 글
[Recoil]Jotai의 구현으로 알아보는 atom 종속성 추적 (2) | 2022.05.15 |
---|---|
Recoil Pattern : Selector Composition (셀렉터 조합하기) (0) | 2022.05.15 |
Lean Recoil 강의 정리 : Async Data Fetching (비동기 데이터 가져오기) (0) | 2022.05.15 |
Lean Recoil 강의 정리 : Atom Families / Selector Families (0) | 2022.05.15 |
Lean Recoil 강의 정리 : Atoms And Selectors (0) | 2022.05.15 |