Практика использования React Hooks в Ant Financial

React.js

компоненты

Компоненты — это повторное использование UI + логики, но возможность повторного использования логики равна 0.
Проект React состоит из бесчисленного множества компонентов, больших и малых. В мире React компоненты являются гражданами первого класса. И наша обычная основа для разделения компонентов — это не что иное, как максимальное повторное использование кода.
Компоненты — это повторное использование UI + логики, вы не можете разделить UI и логику. такие как АнтдКаскад Выбор каскадаКомпоненты со встроенным стилем и логикой каскадного выбора эквивалентны черному ящику, когда пользователи их используют, просто используйте их. Но есть вполне реальная проблема: когда стиль компонента не соответствует нашим потребностям, нам нужно заново реализовать компонент с 0 и переписать UI+логику, даже если логика действительно та же. Возможность логического повторного использования компонента равна 0. Я могу вспомнить ужасный факт, что большую часть логики одних и тех же компонентов в сообществе можно использовать повторно, но есть различия в стиле, но совместное использование логики не очень популярно в сообществе.

HOC и Render Props

HOC и Render Props могут извлекать логику и повторно использовать ее, но это не делает повторное использование логики популярным.
Конечно, то, что я сказал выше, нельзя использовать повторно, немного преувеличено React предоставляет HOC и Render Props для решения проблемы повторного использования логики. Например, логика отслеживания положения мыши ниже, мы можем повторно использовать ее через Render Props.
<Mouse>
  (position)=> <OurComponent />
</Mouse>
Аналогичная логика включает в себя мониторинг размера окна, прослушивание прокрутки и т. д. Но обычно мы используем Render Props для инкапсуляции логики, less и другие проекты для совместного использования логики. Зачем? Подумайте о том, сколько логического повторного использования, вы знаете, как ужасно.
<WindowSize>
  (size)=> (
        <Mouse>
        (position)=> <OurComponent size={size} mouse={position}/>
    </Mouse>
    )
</WindowSize> 

Код вложенного ада невыносим, ​​и у HOC тоже есть подобные проблемы, что может быть важной причиной непопулярности повторного использования логики.

React Hooks

React Hooks очень хорошо решает проблему логического повторного использования, и в то же время в сообществе родился ряд хороших библиотек React Hooks.
React Hooks стали блокбастером React в этом году и вызвали много шума в сообществе. С появлением хуков мы можем легко инкапсулировать логику с помощью пользовательских хуков, и совместное использование логики также стало тенденцией. Например, в приведенном выше примере мы можемreact-useОчень удобно в реализации.
import {useMouse, useWindowSize, useScroll} from 'react-use'

function Demo(){
  const mousePosition = useMouse();
  const windowSize = useWindowSize();
}

react-use — отличная библиотека хуков в сообществе, она содержит много общей базовой логики и необходима для ежедневной разработки. Но достаточно ли просто реагировать на использование? Очевидно нет. Хуки в реактивном использовании имеют относительно небольшую степень детализации, подобно библиотекам инструментов.
В продуктах среднего уровня существует много специфической логики сцены, которую необходимо комбинировать с несколькими хуками или настраивать конкретную логику. Внутри Ant много мидл-энд приложений, разработчики накопили разные полезные кастомные хуки в своих проектах, мы вынули эту полезную логику и создали@umijs/hooks, который позиционируется как библиотека хуков для промежуточных сценариев.

@umijs/hooks

@umijs/hooksЭто библиотека хуков для сценариев приложений средней стадии, которая инкапсулирует логику общих сценариев средней стадии и делает разработку средней стадии очень простой. @umijs/hooks был реализован во многих продуктах Ant Financial с хорошей репутацией и очевидными улучшениями. Конечно, вы можете не поверить, и ваши слова не имеют под собой никаких оснований, поэтому используйте примеры, чтобы говорить.

useAntdTable

При разработке среднего и Тайваня в первую очередь следует учитывать страницу таблицы, мы обычно используем AntdTableКомпоненты для сборки, но логики еще много, без нее не обойтись.
  1. страница, управление размером страницы
  2. Когда страница, pageSize изменяется, снова сделайте асинхронный запрос
  3. При изменении условий фильтра сброс страницы и повторный запрос данных
  4. Загрузка обработки асинхронных запросов
  5. Обработка состояния гонки для асинхронных запросов
  6. Отбрасывать текущие асинхронные запросы, когда компонент выгружается (многие люди обычно не обрабатывают это, а в некоторых случаях выдают предупреждение)
Приведенная выше логика, с которой нам приходится иметь дело почти на всех страницах таблиц, страшно даже подумать. useAntdTable инкапсулирует как минимум 6 вышеуказанных логик,Одна строка кода заключает в себе всю логику, разработка страницы списка еще никогда не была такой простой.
const { tableProps } = useAntdTable(asyncFn);
const columns = [];
return (
  <Table columns={columns} rowKey="id" {...tableProps} />
)

useSearch

Общие сценарии асинхронного поиска, с которыми нам обычно приходится иметь дело:
  1. Стабилизатор
  2. Загрузка обработки асинхронных запросов
  3. Контроль времени запроса для асинхронных запросов
  4. Отменить логику, такую ​​как защита от сотрясения и асинхронные запросы, когда компонент выгружен.
Теперь все так просто:
const { data, loading, onChange } = useSearch(asyncFn);

<Select
  onSearch={onChange}
  loading={loading}
>
  {data.map((item)=><Option />)}
</Select>

Больше пользовательских хуков

Конечно, у нас есть еще много пользовательских хуков, которые значительно улучшают производительность, как вы можете себе представить.Можно ли реализовать асинхронную функцию loadmore без написания строки логики?? (useLoadMore)



Можете ли вы представить себе форму, которая может динамически добавлять, удалять и сортировать, не написав ни строчки логики?(useDynamicList)


Для различных общих сценариев всем не нужно писать логику, всем не нужно писать логику. ты сможешь@umijs/hooksОткройте для себя больше полезных хуков.

Основные крючки

В настоящее время react-use должна быть лучшей библиотекой Hooks, но мы постепенно отказываемся от нее. Самая большая причина в том, что обновление версии происходит слишком быстро. Можете ли вы представить, что я использовал v9 в своем проекте несколько месяцев назад, и сейчас v13?? Я уже не знаю, как обновить.
Чтобы решить эту проблему, @umijs/hooks также внедрил базовые хуки, которые часто используются в повседневной работе, в том числе обычно используемые useAsync, useDebounce, useBoolean, useMouse и т. д., которые все еще разрабатываются. Может быть, достаточно просто использовать крючки umi.

напиши в конце

Крючки Umi упрощают разработку в Китае и Тайване, я могу себе представить, что в ближайшем будущем Китаю и Тайваню не нужно будет писать ни строчки логики, к чему мы и стремимся.
В то же время, я надеюсь, что больше людей примет участие, вы можете предложить хорошие идеи, а также внести свой вклад в ежедневные пакеты крючков, чтобы сделать крючки уми более распространенными и принести пользу большему количеству людей.
Если вы чувствуете себя хорошо, пошевелите пальцем,заказать звезду, поощряйте нас, большое спасибо!