Pull to refresh

Comments 25

И нет, это не производительность браузера при поиске селекторов. Так никто не делает

Я так делаю. Многие годы. Из недостатков — никаких linter-ов, которые будут гарантировать что этот аттрибут присутствует в стилях. Что не сделал опечатку. Можно конечно самому написать, но всё как-то некогда было.


Ещё из недостатков — проброс таких аттрибутов ниже по React древу в качестве props. Я имею ввиду типизация этого добра на уровне TS… мягко говоря хромает.


Напишите в комментариях, что вы думаете по поводу такого подхода?

В общем и целом думаю об этом хорошо. Посему и использую. Сильно упрощает код.

Все верно. И я так использовал во времена, когда прямой доступ к DOM был поведением по умолчанию, а Virtual DOM еще не популяризировали.

Свойство HTMLElement.dataset вызывало чувства красоты, удобства и каноничности.

Я был удивлен, когда в React и JSX не оказалось инструмента работы с этим API. Было бы здорово иметь dataset наряду с state и props

JSX не оказалось инструмента работы ...

Да в нём вообще почти ничего не оказалось. Ни поддержки протокола итерации, ни условий\вветвлений. Даже key и тот сбоку приделан. Про ref вообще молчу. С data-* аттрибутами вообще смешно вышло, любое свойство с дефисом в TSX валидное, хехе.

Ни поддержки протокола итерации, ни условий\вветвлений.

там же есть стандартные js-ные циклы, ифы и тернарники

Про ref вообще молчу.

а что с ним?

там же есть стандартные js-ные циклы, ифы и тернарники

Ага, есть. Не в JSX а в JS. В "X" ничего кроме тегов и аттрибутов нет. Собственно из-за этого мы пишем в коде то, за что раньше били по рукам, а теперь единственная рабочая альтернатива. Уже лет 7 пишу на React и мне до сих пор тошно от JSX-лапши со всякими {arr.map(() =>. И эти условия вида var && ..., var ? ... : .... Бррр.


Тут претензия не к JS, а именно к JSX. Сразу не продумали сахара, а потом уже ничего не стали менять.


а что с ним?

Начинаются всякие бубны и пляски с forwardRef (пример: цепочки из HoC), и привет проблемы с типами. В частности когда нужна useImperativeHandle. В общем я давно взял за правило, на уровне компонент не использовать ref, а делать явный prop onRef, которые не прибит к React сбоку.

Да, вот что меня действительно раздражает, так этот момент, когда компонент написан, но тут возникает задача пробросить ref, и начинается синтаксический ад с forwardRef и Typescript. Пока все скобочки в нужном порядке расставишь, все желание кодить пропадает =)

Ага. Да к чёрту этот ref, если честно. Как и useImperativeHandle. Всё тоже самое явным образом через prop делается тривиально и без лишних телодвижений.

Тут претензия не к JS, а именно к JSX. Сразу не продумали сахара

Я не пробовал Vue и Ангуляр, но часто слышу о проблемах с типизацией в них, и подозреваю, что это связано с сахаром в шаблонах.

Боже, ну и жесть, хорошо что в vue есть computed, где можно нормально построить строку и выдать всё в переменной

А в чем "нормально построить строку" внутри computed будет фундаментально отличаться от приведенных выше примеров?

Не могли бы вы привести пример того, как вы бы использовали computed в случае приведенного примера из статьи?

тут дело не в computed, а том что vue сам умеет формировать строку с названиями классов из объектов и массивов(примерно так же как и в clsx).

Действительно. Полезная штуковина тогда. Было бы здорово иметь этот функционал встроенным в Реакт

Это всё классно, пока класс не нужно передаать дальше. И приходится всё равно подключатаь clsx в впроект.

Во Vue в целом очень много синтаксического сахара, в отличии от JSX. Очень комфортный шаблонизатор. А как сейчас в нём с поддержкой TSX? Все эти v- и прочие аттрибуты подружили с проверкой типов?

кажется нет, будет достаточно сложно добавить проверку типов для аргументов и модификаторов директив.

не работаю с tsx...

Есть, конечно, и минусы. во 2 версии v-for работает раньше v-if, что очень тупо. Но в 3, говорят, всё стало прекрасно, и сделали небольшой разворот в сторону хуков реакта

Когда не знал о classnames, написал свой костыль, которым благополучно и пользовался. Собственно, переход на classnames прошёл с помощью простой автозамены, т.к. синтаксис тот же самый.

Data-атрибуты в своей практике использовал в случаях, когда один и тот же атрибут необходимо таскать очень часто по всему приложению. Например, при реализации кастомного 2d-фокуса, управляемого стрелками на клавиатуре. Ну, и эти дата-атрибуты никогда не задавались ручками, сугубо через HoC. Так мы не теряем типизацию и линтинг.

Ну, и эти дата-атрибуты никогда не задавались ручками, сугубо через HoC. Так мы не теряем типизацию и линтинг

А можно с этого момента поподробнее. Не совсем понятно как HoC решил проблемы с типизацией и линтингом data-аттрибутов.

HoC внедряет prop'ы, с помощью которых мы работаем с функциональностью, которая под капотом внутри HoC разворачивается в работу с data-атрибутами. В моём случае был проп "focus", указывающий на соседние элементы в графе, который может либо получаться из data-атрибута, либо быть задан программистом из jsx (и записан в data-атрибут). Сами эти пропы элементарно типизируются средствами TypeScript. По типизации в HoC, по-моему, даже на хабре статья была.

А, теперь понятно. Не, типизация HoC не интересна, там нет ничего особенного (кроме ломающихся генериков). Интересна была именно типизация data-аттрибутов. Я думал у вас что-то связанно именно с этим.

Но по идее мы можем глобально расширить тип HTMLAttributes, либо же создать новый тип-дженерик, который принимал бы на вход параметры для data-атрибутов.

Вот пример (может кому пригодится), с глобальной модификацией:

Спасибо за наводку. Способ немного брутальный, и не отрезает возможности передавать любую пургу (вроде <div b-b={true}/>), но уже позволяет лимитировать какие-то конкретные глобальные аттрибуты.

нормальные люди отделяют стили от скрипта

А я лично использую styled-components, фактически полностью уходя от классов. Но этот способ включает другие проблемы, но сейчас не об этом)

Одно время я тоже ими пользовался, даже перевел статью про выход пятой версии. Однако, не очень гладкая интеграция с Mui четвертой версии заставила перейти на JSS объектный синтаксис. А сейчас, в пятой версии этой великолепной библиотеки, разработчики взяли emotion как решение по умолчанию.

Возможно, стоит задуматься о возврате к простому kebab-case синтаксису css без upperCase девиаций =)

Sign up to leave a comment.

Articles