Pull to refresh

Comments 6

На мой взгляд, useMemoCompare — чеховское ружье, которое обязательно выстрелит в ногу рано или поздно. Лучше сразу правильно сравнивать и кешировать объекты, например, в реселекте. Ну и пример, конечно, слегка высосан из пальца.


В хуке useLocalStorage (он, к слову, в чуть более навороченном виде лежит тут https://github.com/streamich/react-use/blob/master/src/useLocalStorage.ts ) мне не хватило подписки на изменения значения в другой вкладке с использованием window.addEventListener('storage', ...).


Ну и тот же useAuth слишком специфичный для конкретного использования. А так отличный перевод, спасибо!

useRequireAuth — роутингом занимается слой view, мда.
useAuth и большинство хуков из статьи — снова бизнес логика в слое логики компонентов, т.е. фактически в слое view.

Сначала эту логику некоторые писали в миксинах, потом в HOC, теперь в хуках. Уверены, что через годик что-нибудь новое не появится или api хуков не изменится и не придется переписывать? Если эта же логика потребуется в проекте на angular или на vue или в реакт проекте на классах, заново будете ее реализовывать?
Плюс код в хуке выполняется при каждом рендере компонента. Отличный способ усложнить логику и немного ухудшить производительность.

Hook-и сродни HoC-ам. Т.е. легко могут быть отдельным слоем, а не View. И довольно легко тестируются. И очень легко группируются и всячески разделяются. Т.е. в какой-то степени писать бизнес-логику в кастомных хуках — вполне ок. Хотя конечно это сугубо зависит от того как вы это делаете и какая у вас архитектура приложения. Наш опыт сугубо позитивный. Сложные компоненты используют сложные хуки, которые выстраиваются в целые деревья подхуков, которые очень плотно переиспользуются ибо DRY.


// SomeComponent.tsx
type Props = { ... };
const SomeComponent: ({ ... }: Props) => {
  const { ... } = useSomeComponent({ ...props... });
  return <div>{ ... }</div>;
}

// useSomeComponent.tsx
type Arg = { ... };
export default function useSomeComponent({ ... }: Arg) {
   ...
   return { ... };
};

// SomeComponent.test.tsx
import useSomeComponent from './useSomeComponent';
declare('SomeComponent', () => { ... });
...

Мне кажется сейчас уже почти везде при написании SPA пришли к выводу, что несмотря на то, что бизнес-логика должна быть сепарирована от чисто view слоя, она, тем не менее, очень плотно от этого слоя зависит. Т.е. view часть выступает своего рода заказчиком, а какая-нибудь Model / ViewModel + Model / HoC / Redux / CustomHook / etc выступает слоем где лежит то откуда мы берём данные, как мы их меняем, какой жизненный цикл у этих данных есть. И вот как это всё называется дело десятое.


Кому-то по душе писать это полностью отдельно от своих Vue и React-ов, кому-то, раз уже затащили эти штуки в проект, хочется получать от них profit в ввиду упрощённой интеграции и взаимосвязи.

А мне кажется разработчики увидели, что с новой, более удобной фичей, чем предыдущие, открылись новые возможности, вот и пробуют сделать через нее все подряд.
Ладно, сейчас рано делать выводы. Через несколько лет видно будет, когда разработчики понаступают на различные грабли и сформируют best practices.
Думал, «о, интересно, люди такие же хуки изобретают как и мы или другие». Код в статье не типизирован, даже для хуков типы не приведены => разбираться в 5 раз дольше => «ладно, как-нибудь потом».
На сайте для некоторых хуков приведен TS-код. Я в TS не силен, поэтому ограничился React.
Sign up to leave a comment.

Articles