STOP using useState, instead put state in URL (in React & Next.js)

Sdílet
Vložit
  • čas přidán 1. 06. 2024
  • 👉 NEW React & Next.js Course: bytegrad.com/courses/professi...
    Hi, I'm Wesley. I'm a brand ambassador for Kinde (paid sponsorship).
    👉 Add auth to your app FAST: bit.ly/3QOe1Bh
    👉 NEW React & Next.js Course: bytegrad.com/courses/professi...
    👉 Professional JavaScript Course: bytegrad.com/courses/professi...
    👉 Professional CSS Course: bytegrad.com/courses/professi...
    👉 Discord: all my courses have a private Discord where I actively participate
    🔔 Email newsletter (BIG update soon): email.bytegrad.com
    ⏱️ Timestamps:
    0:00 Examples
    0:41 Benefits
    2:38 Example overview
    4:24 useState
    6:56 Synchronize URL with useEffect
    7:30 History API
    7:54 Query string definitions
    8:58 Next.js useRouter
    10:20 location.search
    11:18 Problems with useState approach
    11:58 Switch to URL for state
    12:26 useSearchParams
    13:35 Link component
    16:11 Server component (searchParams)
    17:13 Caveat 1: replace vs push
    17:57 Caveat 2: unknown values
    18:18 Caveat 3: no values
    18:32 Caveat 4: url-encoded values (URLSearchParams)
    20:47 Real-world use cases
    #webdevelopment #programming #coding

