Мой клиент недавно дал мне задание написать функцию, которая включает создание вкладок, подобных вкладкам Bootstrap. Клиентская часть такого проекта была построена с использованием React, и я изначально думал об использовании библиотеки react-tabs, но позже решил реализовать ее сам, так как это было очень простое требование, и я хотел иметь полный контроль над тем, как это работает. .
Цель этого сообщения в блоге - поделиться и объяснить код, который я создал для создания такой функциональности. Таким образом, вы получаете альтернативу, если в один прекрасный день вам понадобится создать аналогичный компонент, не добавляя еще одну зависимость к вашему проекту.
Суть
Я хотел создать очень гибкий компонент вкладок. Основная цель заключалась в том, чтобы разрешить отображение любого допустимого jsx
внутри вкладки. Я хотел, чтобы это выглядело примерно так:
Как видите, вкладка должна отображать любые допустимые jsx
. Это дает разработчику возможность передавать пользовательские props
для других функций, которые могут потребоваться в будущем.
Компонент <Tabs/>
Компонент <Tabs/>
хранит состояние и знает, какая вкладка отображается в данный момент. Он обрабатывает изменения, чтобы показать / скрыть другие вкладки. Наконец, это также дает разработчику возможность указать вкладку по умолчанию для рендеринга, когда она не выбрана.
Примечание. Ссылку на весь код с тестами и демонстрацию можно найти в конце этого сообщения в блоге.
Компонент <Tab/>
Компонент <Tab/>
- это компонент без состояния. Его цель - просто отобразить вкладку, подобную Bootstrap, позволить разработчику указать какой-либо собственный стиль и вызвать ее родительский элемент (компонент <Tabs/>
) при возникновении события onClick
.
Заключение
С очень небольшим количеством кода и большой гибкостью нам удалось реализовать простой компонент React <Tabs/>
. Суть с исходным кодом, необходимым для реализации обоих компонентов и их тестов, можно найти здесь, а демо - здесь.
Вы когда-нибудь реализовывали что-то подобное? Вы что-то сделали по-другому? Оставьте комментарий ниже и давайте учиться друг у друга :).