106 votes

Lien actif avec React-Router ?

Je suis en train d'essayer React-Router (v4) et j'ai des problèmes pour démarrer le Nav afin d'avoir l'un des éléments de la base de données. Link L'être active . Si je clique sur l'un des Link tags, puis les trucs actifs commencent à fonctionner. Cependant, j'aimerais que Home Link doit être actif dès le démarrage de l'application, car c'est le composant qui se charge à l'ouverture de l'application. / route. Y a-t-il un moyen de faire cela ?

Voici mon code actuel :

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClassName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClassName='is-active' to='/about'>About</Link>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

259voto

worc Points 1393

<Link> n'a plus le activeClassName o activeStyle propriétés. Dans react-router v4 vous devez utiliser <NavLink> si vous voulez faire du style conditionnel :

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact={true} activeClassName='is-active' to='/'>Home</NavLink>
        <NavLink activeClassName='is-active' to='/about'>About</NavLink>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

J'ai ajouté une propriété exacte à la maison <NavLink> je suis presque sûr que sans cela, le lien d'accueil serait toujours actif puisque / correspondrait à /about et toutes les autres pages que vous avez.

5 votes

J'ai négligé cette réponse aujourd'hui car je pensais que l'utilisation de NavLink permettait d'éviter le problème à première vue. Il est difficile de trouver un autre endroit qui explique cela. Les gens doivent upvoter cette réponse parce qu'il a exactement raison. Vous devez utiliser NavLink. AUSSI ! l'option exact={true} est également tout à fait correcte. Sinon, le premier lien qui est rendu ne sera pas rendu à nouveau lorsque vous cliquez sur d'autres liens, ce qui fait que la page d'accueil sera toujours active. J'aimerais pouvoir vous upvoter 10 fois de plus.

4 votes

Juste une petite note, si vous utilisez React avec Redux, vous devez suivre ceci github.com/ReactTraining/react-router/blob/master/packages/

1 votes

Dans le cas de routes imbriquées, vous devrez peut-être utiliser exact pour le NavLink aussi.

15voto

Nick Points 23

React Router v6 :

Source : Classes NavLink actives avec React Router

Vous pouvez maintenant utiliser le className qui accepte désormais une fonction et transmet un isActive propriété booléenne, comme ceci :

<NavLink
  to="users"
  className={({ isActive }) => (isActive ? 'active' : 'inactive')}
>
  Users
</NavLink>

Vous pouvez également ajouter plusieurs classes, puisque v6 est sorti :

<NavLink
  to="users"
  className={({ isActive }) =>
    isActive ? 'bg-green-500 font-bold' : 'bg-red-500 font-thin'
  }
>
  Users
</NavLink>

Démonstration en direct : Classes NavLink actives avec React Router

1voto

eneski Points 764

En complément de la réponse de @Nick (React Router v6), pour ceux qui ont besoin de l'état de la navigation active dans le contexte supérieur

Le rendu conditionnel pourrait être un cas d'utilisation pour ce besoin. Par exemple : si l'icône est active, l'icône remplie est rendue sinon l'icône normale est rendue.

On pourrait y parvenir en trouvant la route dans laquelle nous nous trouvons actuellement, puis en effectuant l'opération de rendu conditionnel, mais ce serait un peu lourd.

Au lieu de cela, nous pouvons écrire une fonction qui modifie l'état dans Navlink L'accessoire de style de l'entreprise est le suivant

  const [active, setActive] = useState('home')

  const activate = (isActive, path, activeStyle, nonActiveStyle) => {
    if (isActive) {
      setActive(path)
      return activeStyle
    }
    return nonActiveStyle
  }

  return (
    <nav>
      <NavLink
        to="/"
        style={(activeNav) => activate(activeNav.isActive, 'home')}
      >
        {active === 'home' ? <HomeFill /> : <Home />}
      </NavLink>
      <NavLink
        to="/profile"
        style={(activeNav) => activate(activeNav.isActive, 'profile')}
      >
        {active === 'profile' ? <ProfileFilled /> : <Profile />}
      </NavLink>
    </nav>
  )

1voto

Nima Points 23

Dans mon cas <NavLink /> automatiquement active aux éléments, j'utilise donc la méthode suivante

monComponet.js

<ListItem component={NavLink} to="/somewhere" className="myactive" > something </ListItem>

monStyle.css

a.active.myactive {
 // some styles
}

0voto

Dalmo Points 1
import { NavLink, useMatch, useResolvedPath } from 'react-router-dom';

const CustomNavLink = ({ to, title }) => {
   let resolved = useResolvedPath(to);
   let match = useMatch({ path: resolved.pathname, end: true });

   return (
      <NavLink to={to} className={`d-flex align-items-center py-2 px-4 ${match ? 'cta-btn' : 'c-n-b-link'}`} >
        <span className='ms-1 f-w-600'>{title}</span>
      </NavLink>
)
}

Para React router V6 Le composant personnalisé ci-dessus renverra un lien de navigation qu'une classe active pourra activer lorsque le chemin correspondra à l'adresse donnée. to chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X