Komentáře • 412

  • @alexnelson2119
    @alexnelson2119 Před 6 měsíci +32

    A note about replace vs push, the Link component takes a `replace` prop that you can set to true (default is false) if you want the replace behaviour. It also has a `scroll` prop that you should set to false (default is true) if you don't want to scroll to the top of the page each time you click on an option.

  • @samyakpiya
    @samyakpiya Před 7 měsíci +11

    You are so good at teaching web dev. I love that you show how something can be done with just JS and then proceed to show how a framework like Next.js makes it much simpler! Also, I really appreciate that you cover the edge cases and best practices. I'm learning a lot from watching your videos!

  • @saadelfadil
    @saadelfadil Před 4 měsíci +3

    I stumbled upon your CZcams channel just today and had to reach out immediately to express my gratitude for the incredible content you’re sharing. Even though it's only been a day, I've already spent hours soaking in your insights. The way you explain concepts is nothing short of amazing 🔥🔥

  • @developerpranav
    @developerpranav Před 8 měsíci +42

    This is awesome with server components! Very detailed video that includes URL encoding and search params. Waiting for your nextjs course :D

  • @dimitrisborbotsialos
    @dimitrisborbotsialos Před 8 měsíci +112

    We’ve actually used this technique 4 years ago on a react application, worked great and still does. We’ve also made a search component to listen for changes on the url and update a context. Our app was complex and many components had to be updated so using a context was the way to go. It’s funny though that no matter what we do we always coming back to 00’s concepts. It’s like php back in the days.

    • @Diegps
      @Diegps Před 8 měsíci +5

      it's php with a mint flavor and I'm here for it

    • @spicynoodle7419
      @spicynoodle7419 Před 8 měsíci +5

      Modern PHP with HTMX is the dream and I'm living it

    • @billypentester
      @billypentester Před 8 měsíci +4

      It depends on the requirements. If you're developing apps that don't share data like admin panels, use states and react. But if you're developing sites that do share data like e-commerce websites, use params and next js.

  • @silentlyow
    @silentlyow Před 8 měsíci +5

    I recently started a project on a brand new framework recently (Next.js) with TypeScript as well (first typescript experience as well) and discovered this method of handling something like "state" in server components. Basically I had a product page and needed to do pagination and filtering, I did it using the query string.

  • @lets_see_777
    @lets_see_777 Před 6 měsíci +4

    somehow your teaching method resonates best with me. There are several popular youtubers on JS but you explain why we are doing things with alternatives. Thank you.

  • @LePhenixGD
    @LePhenixGD Před 8 měsíci +4

    Amazing tutorial man! Never had that idea to use URL parameters not for a search but for products until now, thank you!

  • @maisamafshar
    @maisamafshar Před 8 měsíci +3

    Excellent presentation and explanation. Loved the pace of the video, not slow, not fast. Subscribed.🤩

  • @foreverl01
    @foreverl01 Před 8 měsíci +22

    I found your videos last week and I've seen more than 10 hours of your content. The way you explain things is amazing. Thanks, Wesley!
    I'm making an e-commerce myself to practice react and next.js, using app router. This solution to avoid using state and making components CC is great!
    I can't wait for the next js course!! 🥳

  • @coffeefps
    @coffeefps Před 8 měsíci +5

    This is actually clean and good. Just need to handle the magic strings gracefully and it's perfect.
    You earned my sub.

  • @guilhermeferreirabr
    @guilhermeferreirabr Před 8 měsíci +4

    Dziękuję bardzo za tutoriale, właśnie kupiłem dwa twoje kursy, niesamowita treść! 🚀👏🎬

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +2

      Thanks Guilherme! Appreciate it

  • @simoncunningham2964
    @simoncunningham2964 Před 26 dny +1

    Thank you for this video - I've watched a lot of tutorials lately that go down the route of useState and useEffect but they never felt like the best way - glad I came across this video!

  • @ebratz
    @ebratz Před 7 měsíci +1

    This tip saved me a lot of time today! Thank you so much! Eager waiting for your Next.js course!

  • @seg_fault
    @seg_fault Před 7 měsíci +1

    Thanks for the video. I heard of this and needed to see an example of how to go about it and this went above and beyond with even the pitfalls to watch out for.

  • @kevin-ty7it
    @kevin-ty7it Před 8 měsíci +2

    I have a short attention span, but you shared information continuously, which kept me engaged throughout.

  • @webdev_telugu
    @webdev_telugu Před 8 měsíci +82

    Such a niche concept and he teaches us for free even though he has paid courses. Kudos my man!!

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +3

      Thanks

    • @RealRatchet
      @RealRatchet Před 8 měsíci +33

      It's not a niche concept putting stuff in query parameters was how Web1.0 did things because there was no client state, we've officially come full circle.

    • @shrin210
      @shrin210 Před 8 měsíci +3

      ​@@RealRatchetNow we write in components and not in pages.
      That's the only thing changed from Web 1.0

    • @webdev_telugu
      @webdev_telugu Před 8 měsíci

      @@RealRatchet yeah true, but I'm a new developer so new thing to me

    • @henriquematias1986
      @henriquematias1986 Před 8 měsíci +2

      What you mean niche concept? That’s how the internet works and always worked 😊
      It’s just that some websites are broken so he’s teaching how to fix it 😅

  • @vikasni95
    @vikasni95 Před 8 měsíci +2

    Im very lucky to find your channel on random search.. Tq god for suggesting this gem channel... Tqss dude keep adding more videos 😍👍

  • @Olga-id1qy
    @Olga-id1qy Před 6 měsíci +1

    Beautiful, it made me smile for a sec as I would write it exactly as you mentioned at the beginning via useEffect(). Now while transitioning to Next.js, I like definitely this one-way approach

  • @saitharunreddya2046
    @saitharunreddya2046 Před 8 měsíci +1

    An awesome video with great details and explanation, loved it!!! Keep Up the good work

  • @mu_yaser
    @mu_yaser Před 8 měsíci +1

    wanted to use this concept in my latest next project and you just explained things i needed to know, good info and explanation

  • @weebdeveloper
    @weebdeveloper Před 8 měsíci +1

    True, derived state makes some features so much simpler to build, thanks for sharing

  • @chrishanthacosta4093
    @chrishanthacosta4093 Před 5 měsíci +2

    I find Wesley to be the best NextJS teacher.

  • @filipniklas
    @filipniklas Před 8 měsíci +2

    Great video! Super helpful and well presented!

  • @MOURADSLIM
    @MOURADSLIM Před 8 měsíci +1

    I'm doing a search function and was gonna use a state manager to manage this problem, perfect timing XD
    Thank you

  • @jou3883
    @jou3883 Před 7 měsíci

    I love you. You’re an awesome teacher. I’m grateful to have found your channel 🙏🏻

  • @James-rd1sb
    @James-rd1sb Před 8 měsíci +1

    I never thought of it like this. I'm sure it'll be useful to know in the future! Many thanks

  • @nomadshiba
    @nomadshiba Před 8 měsíci +2

    not using react or next, or tsx
    but this is so true!
    especially for modals, i like to keep my active modal info on the hash part of the url
    that way both page data and modal data can be placed on the url
    but of course you can use url params too
    i mean you realize that your site/app needs this the moment you refresh the page

  • @ardianhotii
    @ardianhotii Před 8 měsíci +1

    This video was very helpful, I'm learning so many new things from you that I didn't know that can cause problems in my apps. Thank you so much

  • @pi3ni0
    @pi3ni0 Před 7 měsíci +1

    Thanks, very good content. A lot of real world cases, can't wait for your course! :)

  • @Anonymousssss368
    @Anonymousssss368 Před 8 měsíci +2

    The content was amazing. I used this approach in my project.

  • @Scrappycoco
    @Scrappycoco Před 8 měsíci +1

    Great content man. Keep it up!

  • @i.j.5513
    @i.j.5513 Před 8 měsíci +1

    Very nicely explained and demonstrated 👍

  • @taicheeeee
    @taicheeeee Před 8 měsíci +1

    Best youtubers for beginngers: Lama Dev, and Net Ninja
    Best youtuber for junior and middle developers: YOU

  • @user-ge2vc3rl1n
    @user-ge2vc3rl1n Před 8 měsíci +1

    This is a very cool and unique example, looking forward to more. GJ

  • @ganumba11
    @ganumba11 Před 8 měsíci +1

    amazing content from you like always 🔥🔥

  • @NOTHING-en2ue
    @NOTHING-en2ue Před 8 měsíci +1

    very well tutorial, you finally teach me how to think the next-js way ❤

  • @bklynpeter
    @bklynpeter Před 7 měsíci +4

    Another amazing video. I do have a follow-up question: In your example, the page is a presumably dynamic route? How do we utilize those dynamic elements (again, in your example, 'product' and 't-shirt') at the same time we are accessing the query-params? Thanks as always!

  • @oidualx
    @oidualx Před 7 měsíci +1

    Thank you so much! This way of handling state is nothing knew, but I personally never put much thought into it until this video, and always defaulted to client state, with all the issues you listed. Typical aha moment. From now on you convinced me to always default to query params to handle state, unless there is a serious reason not to do so.

  • @CuriousByte
    @CuriousByte Před 8 měsíci +1

    Always a super useful technique especially for UI's that you likely want to remember state when you copy and paste the link.

  • @ChrisHaupt
    @ChrisHaupt Před 4 měsíci +1

    That's a really cool trick using the Link component to append a query param. Didn't know that was a thing!

  • @JosephMaramba
    @JosephMaramba Před 8 měsíci +3

    Pretty well explained. I didn't know server components get the searchParams as props by default!

  • @OpenCoreX
    @OpenCoreX Před 8 měsíci +1

    This is just amazing. Glad I discovered you - amazing teacher. #subscribed

  • @runonce
    @runonce Před 8 měsíci +1

    Really helpful, thanks for sharing! I think the main con is that it only works for buttons as links and not for other types of inputs, I guess in that case you will still need to resort to a client component (I tried to use Server Actions but couldn't come up with a working solution).

  • @raymondmichael4987
    @raymondmichael4987 Před 8 měsíci +1

    I had similar use case today, pulled my hair for hours;
    Thanks brother 😊

  • @igboanugwocollins4452
    @igboanugwocollins4452 Před 8 měsíci +1

    Neat approach, you just gained another sub

  • @arinium
    @arinium Před 3 měsíci +1

    You make absolutely great tutorials, thank you for sharing!

  • @glauberbispo8922
    @glauberbispo8922 Před 8 měsíci +1

    mind blowing I always work with states, i'm looking foward to implement this solution in some of my works *-*
    and it works really good together with server side in next

  • @mohammedelmoutaouakkil
    @mohammedelmoutaouakkil Před 7 měsíci +1

    Great tutorial! you got a subscriber

  • @WojciechBlachut
    @WojciechBlachut Před 8 měsíci +1

    That is an excellent video! Thanks so much.

  • @mohammadshariarparvez669
    @mohammadshariarparvez669 Před 7 měsíci +1

    watching your first video , became a fan of you broooooooo.. god bless you

  • @alexkey9372
    @alexkey9372 Před 8 měsíci +3

    Great video! but what if the use case is to select something and change the api response? e.g a filter page. don't you need useEffect for that? you will need the filter params first from the actual api and then when url changes it needs to re-fetch the actual response from the api with the new variables via rest or graphql. like fetching products with an array of size selections and an array of colour selections. where the fetch function will need to be?

  • @mmaarafat
    @mmaarafat Před 6 měsíci +1

    thanks, mate. it was great explanation :)

  • @DiogoLScarmagnani
    @DiogoLScarmagnani Před 6 měsíci +1

    Wow! I didn't know about History API and its pushState method. Great! It can be used even in vanilla JavaScript projects. Thank you for the video.

  • @billypentester
    @billypentester Před 8 měsíci +1

    It's really something great for me, actually, I'm looking for something similar to this concept and I got it. So much thanks sir

  • @romeorel1679
    @romeorel1679 Před 8 měsíci +1

    Never knew you have had a CZcams channel. I discovered you from your CSS udemy course. Quality work.

  • @veedjohnson
    @veedjohnson Před 8 měsíci +2

    Definitely one of the best out there!

  • @edgarasben
    @edgarasben Před 7 měsíci +2

    Thanks! How would you go about doing multiple values for one type of param? Would you do ?abc=one,two,three or ?abc=one&abc=two&abc=three ?
    Also, the URL updates seem to have a several second delay when I've tried it with Next.js 🤔

  • @aamiramin6112
    @aamiramin6112 Před 8 měsíci +1

    So informative. Thanks for sharing

  • @TitoMitto
    @TitoMitto Před 7 měsíci +1

    Your tutorials are very informative

  • @rubelhossain8517
    @rubelhossain8517 Před 8 měsíci +4

    amazing content ! Keep up the good work sir

  • @lorsothy6263
    @lorsothy6263 Před 8 měsíci +1

    Thank you so much. Now I found a way to select filters without use client.

  • @loydcose2780
    @loydcose2780 Před 8 měsíci +1

    Amazing, super helpful!

  • @geianmarkdenorte9874
    @geianmarkdenorte9874 Před 8 měsíci +1

    Just subscribed, I love your content man! I wish the audio can be improve soon.

    • @ByteGrad
      @ByteGrad  Před 8 měsíci

      Yes, will improve soon. 2-3 more videos with this haha

  • @Imjoshnewton
    @Imjoshnewton Před 8 měsíci +1

    Love this solution for handling state especially when you want to set state down the tree and read it across other components. The issue I’ve run in Next 13 is setting the paean jumps you to the top of the page. Even when using replace…

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +1

      You can configure that on the Link component (set ‘scroll’ prop to false)

  • @prajwalchoudhary4824
    @prajwalchoudhary4824 Před 8 měsíci +2

    I learned this when I was working with react router lifting state up to the url so even when user navigates around in app we can pass on this state so when they come back to same page the state doesn't get lost

  • @darwin2642
    @darwin2642 Před 8 měsíci +1

    Thanks for this video, it helped me a lot.

  • @kumardeepam
    @kumardeepam Před 8 měsíci +1

    This is so insightful and useful

  • @codewithguillaume
    @codewithguillaume Před 8 měsíci +1

    Huge fan of this approach :)

  • @ThugLifeModafocah
    @ThugLifeModafocah Před 8 měsíci +1

    Very good video. Thank you.

  • @Alex-bc3xe
    @Alex-bc3xe Před měsícem +1

    freaking smart way of making the state in the URL never crossed my mind smart ass shit.

  • @mohamedbelaouer1696
    @mohamedbelaouer1696 Před 8 měsíci +1

    I juste love your content. thank you for your useful videos

  • @abdulazizaskaraliev6119
    @abdulazizaskaraliev6119 Před 8 měsíci +1

    yes, I recently had a problem keeping state with ssr and client at the same time. It was pain in the ass, I moved it to url and it feels so good, and at the same time, url is sharable, so your state is not only in your app but you can even share it to someone and they'll immediately see the thing you want them to see.
    I was thinking what could be the down sides of doing this, i mean my state is not big and only about 1-3 query params most of the time? What could go bad with this ?
    And I just started to watch the video, and OMG the intro, he talks about all the pain points I had. This is gonna be enjoyable watch, I can smell it.

  • @stephenngeorge
    @stephenngeorge Před 8 měsíci +2

    This is a really great video :) and super interesting. I know it's nothing to do with the video but the "JavaScript magic" to make the first letter uppercase on those buttons is just "text-transform: capitalize;" in CSS 👍

    • @redeemr
      @redeemr Před 6 měsíci

      or since he's using tailwind just className="capitalize"

  • @user-qo6jf6jk2c
    @user-qo6jf6jk2c Před 8 měsíci +1

    many thanks for great content ❤

  • @DerberAlter
    @DerberAlter Před 2 měsíci +1

    thank you, this video helped me quite a lot

  • @andreilucasgoncalves1416
    @andreilucasgoncalves1416 Před 8 měsíci +54

    Query strings are usually a lot harder to work with than useState, you have to validade the input to avoid errors, specially if you change things and the query data becames stale, but anyways query strings provides a great UX

    • @zettca
      @zettca Před 8 měsíci +14

      If your data/endpoint inferred from the searchParams, it won't become stale. searchParams should be the SSOT (single source of truth). And as these are user-controlled, there should be some validation - yes.
      A small validation function is the trade-off for the greater UX

    • @zettca
      @zettca Před 8 měsíci +8

      Another thing: we shouldn't be building the searchParams by hand anyways. There's URLSearchParams for that

    • @Kaioin
      @Kaioin Před 8 měsíci +13

      You should be validating data that you use with useState, too, if it comes from userland.

    • @wisdomelue
      @wisdomelue Před 8 měsíci +4

      everything has its tradeoffs

    • @CottidaeSEA
      @CottidaeSEA Před 8 měsíci

      Validation is always an issue and honestly, in a case like this it is simply absurd to expect query parameters to exist immediately. For these things you should always have a fallback.

  • @fulltimefrontend
    @fulltimefrontend Před 7 měsíci +1

    We actually use this trick since 3 years in our React apps as well.

  • @lukas.webdev
    @lukas.webdev Před 8 měsíci +2

    Great video!! Thanks for sharing. 😉🔥

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +1

      Thanks for watching!

  • @nick-ui
    @nick-ui Před 8 měsíci +3

    Hey! I really glad to see that someone show this method to handling state in url, but this solution has potential disadvantage. It's animations. It's harder control when they're removed from the React tree. So when I use Framer motion, I can't make nice animations. Maybe vanilla css will, idk

    • @ByteGrad
      @ByteGrad  Před 8 měsíci

      Interesting, thanks for sharing

  • @perraanal
    @perraanal Před 4 měsíci +1

    this guy is the best tech youtuber ever

  • @juanhedderich
    @juanhedderich Před 8 měsíci +1

    That was awsome, ty man!!

  • @septiantonrezkirahmatulloh3837
    @septiantonrezkirahmatulloh3837 Před 8 měsíci +1

    thank you, sir. from your knowledge. I am learned something new from this.

  • @BK-qx3qf
    @BK-qx3qf Před 8 měsíci +2

    You got subscriber. Nice tutorial.

  • @404-not-found-service
    @404-not-found-service Před 2 měsíci +1

    Thanks for the video, I liked it a lot, will you by any chance upload more material like this also using useOptimistic and so on? all the best

  • @AndersonSousa33
    @AndersonSousa33 Před 8 měsíci +2

    Your videos are awesome! Just need to raise the audio volume a little bit.

  • @eedeenet
    @eedeenet Před 8 měsíci +2

    Just a note: I tried, lifting up my state to the url path. But in my specific case, it made the app very unresponsive. I do not know why. It was basically for a filter component. But after changing the filter (tried both params and searchParams) it would sometimes take seconds or even longer until the new state was shown in the app (both in url and component). Do you have any idea why this could be? I had eliminated all client components, it seemed to just be a lag in the client -> server communication?
    I was fetching data in a `page` which i would then filter by the route params and pass the filtered data down to a list component and the filter component to display the active state.
    Any tutorial on that (real world use case) with fetching data, I would be happy about.

  • @spacecowboyofficial
    @spacecowboyofficial Před 8 měsíci +2

    This just feels right. UX is more than just visuals when designing a website.

  • @johnnyholiday1150
    @johnnyholiday1150 Před 8 měsíci +3

    Hi 👋 I was wondering if its possible to please make a little/medium project with the most important points you showed in your vids. Would really appriciate it! 😁

  • @mohammadmo9290
    @mohammadmo9290 Před 8 měsíci +1

    Amazing, thanks mate 👌👌

  • @Meetblakey
    @Meetblakey Před 8 měsíci +4

    I’m so looking forward to your course on nextjs @ByteGrad. One question - are you covering SaaS workspace based functionality like limiting access to workspace. Perhaps through prisma / middleware? I think it’ll be a very useful topic to cover from a Middleware perspective and a SaaS perspective as it’s so common to many applications.
    Would also love to add this filter url topic to the course!
    Cannot wait

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +1

      Yes, one project will be a SaaS, it will have some advanced features like that too.

    • @Meetblakey
      @Meetblakey Před 8 měsíci +1

      Phenomenal! I saw that you said released soon. Do you have an ETA?

    • @ByteGrad
      @ByteGrad  Před 8 měsíci +1

      I will give a date soon to email subscribers :)

    • @Meetblakey
      @Meetblakey Před 8 měsíci

      @@ByteGrad Already done! :)

  • @thevasupodcast4561
    @thevasupodcast4561 Před 8 měsíci +1

    I love your videos. Thank you!

  • @alirezagarshasbi6557
    @alirezagarshasbi6557 Před 8 měsíci +4

    i was looking to make a seperate context for a boolean value as a side effect of another context state change, but with the abuse of url its free state across the app😁
    thank you

  • @matowang
    @matowang Před 8 měsíci +2

    One of the problems with using this method on Next.js is that the UI does not update until page.tsx is finished rendered. So if you click "White", it will not update the UI until the client finishes fetching the next page. It will be better to maintain some client state and listen to updates so the client UI can update immediately. Let me know if I'm missing something.

  • @peterabouabsi8427
    @peterabouabsi8427 Před 7 měsíci +1

    Depends on your case. This is a great practice for searching and fetching tasks.

  • @michaelkevinmontolalu203
    @michaelkevinmontolalu203 Před 8 měsíci +5

    Great video, but how would this work if you have a search component to search something, and want to handle and display the loading state while its being fetched? a solution i could think of is using ternary but what if I wanted to use the next.js default loading.tsx file?

    • @ish1k4r4
      @ish1k4r4 Před 8 měsíci

      hey, could you please elaborate about the ternary approach? i'm struggling to find a solution for this problem myself 😅😅

  • @shubhojeetbera
    @shubhojeetbera Před 8 měsíci +1

    This was great & easy 👌🏻

  • @HerrThomasE
    @HerrThomasE Před 8 měsíci +1

    thank you very much for this Great explanations,,!,,!!

  • @dero433
    @dero433 Před 8 měsíci +3

    Dzięki za porady!

  • @iBryanKops
    @iBryanKops Před 8 měsíci +1

    Thanks for this content broth