Roberto Conte Rosito


How to use useRef with React Hook Form

Welcome back to my dev notes!

Today I was in trouble for a while because I wanted to use a ref inside a React-Hook-Form form with an input of type file and I couldn’t do it.

The problem was quite simple, suppose you have a form like this:

const { register } = useFormContext();
const fileInputRef = useRef(null);
const handleClick = useCallback(() => {
  fileInputRef.current.click();
}, [fileInputRef]);
return (
  <>
    <input type="file" ref={fileInputRef} {...register("file")} />
    <button onClick={handleClick}>Upload</button>
  </>
);

And guess what? It didn’t work. The fileInputRef was null inside the handleClick function and I couldn’t understand why. After googling for a while I found the solution: you have to use the register method in a different way to make it work:

const { register } = useFormContext();
const { ref, ...inputProps } = register("file");
const fileInputRef = useRef(null);
const handleClick = useCallback(() => {
  fileInputRef.current.click();
}, [fileInputRef]);

return (
  <>
    <input
      type="file"
      ref={(e) => {
        fileInputRef.current = e;
        ref(e);
      }}
      {...inputProps}
    />
    <button onClick={handleClick}>Upload</button>
  </>
);

I hope this will help you if you are in trouble with refs and React Hook Form.

Notes: this is a dev note, not a tutorial. If you want to learn more about React Hook Form, check out the official documentation.

comments powered by Disqus