front-end/Recoil

[recoil] selector

Ash_O 2023. 7. 23. 16:39

순수함수

입력으로 주어진 인자에만 의존하고 side effect가 없는 함수를 말한다.

side effect : 함수 외부의 상태를 변경하거나 다른 외부 환경에 영향을 미치는 동작

 

순수함수는 입력과 반환값에만 의존하고, 같은 입력에 대해서 항상 같은 출력을 반환한다.

 

selector

 

ref : https://coleredfearn.medium.com/atomos-a-new-recoil-visualization-tool-powered-by-react-flow-6e0404a16b9a

selector는 atom이나 다른 seletor를 입력으로 받아들이는 순수함수다

상위 atom이나 selector가 업데이트되면 하위 selector 함수도 다시 실행된다

컴포넌트는 selector를 구독할 수 있고 selector가 변경되면 컴포넌트도 리렌더링된다.

 

selector는 상태를 기반으로 파생시키는 상태(데이터)를 계산하는 데에 사용된다.

최소한의 상태 집합만 atom에 저장하고, 다른 모든 파생 데이터는 selector에 명시한 함수를 통해
계산하면 쓸모없는 상태의 보존을 방지할 수 있다.

 

selector는 어떤 컴포넌트가 자신을 필요로 하는지, 자신은 어떤 상태에 의존하는지 추적한다

 

컴포넌트의 관점에서 보면 selector와 atom은 동일한 인터페이스를 가져서 서로 대체할 수 있다.

function selector<T>({
  key: string,

  get: ({
    get: GetRecoilValue
  }) => T | Promise<T> | RecoilValue<T>,

  set?: (
    {
      get: GetRecoilValue,
      set: SetRecoilState,
      reset: ResetRecoilState,
    },
    newValue: T | DefaultValue,
  ) => void,

  dangerouslyAllowMutability?: boolean,
})

type ValueOrUpdater<T> =
  | T
  | DefaultValue
  | ((prevValue: T) => T | DefaultValue);
type GetRecoilValue = <T>(RecoilValue<T>) => T;
type SetRecoilState = <T>(RecoilState<T>, ValueOrUpdater<T>) => void;
type ResetRecoilState = <T>(RecoilState<T>) => void;
const fontSizeState = atom({
	key : 'fontSizeState',
	default : 14,
});

const fontSizeLabelState = selector({
	key: 'fontSizeLabelState',
	get: ({get}) => {
		const fontSize = get(fontSizeState);
		const unit = 'px';

		return `${fontSize}${unit}`'
	},
});

// 이 예제에서는 selector는 fontSizeState atom에 의존성을 가진다.
// selector는 fontSizeState를 입력으로 사용하고 형식화된 글꼴 크기 문자열을 반환하는 순수함수로 동작한다.

 

get

여기서 get 프로퍼티는 파생된 상태의 값을 평가하는 함수이다.

반환값으로 값을 직접 반환하거나, 비동기 Promise, atom, selector를 반환할 수 있다.

get 프로퍼티의 매개변수로 get 프로퍼티를 포함하는 객체를 전달한다.

 

get 프로퍼티 인자를 통해서 통해서 다른 atom이나 selector에 접근할 때 사용하는 함수다.

이 함수로 다른 atom이나 selector에 접근하게 되면 자동으로 해당 selector의 의존성 배열에 추가된다.

그래서 selector의 의존성 배열의 요소가 변경되면 selector가 다시 평가된다.

 

set

이 속성이 설정되면 selector는 쓰기 가능한(writable) 상태를 반환한다.

첫번째 매개변수로 콜백 객체와 새로운 입력이 전달됨

selector 를 재설정할 경우 새로운 입력값은 T 타입의 값이나 defaultValue 타입의 객체일 수 있다.

콜백 객체에는 다음이 포함된다

  • get
    다른 atom이나 selector에서 값을 찾는데 사용되는 함수다.
    이 함수는 atom이나 selector를 구독하진 않는다.
  • set
    upstream Recoil 상태의 값을 설정할 때 사용되는 함수다.
    매개변수 : Recoil State, ValueOrUpdater (새로운 값)

 

dangerouslyAllowMutability

객체를 변경하는 것을 허용하도록 설정하는 옵션

Recoil은 기본적으로 selector나 atom의 결과 값을 변경할 때 객체를 얼리고 변경이 발생하는지 감지하는 등의 보안 체크를 수행한다.

이러면 불변성을 보장하면서 예기치 않은 상태 변경을 방지한다.

 

근데 가끔 불변성 체크를 해제하고 변경을 허용시키는 것이 유용할 수 있는데, 이때 이 옵션을 이용하면 된다고 한다.

그러나 일반적인 경우에 Recoil이 제공하는 불변성 보장 기능을 활용하는 것이 좋다고 한다.

 

 

다음 포스팅 내용

selector 예제

recoil의 비동기 데이터 처리 : https://recoiljs.org/docs/guides/asynchronous-data-queries


출처

https://recoiljs.org/ko/docs/api-reference/core/selector

https://coleredfearn.medium.com/atomos-a-new-recoil-visualization-tool-powered-by-react-flow-6e0404a16b9a