Link ativo com React-Router?

91

Eu estou tentando sair Reagir-Router (v4) e estou tendo problemas começam fora do Nav ter um dos Link's Seja active. Se eu clicar em qualquer uma das Linktags, o material ativo começa a funcionar. No entanto, gostaria que o Home Linkficasse ativo assim que o aplicativo iniciar, pois é o componente que carrega na /rota. Há alguma maneira de fazer isso?

Aqui está meu código atual:

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>
)
Saad
fonte

Respostas:

217

<Link>não tem mais as propriedades activeClassNameou activeStyle. No react-router v4, você deve usar <NavLink>se quiser fazer um estilo condicional:

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>
)

Eu adicionei uma propriedade exata à casa <NavLink>, tenho quase certeza de que, sem ela, o link da casa estaria sempre ativo, pois /corresponderia a /abouttodas as outras páginas que você tiver.

trabalho
fonte
2
Eu esqueci esta resposta hoje porque pensei que usar o NavLink estava evitando o problema à primeira vista. É difícil encontrar qualquer outro lugar que explique isso. As pessoas precisam votar positivamente nesta resposta porque ele está exatamente certo. você tem que usar o NavLink. ALÉM DISSO! o exato = {verdadeiro} também é exatamente correto. Caso contrário, o primeiro link renderizado não será renderizado novamente quando você clicar em outros links, fazendo com que a página inicial esteja sempre ativa. Eu gostaria de poder votar em você mais 10 vezes.
wuno
4
Apenas uma nota rápida, se você estiver usando React com Redux, você precisa seguir este github.com/ReactTraining/react-router/blob/master/packages/…
Petr Adam
1
No caso de rotas aninhadas, você pode precisar usar exactpara o NavLinktambém.
Wiktor Czajkowski
1
Obrigado por esse link, @PetrAdam - queria saber por que isso não estava funcionando! (a solução é encerrar a connectchamada com withRouter).
Brian Burns
1
Para evitar o redux bloqueando uma re-renderização, você pode fornecer a opção pure: falseao connect()método. Mais informações sobre uma visualização que não está sendo atualizada: https://github.com/reduxjs/react-redux/blob/master/docs/trou
troubleshooting.md