-
Notifications
You must be signed in to change notification settings - Fork 131
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(Button,Link): add component prop #3521
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
f17fa3c
to
917c30a
Compare
917c30a
to
1a324f7
Compare
Funkicide
reviewed
Sep 30, 2024
Funkicide
reviewed
Sep 30, 2024
Funkicide
reviewed
Sep 30, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Остались ещё скриншоты старых тем у теста 'Button As Link Icon Color'.
Funkicide
approved these changes
Sep 30, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Этот ПР - версия #3421 для 5.x.
Проблема
В
Button
нет возможности внутри отрендерить<a />
с соответствующими пропами:href
,rel
и т.д.В
Link
нет публичной возможности отрендерить<button />
или<NavLink />
изreact-router-dom
.Решение
Добавлен проп
component
вButton
иLink
. Проп принимает значения:a
|button
|React.ElementType
;Стали возможны следующие сценарии использования:
Изменения по сравнению с оригинальным ПР для ревьюера
Документация
После добавления пропов
component
и доработки типов Button и Link в доке перестали отображаться пропы нативныхbutton
иa
, которые принимаются в них по умолчанию. Решить эту проблему не удалось. Обошел добавлением соответствующих примеров в доку. Доку скоро обновим, возможно эта проблема пропадет.Также, перенес другие примеры с
component
повыше, чтобы были на виду, т.к. кейс должен быть популярным.globalClasses.customComponent
Кажется, был добавлен лишний глобальный класс в Button. Убрал, прогнал тесты, ничего не сломалось.
Проп component в defaultProps
Добавил, чтобы можно было делать type guard'ы, например,
isAnchorProps
в Link. Это помогает безопаснее работать с пропами внутри компонентов.Переименования
Константы
*_DEFAULT_ELEMENT
переименовал в*_DEFAULT_COMPONENT
. А файлreact-ref.d.ts
переименовал вpolymorphic-component.d.ts
. Так вроде больше соответствует действительности.Проп as в Button
Удалил его, так как он более не был нужен и дублировал проп
component
. Вместо него для use="link" по назначению заиспользовалcomponent
, создав более минималистичный компонент SpanComponent, чем использовался там раньше. Однако в этом месте вывод типов в Link почему-то не сработал и пришлось прокинуть дженерик.Логика handleClick в Link
Убрал
preventDefault
при клике на ссылку с пустымhref
. По-моему, это нужно было раньше только потому, что без указанияhref
нативная ссылка внутри была неактивной из-за чего компонент выглядел неправильно. Поэтому вhref
добавлялась пустая строка. Но клик по такой ссылке вызывал смену урла, что было нежелательным для Link, в который вообще ничего не передали. Поэтому делали делалиpreventDefault
. Однако это все больше неактуально, т.к. новые стили работают и для неактивной ссылки и для любого другого компонента.Однако, ссылки без
href
считаются неa11y
в тестах не находятся через getByRole('link'). Поэтому в тестах его пришлось проставить.Проброс пропов в Root
Убрал явный проброс
linkOnlyProps
в Link, т.к. он все равно случится через передачу rest.По этой же причине убрал манипуляции с aria-аттрибутами, role и обработчиками событий в Button. Также в нем пришлось переделать оборачивание в CommonWrapper таким образом, чтобы в Root через rest не попали пропы, которые должны попасть на обертку (это className, style и все data-пропы). Так уже было сделано в Link, например. Но Button раньше не принимал всех пропов HTMLButtonElement, поэтому в нем такие переделки понадобились только сейчас. Подробнее тут.
outline-обводка в Link
z-index: -1
, который был на обводке ранее, иногда прятал ее за другие элементы на странице. Переверстал, чтобы такого не происходило. Из-за этого вроде незначительно обновились скриншоты<Select use="link" />
в хроме.Депрекейт
Решил пока закомментировать, потому что сперва захотелось проверить их взаимозаменяемость с
<Link component="button" />
и обсудить решение в отдельной статье.Ломающие изменения
Link
убранpreventDefault
в случае пустогоhref
.Button
по умолчанию начал принимать все пропы нативного<button />
Ссылки
Задача: IF-1733.
Обновленная песочница для тестов.
Чек-лист перед запросом ревью
Добавлены тесты на все изменения
✅ unit-тесты для логики
✅ скриншоты для верстки и кросс-браузерности
⬜ нерелевантно
Добавлена (обновлена) документация
✅ styleguidist для пропов и примеров использования компонентов
⬜ jsdoc для утилит и хелперов
⬜ комментарии для неочевидных мест в коде
⬜ прочие инструкции (
README.md
,contributing.md
и др.)⬜ нерелевантно
Изменения корректно типизированы
✅ без использования
any
(см. PR2856
)⬜ нерелевантно
Прочее
✅ все тесты и линтеры на CI проходят
✅ в коде нет лишних изменений
✅ заголовок PR кратко и доступно отражает суть изменений (он попадет в changelog)