Recoil의 selector를 어떻게 활용할 수 있을까? - somedaycode/airbnb GitHub Wiki

목표: Recoil Selector 활용

HOW?

  • 사용자의 숙소 조건 검색에 따른 상태를 selector 함수를 넘겨주어 조건이 변경 될 때마다 서버에 데이터를 요청하고 받아왔습니다.

관련코드

import { atom, selector } from 'recoil';

// 숙소 검색 결과를 위해 필요한 관련 atom 상태들
import { reservationString } from './date';
import { queryPrice } from './price';
import { queryGuest } from './guests';

// default value
const mapSizeCoords = atom({
  key: 'mapSizeCoords',
  default: {
    ne_latitude: 37.57992249446141,
    ne_longitude: 127.05564290690467,
    sw_latitude: 37.55468331278949,
    sw_longitude: 126.92407277442867,
  },
});

const queryLocation = selector({
  key: 'queryLocation',
  get: ({ get }) => {
    const coordsMap = get(mapSizeCoords);
    const { ne_latitude, ne_longitude, sw_latitude, sw_longitude } = coordsMap;
    return `ne_lat=${ne_latitude}&ne_lng=${ne_longitude}&sw_lat=${sw_latitude}&sw_lng=${sw_longitude}`;
  },
});

// atom을 조합하고 가공하여 fetch 요청
const accomodationList = selector({
  key: 'accomodationList',
  get: async ({ get }) => {
    const reservation = get(reservationString);
    const price = get(queryPrice);
    const guest = get(queryGuest);
    const boundary = get(queryLocation);
    const query = `${reservation}&${price}&${guest}&${boundary}`;
    const res = await fetch(
      `http://3.35.178.32:8080/accomodation/search?${query}`
    );
    const data = await res.json();
    return data;
  },
});