Using React Hook Form, Zod Validation and Server Actions in NextJs

Поділитися
Вставка
  • Опубліковано 6 лип 2024
  • In this video, we'll look at implementing forms in NextJs using the React-hook-form library, we'll then add validation using Zod, and at the end, we'll replace our API endpoint with server action.
    👉🏼 The Ultimate NextJs Course
    🔗 www.hamedbahram.io/courses/ne...
    👉🏼 Project source code (Github)
    🔗 github.com/HamedBahram/next-rhf
    👉🏼 React hook form
    🔗 react-hook-form.com
    Chapters
    0:00 Intro
    0:40 Project code setup
    1:30 Adding a simple form
    5:00 Adding React hook form
    13:30 Adding Zod validation
    19:00 Using server actions
    25:18 Outro
  • Наука та технологія

КОМЕНТАРІ • 96

  • @georgewekesa1380
    @georgewekesa1380 8 місяців тому +20

    Coming from Sveltekit, I now understand why svelte is so beloved

    • @hamedbahram
      @hamedbahram  8 місяців тому +6

      Sveltekit is also a good framework.

    • @devyb-cc
      @devyb-cc 7 місяців тому +1

      about to ditch next and move to nuxt at this point hahah

  • @jeghaire
    @jeghaire 10 місяців тому +12

    I cannot even explain how much your videos help simplify my learning. I'm the go to person on Next.js 13 at my work place. Thanks for your videos

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

      Great to hear that! Appreciate the comment.

  • @user-pe4wq2dv7q
    @user-pe4wq2dv7q 10 місяців тому +3

    Very cool content! I have skipped your videos that was published on the last 3 months because of some mess on the job. But now I am going to catch up and explore all of them. Explanation is really very clear. Thanks!

    • @hamedbahram
      @hamedbahram  10 місяців тому

      Welcome back! Glad to hear that.

  • @shubhankarvalimbe5286
    @shubhankarvalimbe5286 5 місяців тому +3

    Very helpful, loved how you also showed a basic react form, mentioned a controlled component form as well and compared it to react hook form and why it's better. Keep going!

  • @yogawithaaron
    @yogawithaaron 6 місяців тому

    I love the detail of your explinations. And, the fact that you showed 4 different ways to accomplish the validation with incremental steps to newer features. Thank yoU!

  • @giovannitonussi3746
    @giovannitonussi3746 10 місяців тому +3

    Another great video, thanks for talking about the most recent features of Next, you are a great reference on the topic. I am using this exact stack of RHF and Zod and was wondering if I should try server actions, now I will definitely try it out.

    • @hamedbahram
      @hamedbahram  10 місяців тому

      Glad it was helpful! Appreciate your comment.

  • @MohamedRabi
    @MohamedRabi 3 місяці тому +3

    Your videos offer great value to the community of developers across the globe. I really love your fantastic tutorials! ❤

  • @ariansharifi9682
    @ariansharifi9682 7 місяців тому +2

    Excellent tutorial, explained so simply. I love the iterative approach of adding more complexity.

    • @hamedbahram
      @hamedbahram  7 місяців тому

      Thanks! I'm glad to hear you like the structure of the video.

  • @deepdrops
    @deepdrops 9 місяців тому +2

    Congratulations, Hamed! You provided the best explanation on this topic.

    • @hamedbahram
      @hamedbahram  9 місяців тому

      Thanks Leonardo! Glad to hear that!

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

    Great video, Hamed! Thank you!

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

    what a coincidence, I was searching for use hook form usage and the first thing I saw is your Video and it's posted just 14 mins ago :)

    • @hamedbahram
      @hamedbahram  10 місяців тому

      Awesome! welcome to the channel.

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

    Hamed thanks for putting this together, so good dude

  • @lukegordon4734
    @lukegordon4734 8 місяців тому +1

    This was a fantastic video! Server actions seem super cool

    • @hamedbahram
      @hamedbahram  8 місяців тому

      Thanks. Yeah they're pretty cool!

  • @the_yugandharr
    @the_yugandharr 6 місяців тому +1

    Very very well made video! Thanks for this!

    • @hamedbahram
      @hamedbahram  6 місяців тому +1

      My pleasure! Glad it was helpful.

  • @user-sw5pf3te7c
    @user-sw5pf3te7c 4 місяці тому +1

    Great video! Thanks 👍

  • @moodymonstrosity1423
    @moodymonstrosity1423 15 днів тому +1

    Thank you so much Hamed

  • @TheRoseWoodBody
    @TheRoseWoodBody 8 місяців тому +1

    Great video!
    Would love to see error handling with server actions with useFormState and userFormStatus!

    • @hamedbahram
      @hamedbahram  8 місяців тому +1

      Great suggestion! Wrote it down in my schedule.

  • @kuroshhusseini8170
    @kuroshhusseini8170 3 місяці тому +1

    Bahram youre the man, thanks for the great content

  • @b166er4
    @b166er4 6 місяців тому +1

    thx a lot, all i was looking for.. now let's use it in nextauth with Your next video ;)

    • @hamedbahram
      @hamedbahram  6 місяців тому

      You're welcome! Glad you found it helpful!

  • @sagesofsound298
    @sagesofsound298 5 місяців тому +1

    I want to create a multi page form using server actions and the action prop. But the server action uses the FormData interface. And say I have state to keep track of what set of questions I need rendered out to the screen when next or back is clicked. When state changes, FormData is wiped. I haven’t figured out a solution for this. Do you have any suggestions?

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

      Watch this video → ua-cam.com/video/lW_0InDuejU/v-deo.html

  • @Alireza-kw6fj
    @Alireza-kw6fj 7 місяців тому +1

    Thanks, Greate video, Wish you best

  • @TylerForestHauser
    @TylerForestHauser 9 місяців тому +2

    Hey Hamed! This is an extremely helpful video and I thank you very much for sharing. I just had one question: Why is it you're defining your zod schema for a second time inside your RhfWithAction component rather than using the same schema as defined in @/lib/schema?

    • @hamedbahram
      @hamedbahram  9 місяців тому +1

      No specific reason 😊 you can define all schemas in your lib and use that every where.

    • @TylerForestHauser
      @TylerForestHauser 9 місяців тому +1

      Sounds great! Thank you very much! @@hamedbahram

  • @ricardoscarpim3183
    @ricardoscarpim3183 8 місяців тому +1

    So sorry for the question, but do you have any tutorial to how to use actions with a form to update information, for example a link that i can click and a form with all the information will be loaded and I can start alter data and then save using actions? Thank you so much for your consideration

    • @hamedbahram
      @hamedbahram  8 місяців тому

      I'm not sure if I understand the question correctly. Did you mean using server actions?

  • @leonardshayo7903
    @leonardshayo7903 2 місяці тому +1

    can someone explain why we need to validate our data with Zod in both the react form hook and also in the server action? Thanks in advance

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

      You should always validate any data coming from the user (the client-side), so that explains the validation on the server-side. The extra validation on the client-side using reac-hook-form is to avoid hitting the server unnecessarily if the data is not valid.

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

    Currently, I am using Next as a BFF with Express as my back-end handling requests using Axios inside of my front-end. Is it worth using server actions in my case? I'd basically be using Axios in the action file to fetch data from Express then send it back to the front-end. I'm not sure if this would simplify things or just shift everything and be awkward.

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

      Server actions are meant to eliminate the need for an API layer to handle form submissions and/or data mutation on the server. In your case, with a separate backend API it won't do that.

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

      @@hamedbahram thanks. I thought that might be the case.

  • @vishnumouli
    @vishnumouli 6 місяців тому +1

    Can you please help me here. Im getting Unhandled Runtime Error.
    (0,react_hook_form__WEBPACK_IMPORTED_MODULES_5__.useForm) is not a function.
    And in the terminal im getting
    Attempted import error:"useForm" is not exported from 'react_hook_form'(imported as 'useForm')

    • @hamedbahram
      @hamedbahram  6 місяців тому +1

      Not sure why that is but are you importing the `useForm` hook in a client component?

    • @vishnumouli
      @vishnumouli 6 місяців тому +1

      @@hamedbahram thanks for the suggestion. I don't use client

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

    Good Tutorial for server action and react hook form.
    Can you also create a tutorial to upload profile picture using the react hook form?

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

      Thanks! I do have a video for file upload using server actions, which you can easily extend to add react-hook-forms to it.

  • @TheSamirux
    @TheSamirux 9 місяців тому +1

    Thank you!!!

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

    Hi! I'm having a little trouble with this. Let's say i have 3 buttons that all share the same state but have different values. This is what it looks on the interface => state: "SOON" | "COMPLETED" | "IN PROGRESS" | "".
    How do i represent this on zod? with enums? Regardless of what button i click it keeps returning COMPLETED. This is what it looks on my schema:
    state: z
    .enum(["COMPLETED", "IN PROGRESS", "SOON", ""], {required_error: "This field is required", invalid_type_error: "State must be a string",})
    .default("")
    And here is an example of the first button:
    text here
    Im just really confused and i cant find any videos that use a similar approach. Tried asking on the discord zod server yesterday and also trying to find something on the documentation but I'm not sure on how to proceed. I can tell everything is wrong but this is where im at 😟

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

      I'm not sure if I understand three buttons that share the same state and have different values, can you explain what you mean? Are these to buttons used to changed the state to different values? I wouldn't use the `register` function on a button you can just pass a `onClick` event listener to change the state to the desired value for each of the three buttons; And if this is part of your form state you can use the `setValue` function returned form the `useForm` hook to set the state.

    • @tree9437
      @tree9437 7 місяців тому

      ​@@hamedbahram I'm glad that you suggested to use 'setValue' because that's exactly what I did
      I was very confused on how to approach it until i casually crossed path with setValue. Although i already solved it this message helped me reassure that what i did was the right thing.
      The form is to create displayable data about the progress of an app.
      One of the fields has 3 similar buttons and all use the state value which let the user know if the app is completed, in progress or soon to be made. This is what i ended up doing:
      {
      setValue("state", "COMPLETED");
      setActive("COMPLETED");
      }}
      className={`
      ${
      active === "COMPLETED"
      ? "font-bold bg-completed rounded-full p-3 cursor-pointer"
      : "cursor-pointer p-3"
      } text-sm`}
      >
      text from 18n here.
      And in the schema instead of using enum or anything i just used string() with errors.

  • @ThomasTridon
    @ThomasTridon 28 днів тому

    Hello. I don't get why use Zod when React-Hook-Form already has a great validation process, with error messages. What does Zod bring to the table?

    • @hamedbahram
      @hamedbahram  28 днів тому

      I think the built-in validation is limited to the html5 form validations, while zod is a full on schema validation tool. You can use whichever satisfies your requirement.

  • @RegalWK
    @RegalWK 9 місяців тому +1

    could you show also with trpc and zod (specially with safeParse) and optionally drizzle?

    • @hamedbahram
      @hamedbahram  9 місяців тому

      I'll have that in mind for future videos.

  • @ilya5734
    @ilya5734 19 днів тому

    As per my understanding, 'useFormStatus' is applicable only with the 'action' prop of the element and not with the 'onSubmit' handler. In this scenario, what would be the appropriate method for disabling the button?

    • @hamedbahram
      @hamedbahram  19 днів тому

      Good question! you can use the `useFormStatus` to get the pending state. See this video → ua-cam.com/video/uAh6ZOytUDk/v-deo.html

    • @ilya5734
      @ilya5734 18 днів тому

      @@hamedbahram But as I mentioned, 'useFormStatus' only works with the 'action' prop of the element. It does not work with 'onSubmit', and we cannot use the 'action' prop due to our use of React Hook Form. Is that correct?

    • @hamedbahram
      @hamedbahram  18 днів тому +1

      @@ilya5734 In that case you can use the `isSubmitting` value from the `formState` property return by the `useForm` hook. See here → react-hook-form.com/docs/useform/formstate

    • @ilya5734
      @ilya5734 18 днів тому

      ​@@hamedbahram it works, many thanks!

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

    always awesome! can you cover this topics ?
    - data fetching with server components,
    - search params api,
    - Show pending ui when i search something,

    • @hamedbahram
      @hamedbahram  10 місяців тому +2

      Thanks for the ideas! I do have videos covering data fetching in server components, and working with the `searchParams` object for search and pagination, so you can find and watch those. I'm currently working on a video for the pending UI while searching, and it'll come out soon.

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

      wow, Glad to hear

  • @omarsaggou8289
    @omarsaggou8289 6 місяців тому +1

    i can't initial my form inputs values while usinf defaulvalues of useForm with nextui inputs
    const {
    register,
    handleSubmit,
    control,
    reset,
    formState: { errors }
    } = useForm({
    defaultValues: {
    child: "dd",
    name: "dddd",
    parent: 'refff'
    },
    mode: 'onSubmit',
    resolver: zodResolver(categorySchema),
    // name input

    • @hamedbahram
      @hamedbahram  6 місяців тому

      You have to pass `defaultValue` to NextUI `Input` element. You can use the `getValues("name")` function from `useForm` to get the value and pass it to the `defaultValue` prop.

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

    Great!

  • @nickwoodward819
    @nickwoodward819 18 днів тому

    Just came from your useFormState vid, knew you'd have a video on this :) Just wondering what your thoughts are between the two approaches? I assume they aren't complementary? Sorry, am new to nextjs

    • @hamedbahram
      @hamedbahram  18 днів тому

      No they don't really complement each other, other than the fact that you can call a server action in your submit handler. But the idea of the new hooks in React/NextJs is that it simplifies a lot of code you have to write to manage your form, loading and error state on top of an API endpoint.

    • @nickwoodward819
      @nickwoodward819 18 днів тому

      @@hamedbahram Thanks for the reply :)

  • @user-es9oc8gb3u
    @user-es9oc8gb3u 5 місяців тому +1

    Thanks Hamed. It was insightful. Could have been better adjusting you mic volume to a higher level! :)

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

      You're welcome! Noted, thanks for the feedback.

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

    thank you

  • @user-xq2pi3bu4y
    @user-xq2pi3bu4y 9 місяців тому +1

    is it possible to use Zod withOUT typescript??? thx

    • @hamedbahram
      @hamedbahram  9 місяців тому +1

      Yes, Zod is a schema validation tool, you don't have to use it with TS.

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

    So, will that work if javascript is disabled ?

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

      Not if you're using react-hook-form since it's a client-side hook :)

  • @Racine14
    @Racine14 6 місяців тому

    How to upload a file using nextjs

    • @hamedbahram
      @hamedbahram  6 місяців тому

      Where are you uploading to?

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

    Would you please add file upload example with same stack?

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

      Absolutely, I'll have that in mind.