@skbkontur/react-props2attrs
v0.1.3
Published
Translate react-props to attributes associated html-element
Downloads
785
Maintainers
Keywords
Readme
react-props2attrs
Транслирует пропы реакт-компонентов в атрибуты ассоциированных html-элементов.
Ассоциированный элемент, в который транслируются пропы - это первый HTMLElement, найденный внутри компонента. Пакет работает только с 3-мя (из ~24) типами WorkTag: ClassComponent, FunctionComponent и HostComponent(div, span, table etc.). Остальные типы игнорируются.
Установка
Установка с npm:
npm i @skbkontur/react-props2attrsУстановка с yarn:
yarn add @skbkontur/react-props2attrsПодключение
Основан на пакете @skbkontur/react-sorge. Поэтому подключение должно происходить до первого подключения пакета react-dom в приложении:
// entry.js
import '@skbkontur/react-props2attrs';
import ReactDOM from 'react-dom';
...Фильтр
Для управление пропами, которые необходимо транслировать, используйте хелпер setFilter(filter: FilterType).
type FilterType = (fiber: Fiber) => string[] | null;Установленный фильтр должен возвращать либо массив имён пропов, либо null, для игнорирования фильтра.
Имя компонента игнорирует фильтр.
import { setFilter } from '@skbkontur/react-props2attrs';
setFilter((fiber) => {
// Пропускаем только контролы из пакета @skbkontur/react-ui
if (typeof fiber.type?.__KONTUR_REACT_UI__ === 'string') {
return null;
}
return [];
});Примеры трансляции разных типов
Для наглядности представим, что в приложении есть такие компоненты:
const Foo = () => <span>Foo</span>;
const Bar = () => <Foo hello="world" />;
<Bar data-tid="Bar" />;Тогда их ассоциированные html-элементы будут выглядеть так:
<span data-comp-name="Bar Foo" data-prop-hello="world" data-testid="Bar" data-tid="Bar">
Foo
</span>Обратите внимание на проп
data-tid. Он транслирован в атрибут без приставкиprop-. Также его значение продублировано в атрибутdata-testid. Это дефолтное название атрибута для методаgetByTestId()в библиотеке Testing Library.
Примеры трансляции всех специальных пропов:
| prop name | prop value | | attr value | attr name |
| ---------------- | --------------------------------- | --- | -------------------------------- | ---------------------------- |
| children | ~~не поддерживается~~ | ➜ | ~~не поддерживается~~ | |
| style | { paddingLeft: 20, color: 'red' } | ➜ | {"paddingLeft":20,"color":"red"} | data-prop-style |
| class | colored | ➜ | colored | data-prop-classname |
| key | value | ➜ | value | data-key |
| data-tid | MyControl | ➜ | MyControl | data-tid and data-testid |
| *Имя компонента | ButtonCover | ➜ | *ButtonCover Button | data-comp-name |
* — Особенным образом транслируется имя компонента в атрибут data-comp-name.В этом атрибуте собираются имена всех react компонентов, с которыми был ассоциирован элемент. Имя компонента транслируется всегда, независимо от настроек фильтра.
Примеры трансляции обычных пропов:
| prop name (type) | prop value | | attr value | attr name |
| ---------------- | ---------- | --- | ---------- | ------------------------ |
| string | str | ➜ | str | data-prop-string |
| number | 123 | ➜ | 123 | data-prop-number |
| array | ['a', 'b'] | ➜ | ["a","b"] | data-prop-array |
| object | { a: 'b' } | ➜ | {"a":"b"} | data-prop-object |
| func | () => {} | ➜ | true | data-prop-func |
| boolean | false | ➜ | false | data-prop-boolean |
| empty_string | | ➜ | undefined | data-prop-empty_string |
| null | null | ➜ | undefined | data-prop-null |
| undefined | undefined | ➜ | undefined | data-prop-undefined |
