레두가 누구야?너의 상태를 처리해라

작성자Kristofer Selbekk
React의 주 관리 도서관은 매우 비싸다.뇌두반동모포설령 가장 경험이 많은 개발자에게 하나를 선택하는 것도 어려운 임무일지라도, 당신은 이 선택을 완전히 뛰어넘을 생각을 해 본 적이 있습니까?
일부 응용 프로그램은 고급 상태 관리를 필요로 한다.정말!수백 개의 다른 변수를 처리하고, 이 변수는 다른 상태 값의 변화에 따라 변화할 때, 반충 같은 라이브러리를 사용할 때, 일은 더욱 쉽게 확장될 것이다.하지만, 나는 당신의 프로그램이 그것을 필요로 하지 않는다고 모험하고 싶습니다.
본고에서 저는 규모적으로라도 상태를 함께 놓고 간단하게 처리하는 방법을 소개하겠습니다.

상태 처리의 기초


세계의 모든 Reduxes가 있으면, 우리는 React 비행선이 자신의 상태 관리 시스템을 가지고 있다는 것을 쉽게 잊어버릴 수 있다!그것의 모양을 보여 주세요.
const [count, setCount] = React.useState(0);
시간에 따라 어떤 종류의 값을 처리해야 한다면,useState 갈고리에 대한 호출을 추가할 수 있습니다.이것은 매번 하나의 값을 바꾸는 간단한 값에 매우 효과적이다.

대신 기억.


어떤 데이터는 심지어 상태에 존재할 필요가 없다!예를 들면 다음과 같습니다.
const [filter, setFilter] = React.useState('none');
const [filteredItems, setFilteredItems] = React.useState(props.items);

function onFilterChange(newFilter) {
  setFilter(newFilter);
  setFilteredItems(
    props.items.filter(item => item.someProperty === newFilter)
  );
}
여기서 필터 항목의 상태를 유지할 진정한 이유가 없습니다!반대로 우리는 필터를 기억할 수 있고 필터 (또는 필터할 항목) 가 바뀔 때만 새로운 필터 항목을 다시 계산할 수 있다.
const [filter, setFilter] = React.useState('none');
const filteredItems = React.useMemo(() => 
  items.filter(item => item.someProperty === newFilter), 
  [props.items, filter]
);
function onFilterChange(newFilter) {
  setFilter(newFilter);
}

감속기 사용


만약 당신이 더 높은 상태를 가지고 있다면, 당신도 더욱 유연한useReducer 연결을 사용할 수 있습니다!
const [request, dispatch] = React.useReducer((state, action) => {
  switch (action.type) {
    case 'loading': return { state: 'loading' };
    case 'success: return { state: 'success', data: action.data };
    case 'error': return { state: 'error', error: action.error };
    case 'reset': return { state: 'idle' };
    default: throw new Error(`Unknown action ${action.type}`);
  }
}, { state: 'idle' });

몇 개 useState 를 호출해서 같은 동작을 수행할 수 있지만, 몇 개의 변경 사항이 동시에 발생할 때, 나는 useReducer 를 사용하는 경향이 있습니다.다행히도 이런 상황은 자주 발생하지 않는다.

구성 요소 간 상태 공유


현재, 만약 여러 곳에서 이러한 상태를 필요로 한다면, 첫 번째 공공 조상 구성 요소로 끌어올려야 합니다.
만약 그들 사이에 구성 요소 층이 너무 많지 않다면, 값과 업데이트 프로그램 함수를 도구로 간단하게 전달할 수 있습니다.
const CommonAncestor = () => {
  const [filter, setFilter] = React.useState('none');
  return (
    <div>
      <FilterSelector filter={filter} setFilter={setFilter} />
      <FilteredItems filter={filter} />
    </div>
  );
};

적당한 때에 상하문을 사용하다.


