Полиморфные React компоненты

แชร์
ฝัง
  • เผยแพร่เมื่อ 27 ก.ย. 2022
  • Универсальные React компоненты могут принимать разный набор просов и отрисовывать в разметку компоненты с разными тегами. Например, кнопка может быть как button, так и ссылкой, или даже div или span. TypeScript помогает упростить создания подобного рода компоненты. Разбираемся как именно.
    Код из видео codesandbox.io/s/romantic-vau...
    Мои курсы по вебу с купонами:
    ✅ mishanep.com/
    📢 Поддержка канала:
    / mishanep
    www.tinkoff.ru/rm/nepomnyasch...
    paypal.me/mishanep

ความคิดเห็น • 46

  • @ggindinson
    @ggindinson ปีที่แล้ว +14

    большое спасибо за концентрат настолько понятной и важной информации, было бы интересно посмотреть что-то из ряда "типичные ошибки при работе с ts"для понимания лучших практик

  • @vadim_tech
    @vadim_tech ปีที่แล้ว +7

    Топовая вещь! Полиморфные компоненты это must have для тех кто пилит свой ui kit.

  • @victormog
    @victormog ปีที่แล้ว +6

    Очень полезные уроки для освоения TypeScript!

  • @thats_embarrassing_JS
    @thats_embarrassing_JS ปีที่แล้ว +3

    Typescript творит чудеса... Спасибо за видео, Михаил!

  • @c4973
    @c4973 ปีที่แล้ว +1

    Михаил, спасибо за ваши видео!
    Спасибо за простое пояснение сложных вещей! 🔥🔥🔥
    Пожалуйста не забрасывайте.

  • @denis7442
    @denis7442 ปีที่แล้ว +3

    Красава! Спасибо за такой контент, все доходчиво и без воды. Побольше бы видосов по ts

  • @user-dw8lb8lc7u
    @user-dw8lb8lc7u ปีที่แล้ว +3

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

  • @YuryKorotovskikh
    @YuryKorotovskikh ปีที่แล้ว +1

    Большое спасибо за видео! Было очень полезно, посмотрев, смог решить старую проблему с полиморфным компонентом в библиотеке.

  • @demiurgen13
    @demiurgen13 ปีที่แล้ว

    Михаил, спасибо. Годнота за годнотой

  • @AndreiTolstoi
    @AndreiTolstoi ปีที่แล้ว

    реально лучший!👍👏

  • @Artur-pk3sw
    @Artur-pk3sw ปีที่แล้ว

    я так давно это искал! спасибо :)

  • @bagga_lev
    @bagga_lev ปีที่แล้ว +2

    Как всегда, вижу ролик Михаила и понимаю, что время будет проведено с пользой =) Спасибо за материал!

  • @user-vm2db5cq1g
    @user-vm2db5cq1g ปีที่แล้ว

    Это прям супер видео! Михаил спасибо, если можно побольше такого рода видео!

  • @user-zp9iq1po5o
    @user-zp9iq1po5o ปีที่แล้ว +1

    Фантастика!

  • @Pavel-wj7gy
    @Pavel-wj7gy ปีที่แล้ว

    Спасибо за видео! На самом деле полноценная реализация такого компонента это задача на несколько дней, но за контент большое спасибо, тема очень полезная.

  • @profesor08
    @profesor08 ปีที่แล้ว +1

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

  • @almazyakhin7246
    @almazyakhin7246 ปีที่แล้ว

    спасибо, полезно

  • @Bohdan-Venhrenovych
    @Bohdan-Venhrenovych ปีที่แล้ว +1

    Топ!

  • @dreadwood
    @dreadwood หลายเดือนก่อน

    Это просто взрыв мозга! Наконец-то без флагов и ветвлений перепишу все кнопки

  • @brucewayne_007
    @brucewayne_007 ปีที่แล้ว +1

    🔥

  • @snatvb
    @snatvb ปีที่แล้ว

    Крутые видосы для продвижения пацанов из начинающий мидлов далее
    я бы еще экспортировал пропсы -- ибо если потом проекте надо будет сделать обертку над таким компонентом -- придется менять код, который уже написать, что нарушение open-close principle

  • @user-ii3de1cw9w
    @user-ii3de1cw9w ปีที่แล้ว

    👍

  • @user-qb7jg4hx5l
    @user-qb7jg4hx5l 8 หลายเดือนก่อน

    Спасибо за видео.
    Кроме пропса as такие возможности полиморфизма можно провернуть через другой пропс? Например пропсы зависят от значения пропса multiple (true|false).

  • @cheesecheesson9842
    @cheesecheesson9842 ปีที่แล้ว

    Какой классный контент и так мало просмотров.

  • @CJIu3eHb
    @CJIu3eHb ปีที่แล้ว

    Интересно, можно ли избавиться в текстовом компоненте (9:34) от трехкратного употребления в дженериках "E extends ElementType"?
    Кстати, мне кажется, что можно убрать дефолтное присвоение дженерику в строке 3, а в строке 9 не использовать этот дефолт, а явно указать уже имеющийся в этом выражении дженерик: "keyof TextOwnProps".

  • @user-bi8pe4lc1x
    @user-bi8pe4lc1x 9 หลายเดือนก่อน

    Дружище, один момент, в React, для создания компонента, используется функция createElement а не , так не правильно делать. В остальном, спасибо, очень и очень полезный для меня видеоролик!

  • @poiu7185
    @poiu7185 ปีที่แล้ว

    Давайте про модульный подход в реакт

  • @apyrkh
    @apyrkh 11 หลายเดือนก่อน

    странно, для as="button" не определяется тип для onClick ивента: Parameter 'e' implicitly has an 'any' type.ts(7006).
    Я делал через: type HTMLElementProps = Parameters[0] , но по ощущением медленнее работает

  • @XiaoRenMeishi
    @XiaoRenMeishi ปีที่แล้ว +1

    Михаил, у вас нет в планах адаптации ваших курсов по Реакт и Редакс на тайпскрипт?
    Тот же материал, но с увеличенной ценой за бонус ввиде типизации.

    • @mishanep
      @mishanep  ปีที่แล้ว

      Я только в этом месяце выпустил курс по ts, где в том числе есть блоки по реакт и редакс. Сами курсы по реакт и редакс останутся пока на js.

  • @sicdex
    @sicdex ปีที่แล้ว

    Привет, есть одно НО - если оборачивать это в (например: memo(Component)) это будет работать с поправкой на те элементы которые у вас в BaseProps, а в otherProps не чего не придёт, так-как условная "E" у вас не попадает в фии memo.

    • @Pavel-wj7gy
      @Pavel-wj7gy ปีที่แล้ว +2

      Это далеко не единственная проблема с такой простой реализацией. Вероятно также будут проблемы с тем, что мы не сможем передать ref и даже если захотим, то придется переписывать много кода. Также под вопросом передача event handler'ов. А что если мы захотим передать в компонент-кнопку из реакт-роутера? А что если компонент-consumer нашего компонента передает className, при этом внутри самого компонента уже есть какой-то className? Как вообще стили className родителя, styles родителя, event handler'ы родителя будут сливаться с теми же пропсами в базовом компоненте? Иными словами релизация такого компонента на TS это ОЧЕНЬ сложная задача. Код который здесь написан, вряд ли пошёл бы в продакшн.

  • @ilovecameltoe
    @ilovecameltoe 3 หลายเดือนก่อน

    @Михаил Непомнящий подскажите как сюда в этот компонет прокинуть ref

  • @constantine6464
    @constantine6464 ปีที่แล้ว +1

    5:21 typeof defaultElement - это ведь будут string, разве нет?! зачем это вообще??

    • @mishanep
      @mishanep  ปีที่แล้ว +1

      Не совсем. Типом будет литерал. И если значение потом изменится, то и тип будет другим

  • @yuliasereda5671
    @yuliasereda5671 ปีที่แล้ว

    здравствуйте,а курс по тайпскрипту состоит из 6 видео?

    • @mishanep
      @mishanep  ปีที่แล้ว

      Здравствуйте. Смотря о чем вы спрашиваете. Если про материалы на TH-cam, то здесь у меня 2 плейлиста - один про основы, второй про реакт (включая это видео). Есть 13-часовой курс по ts, опубликованный мной на Степике и на udemy. Актуальные ссылки всегда есть на моем сайте mishanep.com

    • @yuliasereda5671
      @yuliasereda5671 ปีที่แล้ว

      @@mishanep спасибо большое

  • @vlasovdanildev
    @vlasovdanildev ปีที่แล้ว

    Здравствуйте Михаил, сделайте пожалуйста видеоролик про все хули реакта

  • @alexeyfilippov42
    @alexeyfilippov42 7 หลายเดือนก่อน

    хм не знаю как сделать Link от react router dom или button

  • @vladimircreator
    @vladimircreator 9 หลายเดือนก่อน

    База.

  • @NeoCoding
    @NeoCoding 6 หลายเดือนก่อน

    что-то на умном

  • @nade3282
    @nade3282 ปีที่แล้ว

    пример с текстом странный, в чем смысл создавать отдельный компонент для текста, если захочешь изменить div на h1 или на label это и без компонента можно сделать

    • @vadim_tech
      @vadim_tech ปีที่แล้ว

      Это же пример. В реальности, обычно, компонент text содержит дополнительную логику со стилизацией текста. Чтобы ее переиспользовать как раз и нужны полиморфные компоненты.

  • @ruslanmustafin8887
    @ruslanmustafin8887 วันที่ผ่านมา

    Читерство)