Создайте радиогруппу с помощью React, styled-components и Framer Motion

В части 1 и части 2 мы рассмотрели базовую структуру, правила доступности, обработку выбранного состояния, события щелчка и нажатия клавиш и многое другое. Если вы не читали их, я бы посоветовал сделать это, прежде чем продолжить здесь.

Давайте быстро взглянем на то место, где мы оставили часть 2. Вы можете найти код здесь.

Вы можете видеть, что я создал styled.tsx файл, в который я поместил все свои стилизованные компоненты. Я рассматриваю этот файл как файл CSS. Все остальное осталось прежним.

8. Анимируйте с помощью Framer Motion

Framer Motion на данный момент, на мой взгляд, лучшая библиотека анимации для React. Он является преемником Pose и был создан тем же автором (Мэтт Перри), а также несколькими превосходными инженерами Framer.

Приступим к анимации. Мы собираемся анимировать Circle границу, когда выбран параметр, и наоборот.

Во-первых, мы должны определить variants анимации. * Примечание: вы можете получить тип Variant из библиотеки framer-motion.

Затем мы должны изменить базу компонента Circle на motion.div вместо обычного элемента div. Я выделил важные строки:

И мы должны удалить ранее выбранную стратегию из компонента Option:

Теперь мы можем изменить логику, в которой Circle оформляется как выбранный. Я извлек логику isSelected и затем передал ее aria-checked. Выделены важные строки:

В приведенном выше примере мы говорим компоненту Circle (который имеет тип motion.div на этом этапе), что он может использовать указанные нами варианты (начальный и выбранный).

Мы говорим ему, что он должен запустить компонент с вариантом initial, и если он выбран, он должен использовать вариант selected, если нет, то вариант initial. На мой взгляд, это довольно простой API, который работает.

9. Контролируемый и неконтролируемый

Если вы проверите наш компонент, он находится в таком странном состоянии, когда мы контролируем selectedId изнутри, не передавая его. Это не было ни контролируемым, ни неконтролируемым.

Это было сделано так, чтобы мы могли сосредоточиться на логике внутри компонента и не беспокоиться о том, как мы его вызываем. Давайте сконцентрируемся на последнем шаге этой серии, чтобы правильно его контролировать.

Во-первых, давайте добавим дополнительные реквизиты:

Тогда давайте назовем это:

Теперь давайте удалим состояние для selectedId, потому что мы собираемся получить его из переданного значения из props.

И мы также должны изменить функцию setSelectedId на onChange, потому что теперь мы ожидаем, что пользователь компонента установит значение извне.

Заключение

Остается рабочий компонент. Вы можете изменить его столько, сколько захотите, в соответствии с вашими потребностями.

Вы можете найти готовый код здесь.

Как всегда, спасибо за чтение. Если я что-то пропустил или что-то не так, дайте мне знать. Я сделаю все возможное, чтобы эта страница постоянно обновлялась.