Reputation: 5508
When you click a link, the browser tries to redirect the user ASAP. How can I add a 1 second delay to this process?
I have the following link:
<Link
to={{
pathname: `pathname`,
hash: `#hash`,
}}
onClick={this.delayRedirect}
>
Here is what my delayRedirect function looks like:
delayRedirect() {
// not sure what to put here, to delay the redirect by 1 second
}
Any ideas? Thanks!
Upvotes: 4
Views: 16329
Reputation: 11
Use setTimeout inside useEffect or an event handler to delay. For example,
setTimeout(() => navigate('/new-page'), 2000);
Upvotes: 0
Reputation: 271
Install module
npm install p-min-delay
npm i @loadable/component
And Import like
import loadable from '@loadable/component'
import pMinDelay from 'p-min-delay'
Upvotes: 1
Reputation: 21
Based on Pedro's answer, here's a way to add the delayAndGo function inside a component like a NavBar:
import React from "react";
import { Link, useHistory } from "react-router-dom";
export default function NavBar() {
const history = useHistory();
function delayAndGo(e, path) {
e.preventDefault();
// Do something..
setTimeout(() => history.push(path), 300);
}
return (
<Link to="/" onClick={(e) => delayAndGo(e, "/")}>
Home
</Link>
<Link to="/about" onClick={(e) => delayAndGo(e, "/about")}>
About
</Link>
<Link to="/portfolio" onClick={(e) => delayAndGo(e, "/portfolio")}>
Portfolio
</Link>
);
}
Note the to
value of the Link
elements do not matter in this approach.
Upvotes: 2
Reputation: 135
Here is my function component version, based on @Shishir's answer:
import React from "react";
import { Link, useHistory } from "react-router-dom";
export default function CustomLink({ to, children }) {
const history = useHistory();
function delayAndGo(e) {
e.preventDefault();
// Do something..
setTimeout(() => history.push(to), 300);
}
return (
<Link to={to} onClick={delayAndGo}>
{children}
</Link>
);
}
Upvotes: 5
Reputation: 5923
import { withRouter } from 'react-router'
class Home extends Component {
delayRedirect = event => {
const { history: { push } } = this.props;
event.preventDefault();
setTimeout(()=>push(to), 1000);
}
};
<Link
to={{
pathname: `pathname`,
hash: `#hash`,
}}
onClick={this.delayRedirect}
>
}
export default withRouter(Home);
Use history to push new route after a gap of second
Upvotes: 5