첫 번째 공공 조상과 구성 요소 사이에 여러 층이 있거나, 다시 사용할 수 있는 일반 구성 요소를 만들고 있지만, 도구를 직접 사용할 수 없다면, 상하문을 만들어야 합니다.
상하문을 만들어야 할 경우 Provider 구성 요소를 추가하고 상하문의 갈고리를 사용해야 합니다.
const FilterContext = React.createContext();
const FilterProvider = (props) => {
  const [filter, setFilter] = React.useState('none');
  return (
    <FilterContext.Provider value={{ filter, setFilter }} {...props} />
  );
};
const useFilter = () => {
  const context = React.useContext(FilterContext);
  if (!context) {
    throw new Error("Wrap your component in a FilterProvider");
  }
  return context;
};
이제 공용 조상 어셈블리를 다음과 같이 변경할 수 있습니다.
const CommonAncestor = () => {
  return (
    <FilterProvider>
      <FilterSelector />
      <FilteredItems />
    </FilterProvider>
  );
};
필터와 관련된 모든 코드를 FilterProvider로 이동하고 FilterSelectorFilteredItems에 전달된 모든 도구를 삭제했습니다.이제 다음 두 가지는 다음과 같습니다.
const FilterSelector = () => {
  const { filter, setFilter } = useFilter();
  return (...);
};

const FilteredItems = () => {
  const { filter } = useFilter();
  const items = getItemsSomehow();
  const filteredItems = React.useMemo(
    () => items.filter(item => item.someProperty === filter), 
    [filter, items]
  );

  return (...)
};

오픈 소스 세션 재방송


생산 환경에서 웹 응용 프로그램을 디버깅하는 것은 어렵고 시간도 소모될 수 있다.OpenReplay는 풀스토리, 로그 로켓과 Hotjar의 소스 대체품이다.사용자가 한 모든 것을 감시하고 재방송할 수 있으며, 모든 문제에 대한 응용 프로그램의 표현을 보여 줍니다.
이것은 브라우저의 검사기를 열고 사용자의 어깨를 보는 것과 같다.
OpenReplay는 현재 유일하게 사용할 수 있는 오픈 소스 대안입니다.

즐거움 디버깅, 현대 전단 팀-Start monitoring your web app for free.

대다수 주는 전 세계적인 것이 아니다


나는 많은 사람들이 야외에서 저지른 실수 중 하나가 그들이 진정으로 필요로 하지 않을 때 많은 글로벌 환경을 만들었다는 것을 보았다.이것은 범하기 쉬운 잘못이다. 특히 반복적인 사고방식에 익숙해지면.하지만 이건 좀 짜증나. 결국 이렇게 큰 소굴이 생길 거야. 내가 여기서 말해줄게. 너는 그것을 필요로 하지 않을 수도 있어.

서버 캐시가 상태가 아닙니다.


내가 보기에 서버로부터 데이터를 저장하거나 캐시하는 것은 상태가 아니다.캐시입니다.따라서, 이 모든 것을 처리하기 위해 어떤 데이터로 갈고리 (예를 들어usesWR이나reactquery) 를 가져와야 한다고 생각합니다.물론 당신도 직접 쓸 수 있습니다. 아주 간단한 판본은 다음과 같습니다.
const cache = {};
const useFetch = (key, fetcher) => {
  const [request, dispatch] = React.useReducer(
    requestReducerFromEarlier, 
    { state: 'idle' },
  );
  const goFetch = async () => {
    try {
      dispatch({ type: 'loading' });
      const result = await fetcher(key);
      dispatch({ type: 'success', data: result });
      cache[key] = result;
    } catch (e) {
      dispatch({ type: 'error', error: e });
    }
  };
  if (cache[key]) {
    goFetch();
    return { data: cache[key], ...request };
  }
  return request;
}
이것 (또는 더 나은 라이브러리를 동시에 만들 수 있는 것) 은 한 번의 돌격에서 대부분의 전역 상하문을 삭제하고 데이터 수요를 사용하는 곳과 함께 놓을 수 있습니다.

할 수 있을 때 같이 찾아요.


여기까지만 말하고 모든 주를 사용지와 함께 놓아 주십시오.가능한 한 전역 상하문 사용을 피하다.이 작업을 수행할 때 일부 기능을 삭제할 때 관련 상태를 모두 삭제해야 합니다.그것은 찾기도 쉽고 마법도 이해하기도 어렵다.

요컨대


가능한 한 자신의 상태를 잘 처리하다.이렇게, 이것이 결론이다.
또한 배우기 어려운 상태 관리 라이브러리를 기본적으로 사용하지 말고 React에서 제공하는 기존 도구를 사용하십시오.

좋은 웹페이지 즐겨찾기