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.