- I have a parent app which contains a handler function (handleChallengeSave).
- The handler function triggers a useState (setSavedChallenge) in the parent.
- The handler function is passed down as props to the child.
I’m getting an ‘Unhandled Rejection (TypeError): X is not a function’ error. However if I change nothing other than moving the state to the child, it works.
Eg:
This doesn’t work:
Parent (App.js)
const App = () => {
const [savedChallenge, setSavedChallenge] = useState("");
const handleChallengeSave = (challenge) => {
setSavedChallenge(challenge);
};
return (
<>
<Router>
<Route
path="/"
exact
component={Home}
handleChallengeSave={handleChallengeSave}
/>
</Router>
</>
);
};
The Child (Home.js)
const Home = ({ handleChallengeSave }) => {
const getRequestUserChallengeDb = async () => {
await axios
.get(`${USER_CHALLENGE_DB_LINK}/${STRAVA_ID}`)
.then((res) => {
if (res.status === 200) {
console.log("Yes keen bean! You're in a challenge.");
let yourCurrentChallenge = res.data.currentChallenge;
handleChallengeSave(yourCurrentChallenge);
}
if (res.status === 201) {
console.log(
"You ain't in a challenge mate. Head to the challenges page to join one!"
);
}
})
.catch((error) => {
throw error;
});
};
getRequestUserChallengeDb();
return (
<>
<Navbar />
<div className="homepage_container">
<h2>Hi {window.localStorage.firstName}</h2>
</div>
<Challengebutton />
</>
);
};
export default Home;
Any help MUCH appreciated!
Advertisement
Answer
Issue
The Route component doesn’t pass additional props on to children.
Solution
Render Home on the render prop to pass in additional props.
<Router>
<Route
path="/"
exact
render={(routeProps) => (
<Home
{...routeProps}
handleChallengeSave={handleChallengeSave}
/>
)}
/>
</Router>
Or render Home as a child component.
<Router>
<Route
path="/"
exact
>
<Home
{...routeProps}
handleChallengeSave={handleChallengeSave}
/>
</Route>
</Router>