Ralph David Abernathy
Ralph David Abernathy

Reputation: 5508

How to delay the redirect of a React Router Link component for 1 second?

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

Answers (5)

DushyanthaAT
DushyanthaAT

Reputation: 11

Use setTimeout inside useEffect or an event handler to delay. For example,

setTimeout(() => navigate('/new-page'), 2000);

Upvotes: 0

asad minhas
asad minhas

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

Kenny Lepping
Kenny Lepping

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

Pedro Netto
Pedro Netto

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

Shishir Arora
Shishir Arora

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

Related Questions