Last updated: Apr 6, 2024
Reading time·2 min
onClick
listener to be a function errorThe error "Expected onClick
listener to be a function" occurs when we pass a
value that is not a function to the onClick
prop of an element.
To solve the error, make sure to only pass functions to an element's onClick
prop.
Here is an example of how the error occurs.
const App = () => { // ⛔️ Warning: Expected `onClick` listener to be a function // instead got a value of `string` type. return ( <div> <button onClick="console.log('Click')">Click</button> </div> ); }; export default App;
We passed a string to the button's onClick
prop when a
function is expected.
onClick
propTo solve the error, make sure to pass a function to the element's onClick
prop.
const App = () => { const handleClick = () => { console.log('button clicked'); }; return ( <div> <button onClick={handleClick}>Click</button> </div> ); }; export default App;
We passed a function to the element's onClick
prop which resolved the error.
However, notice that we aren't calling the function when passing it to the prop.
We are passing a reference to the function, not the result of calling the function.
onClick
propA common thing you have to do is pass an argument to the event handler. You can do that by using an inline arrow function.
import {useState} from 'react'; const App = () => { const [count, setCount] = useState(0); const handleClick = (event, num) => { console.log(event.target); console.log('button clicked'); setCount(count + num); }; return ( <div> <h2>{count}</h2> <button onClick={event => handleClick(event, 100)}>Click</button> </div> ); }; export default App;
The handleClick
function is called with the event
object and a number
parameter.
Notice that we aren't passing the result of calling the handleClick
function
to the onClick
prop.
We are actually passing it a function that takes an event
object as a
parameter and returns the result of calling the handleClick
function with the
event
and the number 100
as arguments.
It is very important to not pass the result of calling the handleClick
function to the onClick
prop because then the function would get invoked
immediately as the page loads and that
could cause an infinite re-render loop.