Create Highly Reusable React Components in Minutes with TypeScript

Поділитися
Вставка
  • Опубліковано 1 сер 2024
  • Let's look into a best practice for creating highly reusable React components. We'll use TypeScript for that, but JavaScript works just fine too. You'll learn a really helpful trick to get type completion on your component, saving you lots of maintenance and headache in the long run. Also, we'll conditionally display tailwind classes with a convenient utility function! :)
    ⭐ Our startup: wordful.ai
    ⭐ My GitHub: github.com/joschan21
    0:00 - Intro
    0:18 - The Problem
    3:27 - The Solution
    10:26 - Outro
    The stuff I use to make my videos
    Camera: amzn.to/3XcqRKO
    Light: amzn.to/3Xc1yIE
    Keyboard: amzn.to/3CKxnAi
    Mouse: amzn.to/3CNcfcm
    Microphone: amzn.to/3iybVHC
    Headphones: amzn.to/3IHTTgH
    thats pretty much it. Those are affiliate links so I might earn a commission if you purchase after clicking them. :^)
  • Наука та технологія

КОМЕНТАРІ • 56

  • @scumbag_kiko
    @scumbag_kiko Рік тому +7

    Ive had this on my mind this past week, this video came just in time! Great job!

  • @xylarwardhan8445
    @xylarwardhan8445 Рік тому

    Ok woah this is extremely useful! Thank you so much!

  • @PedroFernandez-iv2uv
    @PedroFernandez-iv2uv Рік тому

    great video Josh, really appreciate it

  • @snatvb
    @snatvb Рік тому +21

    Exists better way: use React.ComponentProps and you will avoid all boilerplate, also you need to wrap component with forwardref - then it will really common component
    at least avoid interfaces for declare type of props, because this is final type, you don't imply that your props type may be extended from outside with merging declaration (actually it may be unintentional)

    • @MisouSup
      @MisouSup Рік тому +4

      I do it like this all the time as well. I was wondering if this is common because I don't see people mentioning it so much.

    • @snatvb
      @snatvb Рік тому +2

      ​@@MisouSup unforchantly not really :((
      Need to teach every developer follow this rules

    • @CoIdestMoments
      @CoIdestMoments Рік тому

      @@snatvb How did you learn that to do it that way ?

    • @snatvb
      @snatvb Рік тому +2

      @@CoIdestMoments somehow came with time

    • @gatocode316
      @gatocode316 Рік тому +1

      thanks, i was thinking that redeclaring the disabled property was not the best way

  • @francisagada5810
    @francisagada5810 Рік тому

    this is great, Champ. I love this

  • @milad8436
    @milad8436 11 місяців тому

    You are a life savor. Thank you

  • @twanabrno875
    @twanabrno875 7 місяців тому +1

    thank you but onClick is not working ? Can anyone help and say why its not

  • @tranminhhaifet
    @tranminhhaifet Рік тому

    thank you! very clear

  • @51Grimz
    @51Grimz Рік тому

    I've been playing around with this concept of spreading all props to components created from a generic component that calls reacts create Element function based on the element type then just spreads the props from a json object. Pretty cool low code concept.

  • @SMILESHOW1337
    @SMILESHOW1337 11 місяців тому

    what if my custom component has input but also a label? how to pass attributes of 2 elements ?

  • @bunyameennurudeen173
    @bunyameennurudeen173 Рік тому +3

    Great tutorial. Thanks for the lovely explanation

  • @ya4dang1
    @ya4dang1 Рік тому

    Do clsx and twMerge mess with Tailwind tree-shaking?

  • @nazarshvets7501
    @nazarshvets7501 Рік тому +7

    ```
    type ButtonProps = React.HTMLButtonAttributes & {
    // ...custom props
    }
    ```
    `HTMLButtonAttributes` extends generic `HTMLAttributes` and add properties which only exist for buttons (like `type: 'button' | 'submit' | 'reset'`, `form: string`, `disabled: boolean` and so on)

  • @oleksandrluchytskyi6867
    @oleksandrluchytskyi6867 Рік тому

    is it alias in you import … ‘@/components/…’ how to do this for create-react-app starter?

  • @ILoveTheMusic-rk7nr
    @ILoveTheMusic-rk7nr 5 місяців тому

    It's crazy thank you so much

  • @aymenbachiri-yh2hd
    @aymenbachiri-yh2hd Місяць тому

    Thank you so much

  • @mdkawsarislamyeasin4040
    @mdkawsarislamyeasin4040 Рік тому

    Thanks, I didn't know that we can extend all other attributes from TS in our interfaces

  • @codewithguillaume
    @codewithguillaume Рік тому +1

    Really basic but really useful

  • @pieter5466
    @pieter5466 Рік тому

    Now I know what old time devs mean when they say new devs are "reinventing" stuff, in this case OOP and inheritance.
    Not knocking btw, I think this is great!

  • @victoriousinsight
    @victoriousinsight 2 місяці тому

    Thank you

  • @satishmaurya2089
    @satishmaurya2089 4 місяці тому

    Thanks josh

  • @RoshanKumar-sh8ve
    @RoshanKumar-sh8ve Рік тому +5

    I personally like cva (class variance authority) for reusable components.. have u tried it?

    • @mohaniya15
      @mohaniya15 Рік тому

      The latest video on my channel is about this!

  • @bielarusajed
    @bielarusajed 11 місяців тому

    Didn't you permanently diaabled button? Isn't it right to make {disabled} instead of your disabled?

  • @dev-suresh
    @dev-suresh 4 місяці тому

    Hi Josh, informative video, however, I came here to find the solution to how we can use event handlers as props as I am getting error that Event Handlers cannot be passed as props in nextjs

  • @kulbirsingh8915
    @kulbirsingh8915 Рік тому

    This is a great video, keep up the good work!! Can you explain how the ` 'cursor-not-allowed': isLoading ` works? How is that conditionally adding the class? shouldn't you use something like isLoading && ' cursor-not-allowed'' instead?

    • @joshtriedcoding
      @joshtriedcoding  Рік тому +1

      That works fine too, however, when you inspect that in the browser and the condition is false you might have "false" or "undefined" as the class (not a huge deal tho). With this library, the syntax is slighty different as your pointed out, making those conditionals way easier to write and read

  • @gpyk306
    @gpyk306 10 місяців тому +1

    so he is extending it with "disabled" which is already HTMLButtonElement property, makes sense :D

  • @codecleric4972
    @codecleric4972 5 місяців тому

    Gold

  • @marcintichoniuk6554
    @marcintichoniuk6554 Рік тому +3

    type Props = React.ComponentPropsWithoutRef & {
    customProp?: string;
    };
    You will have disabled attribute

  • @insidetech4488
    @insidetech4488 5 місяців тому

    Why don't you use forwardRef?

  • @dimasadnan4873
    @dimasadnan4873 Рік тому +2

    noob question : why use external class value package instead of using template literals?
    Edit : and use ternary for conditional classes

    • @okage_
      @okage_ Рік тому +1

      it makes it easier to make conditional classes

    • @nicholascostadev
      @nicholascostadev Рік тому +1

      tailwindMerge solves some mistakes that can happen at runtime like two conflicting classes, and classNames or clsx can make your code more readable if at large scale, meaning there are lots of conditional classes. You can think of a button not using any of these packages having 6 conditionals, would have lots of ternaries meaning that for some people it may be less readable. I don't quite use both packages, but I understand its use case.

    • @dimasadnan4873
      @dimasadnan4873 Рік тому

      @@nicholascostadev still don't fully get it but might be because my lack of experience, I'll keep them in mind though. Thanks for the answers!

  • @pheisar
    @pheisar Рік тому

    Why is twMerge needed?

    • @jpvlog8129
      @jpvlog8129 11 місяців тому +1

      twMerge is helpful in merging or concatenating styles. Sometimes, the CSS you inputted may not effect and to solved that issue, you will need to add exclamation point (means important). It's kind of ugly.
      This issue can be solved by twMerge, no more prefix exclamation point and the CSS will work as expected.

  • @namesare4fools
    @namesare4fools Рік тому

    in the end you'll go full circle of using component libraries

  • @hardwired89
    @hardwired89 Рік тому

    No library plss

  • @andrewc8125
    @andrewc8125 Рік тому +4

    Hm kinda defeat the purpose of typescript if every attribute is optional

    • @imadmachi3227
      @imadmachi3227 Рік тому

      That doesn't introduce any vulnerability, since the suggested properties are all supported by the corresponding html tags

    • @rusliabdulgani9920
      @rusliabdulgani9920 4 місяці тому +1

      nope, optional is not mean you pass the type strict, cause the value is just its original value or undefined, you will ignore the power of typescript if you pass it using "any" type..

  • @mohaniya15
    @mohaniya15 Рік тому

    dude i cant believe it I just released a similar video on this yesterday

    • @zoki5388
      @zoki5388 Рік тому

      frontendmasters was inspiration ?

    • @mohaniya15
      @mohaniya15 Рік тому

      @@zoki5388 no i am not aware of who that is, but i will check them out!