Данман Дэвидом
Реактивные крюки Были здесь на некоторое время, и есть много пакетов, рецептов и дискуссий, идущих примерно одинаково. Эта статья проходит аналогичный путь. Он объясняет два пользовательских реализации крючка, чтобы показать, насколько хорошо код может быть повторно используется. Могут быть библиотеки или гисты, которые выполняют точные (или, возможно, улучшенные) функциональные возможности, которые объясняют эту статью. Это всегда помогает написать код, специально для ваших нужд, код, о котором вы можете рассуждать.
Эта статья предполагает базовое понимание и знание реагирования и реактивными крючками. Если нет, вы можете прочитать документы и узнать больше о API React Cooks.
Настройка
Вместо того, чтобы быть раскрытым в конце, мы сначала сможем взглянуть на какую функциональность мы пытаемся построить. Живая версия того, что мы собираемся построить здесь: https://danedavid.github.io/use-focus Отказ
Приложение состоит из горизонтального списка компонентов реагирования, которые могут прокрутить. Каждый компонент может быть другим или то же самое (здесь используются два различных типа компонентов, только только показать, что код может быть использован повторно повторно повторно на компоненты). Одна вещь, которую они имеют общего: входное поле.
Наша цель : Всегда делайте элемент внутри Viewport «Active» элемент. Дайте сосредоточиться на поле ввода внутри этого компонента на протяжении прокрутки.
Мы можем управлять Активность Состояние внутри нашего корневого компонента, который хранит идентификатор, соответствующий элементу, активен в любой момент времени. Код для корневого компонента тогда:
Компоненты Numberputmelement и TextInPutmelement очень похожие компоненты. Первый рендеринг Вход [Type = "номер"] Отказ Хотя последний оказывает поле ввода текста. Это единственное значение.
UseactiveNInternerseCt
Первый крюк, который будет добавлен, это тот, который будет установлен активным элементом после того, как элемент достигнет просмотра просмотра. То есть крючок UseactiveNInternerseCt должен позвонить Сдарный элемент передается от родителя, как только элемент на протяжении просмотра. Есть известный браузер API для одинаков: окно. ПересечениеОбсеревер Отказ Если вы не знакомы, я предлагаю вам прочитать больше об этом здесь Отказ
Крючок должен в основном создать экземпляр ПересечениеОбсеревер и слушать, когда это придет в поле зрения. Мы дали ID = интерсектор Атрибут для внешней Div Отказ Это Div будет действовать как корневой элемент для пересечений. Элемент должен слушать, когда он полностью (или не менее 95%) внутри этого корневого элемента. Мы используем Useffect Крючок для регистрации экземпляра InterSefientBserver. И пройти функцию обратного вызова, которая вызывает Сдарный элемент на пересечении (в нашем случае, когда коэффициент пересечения превышает 95%). Код для UseactiveNInternerseCt дано ниже:
Крючок делает то, что он должен делать: регистрируйте наблюдатель Экземпляр, который слушает пересечение с корневым элементом, приведен в вариантах как Document.Queryselector («# InterserseCtor») и вызвать Сдарный элемент Если элемент пересекает. ElementRef Реакция Ref указывает на элемент контейнера DOM.
Как Сдарный элемент знать который Элемент – это активный? Мы передам его из компонента, когда мы называем этот крюк:
useActiveOnIntersect(() => setActiveElement(id), containerEl);
Здесь ID это значение для установки как Активность в Приложение составная часть. Контейнер Реакция Ref ссылается на контейнер поле ввода.
UseFocusonactive.
Теперь, когда мы уверены что Активность Всегда указывает на элемент, который находится внутри просмотра (элемент корневого элемента) в любой момент времени, нам необходимо убедиться, что входное поле внутри компонента получает фокус. Опять же, мы используем Useffect Крюк для фокусировки поля ввода после его активности, и функция очистки размывает поле ввода после того, как он больше не является активным элементом. Код кратко и простой:
inputref это реагирование, указывая на поле ввода, и Активный это активное состояние содержащего элемента.
Заключение
Код для компонента, который использует оба этих крючка, приведен ниже:
Мы использовали УСЭРЕФ Крюк для создания Refs для контейнера и элементов ввода и передайте его на их соответствующие крючки. Функциональность может быть даже написана внутри одного крючка. Причина написания двух отдельных крючков заключается в том, что каждый представляет собой другой эффект.
Полный код можно найти здесь: https://github.com/danedavid/use-focus Отказ
Надеюсь, эта статья была полезной и короткой! Продолжай и напишите свой собственный пользовательский реактивный крючок сейчас!
Если вам понравилась статья, нажмите кнопку CLAP ниже. Вы также можете следовать за мной на среднем или Twitter для большего!!
Счастливое кодирование …!
Оригинал: “https://www.freecodecamp.org/news/how-to-manage-viewport-intersection-and-input-focus-with-custom-react-hooks-1ec3403a8d80/”