alex4answ
@alex4answ

Пользовательские хуки или HOC, когда что использовать?

Добрый день, есть куча компонентов с похожим функционалом:
const CategoryPage = (props) => {
  const [data, setData] = useState(null);
  const { url, params: { category } } = useRouteMatch(); // #1
  
  useEffect(() => {
    CategoryService.get(params.category) // #2
    .then(res => setData(res));
  }, [category]);

  return <PageComponent data={data} />;
}


#1 - category, url параметр который будет для каждого компонент-страницы разный, например для компонента ProductPage, не category, а product
#2 - Сервис для работы с API тоже для каждой страницы свой

Встал вопрос, выделить этот функционал для переиспользования, сначала я решил сделать это с помощью HOC, примерно вот так:
withPageData (HOC)

const withPageData = (Component, selectData, routeParam) => {
  return (props) => {
    const [data, setData] = useState(null);
    const { url, params } = useRouteMatch();

    useEffect(() => {
      selectData(params[routeParam])
      .then(res => setData(res));
    }, [url]);
    
    return <Component data={data} {...props} />;
  };
};

Примерно так это должно выглядеть


Но тут я вспомнил, что можно создавать пользовательские хуки, для подобных целей.
usePageData (hook)

const usePageData = (selectData, routeParam) => {
    const [data, setData] = useState(null);
    const { url, params } = useRouteMatch();

    useEffect(() => {
      selectData(params[routeParam])
      .then(res => setData(res));
    }, [url]);
  
    return data;
  }



И вот передо мной встал вопрос:
В каких случаях использовать HOC, а в каких пользовательские хуки?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
В каких случаях использовать HOC, а в каких пользовательские хуки?

Если вы перешли на разработку с использованием хуков и хотите единообразия в коде - то всегда хуки. HOC не нужен вообще.

Если вам нравится/хочется запилить HOC и некоторая каша в коде вас не смущает - делайте HOC.

В плане функционала и возможностей они взаимозаменяемы.
С точки зрения чистоты кода конечно при переходе на хуки от HOC надо отказаться - это просто лишний концепт в приложении.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@luzianin999
Классовый компонент => HOC, функциональный => хук
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы