프론트 상태 관리 뭐로 할까하다가 useState 처럼 쓰이는 것 같은 recoil 발견

function App() {
  return (
    <RecoilRoot>
      <CharacterCounter />
    </RecoilRoot>
  );
}

대충 감싸주고

const textState = atom({
  key: 'textState', // unique ID (with respect to other atoms/selectors)
  default: '', // default value (aka initial value)
});

state key하고 기본 값 넣어주면

function TextInput() {
  const [text, setText] = useRecoilState(textState);

  const onChange = (event) => {
    setText(event.target.value);
  };

  return (
    <div>
      <input type="text" value={text} onChange={onChange} />
      <br />
      Echo: {text}
    </div>
  );

바로 사용 가능, 아무 생각없이 쓰기에 러닝커브 제로에 가깝다.

const charCountState = selector({
  key: 'charCountState', // unique ID (with respect to other atoms/selectors)
  get: ({get}) => {
    const text = get(textState);

    return text.length;
  },
});

selector 도 있는데

const filteredTodoListState = selector({
  key: 'FilteredTodoList',
  get: ({get}) => {
    const filter = get(todoListFilterState);
    const list = get(todoListState);

    switch (filter) {
      case 'Show Completed':
        return list.filter((item) => item.isComplete);
      case 'Show Uncompleted':
        return list.filter((item) => !item.isComplete);
      default:
        return list;
    }
  },
});

이런 식으로 작성하면

function TodoList() {
  // changed from todoListState to filteredTodoListState
  const todoList = useRecoilValue(filteredTodoListState);

  return (
    <>
      <TodoListStats />
      <TodoListFilters />
      <TodoItemCreator />

      {todoList.map((todoItem) => (
        <TodoItem item={todoItem} key={todoItem.id} />
      ))}
    </>
  );
}

 

이렇게 쓸 수도 있다.

state 2개로 하나의 결과를 내고 있는데 2개 중 하나만 변경돼도 selector는 다시 실행된다.

selector에서 상태 값 여러개를 요리조리 잘 만지면 component를 가독성 좋게 작성할 수 있어보인다.

 

참고 자료

https://recoiljs.org/ko/docs/introduction/getting-started/#selector

 

Recoil 시작하기 | Recoil

React 애플리케이션 생성하기

recoiljs.org

https://recoiljs.org/docs/basic-tutorial/selectors/

 

Selectors | Recoil

A selector represents a piece of derived state. You can think of derived state as the output of passing state to a pure function that derives a new value from the said state.

recoiljs.org

 

'Front-End' 카테고리의 다른 글

채팅 - Array.prototype.reduce()  (0) 2023.08.22
React hook 최적화  (0) 2023.08.22
FireFox, Chrome - input, textarea  (0) 2023.08.22
webpack ts react boilerplate  (0) 2023.08.18
JS Custom Elements, 사용자 정의 태그  (0) 2023.08.09