Last updated: Apr 7, 2024
Reading timeยท3 min

To get the value of an input on button click in React:
onClick prop to a button element.import {useState} from 'react'; const App = () => { const [message, setMessage] = useState(''); const handleChange = event => { setMessage(event.target.value); console.log('value is:', event.target.value); }; const handleClick = event => { event.preventDefault(); // ๐๏ธ Value of input field console.log('handleClick ๐๏ธ', message); }; return ( <div> <input type="text" id="message" name="message" onChange={handleChange} value={message} autoComplete="off" /> <h2>Message: {message}</h2> <button onClick={handleClick}>Click</button> </div> ); }; export default App;

We used the useState hook to track the value of the input field.
const [message, setMessage] = useState('');
onChange prop on the field, so every time its value changes, the handleChange function is invoked.<input type="text" id="message" name="message" onChange={handleChange} value={message} autoComplete="off" />
We can access the value of the input element as event.target.value in the
handleChange function.
const handleClick = event => { event.preventDefault(); // ๐๏ธ Value of input field console.log('handleClick ๐๏ธ', message); };
target property on the event object refers to the input element.You can use the message state variable to access the value of the input field
anywhere outside the handleChange function.
onClick prop on the button element. Every time the button is clicked, the handleClick function is invoked.To get the value of the input field on button click, we simply access the
message state variable in our handleClick function.
If you need to turn off autocomplete on an input field, check out the following article.
Alternatively, you can use an uncontrolled input field.
To get the value of an uncontrolled input on button click:
useRef hook and set it on the input field.onClick prop to a button element.ref.current.value.import {useRef} from 'react'; const App = () => { const inputRef = useRef(null); function handleClick() { // ๐๏ธ Access input value console.log(inputRef.current.value); } return ( <div> <input ref={inputRef} type="text" id="message" name="message" autoComplete="off" /> <button onClick={handleClick}>Log message</button> </div> ); }; export default App;

The example above uses an uncontrolled input. Notice that the input field
doesn't have an onChange prop or value set.
<input ref={inputRef} type="text" id="message" name="message" autoComplete="off" />
defaultValue prop. However, this is not necessary and you can omit the prop if you don't want to set an initial value.When using uncontrolled input fields, we access the input using a ref.
The useRef() hook can be passed an initial value as an argument. The hook
returns a mutable ref object whose .current property is initialized to the
passed argument.
const inputRef = useRef(null);
current property on the ref object to get access to the input element on which we set the ref prop.function handleClick() { // ๐๏ธ Access input value console.log(inputRef.current.value); }
When we pass a ref prop to an element, e.g. <input ref={myRef} />, React sets
the .current property of the ref object to the corresponding DOM node.
useRef hook creates a plain JavaScript object but gives you the same ref object on every render. In other words, it's pretty much a memoized object value with a .current property.It should be noted that when you change the value of the current property of
the ref, no re-renders are caused.
Every time the user clicks on the button in the example, the value of the uncontrolled input gets logged.
You shouldn't set the value prop on an uncontrolled input (an input field that
doesn't have an onChange handler) because that would make the input field
immutable and you wouldn't be able to type in it.