Reagir: diferença entre <caminho exato da rota = "/" /> e <caminho da rota = "/" />

161

Alguém pode explicar a diferença entre

<Route exact path="/" component={Home} />

e

<Route path="/" component={Home} />

Eu não sei o significado de 'exato'

batt
fonte
1
As respostas são ótimas. No entanto, pode-se ter uma dúvida como "Por que não podemos ter <code> exato </code> para todas as rotas então?" Imagine um URL que é algo como isto. <code> yourreactwebsite.com/getUsers/userId= ? </code> Este é um exemplo em que o ID do usuário será alimentado dinamicamente na URL e, portanto, não podemos usar o <code> exato </code> prop no seu roteador aqui.
VIJAYKUMAR REDDY ALAVALA

Respostas:

263

Neste exemplo, nada realmente. O exactparâmetro entra em ação quando você tem vários caminhos com nomes semelhantes:

Por exemplo, imagine que tivéssemos um Userscomponente que exibisse uma lista de usuários. Também temos um CreateUsercomponente usado para criar usuários. O URL para CreateUsersdeve ser aninhado em Users. Portanto, nossa configuração pode ser algo assim:

<Switch>
  <Route path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Agora, o problema aqui, quando formos ao http://app.com/usersroteador, percorrerá todas as nossas rotas definidas e retornará a PRIMEIRA correspondência que encontrar. Portanto, nesse caso, ele encontraria a Usersrota primeiro e depois a retornaria. Tudo bom.

Mas, se formos http://app.com/users/create, ele percorrerá novamente todas as rotas definidas e retornará a PRIMEIRA correspondência encontrada. O roteador React faz uma correspondência parcial, correspondendo /usersparcialmente /users/create, para que retornasse incorretamente a Usersrota novamente!

O exactparâmetro desativa a correspondência parcial para uma rota e garante que ela só retorne a rota se o caminho for uma correspondência EXATA para o URL atual.

Portanto, neste caso, devemos adicionar exactà nossa Usersrota para que ela corresponda apenas em /users:

<Switch>
  <Route exact path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Os documentos explicam exactem detalhes e dão outros exemplos.

Chase DeAnda
fonte
11
"Mas, se acessássemos app.com/users/create , ele passaria novamente por todas as rotas definidas e retornaria a PRIMEIRA correspondência que encontrar". - de fato, ele retornará todas as rotas para as quais encontrou uma correspondência (total ou parcial). O comportamento descrito por @Chase DeAnda acontecerá apenas se os <Route> estiverem entre uma tag <Switch>.
Watsabitz
4
exactdeve ser o padrão na minha opinião
Alexander Derck 12/03/19
Que tal se tivermos cada definição de rota em componentes diferentes, quero dizer /admin//usersno componente Admin e /admin/users/createno componente Raiz ??? Atualmente, estou com essa situação e a exactsolução típica não funciona corretamente.
Yulio Aleman Jimenez 27/09/19
Eu acho que esse comportamento só funciona se ambas as rotas estão no mesmo nível de seu interruptor pai (ou componente)
Yulio Aleman Jimenez
1
@ChaseDeAnda o que eu preciso é exatamente o oposto. Talvez eu deva escrever uma nova resposta no SO para esclarecer minha situação e obter respostas apropriadas.
Yulio Aleman Jimenez 28/09/19
7

Em resumo, se você tiver várias rotas definidas para o roteamento do seu aplicativo, inclua um Switchcomponente como este;

<Switch>

  <Route exact path="/" component={Home} />
  <Route path="/detail" component={Detail} />

  <Route exact path="/functions" component={Functions} />
  <Route path="/functions/:functionName" component={FunctionDetails} />

</Switch>

Então você deve colocar a exactpalavra-chave na Rota, cujo caminho também é incluído no caminho de outra Rota. Por exemplo, o caminho inicial /é incluído em todos os caminhos, portanto, é necessário ter uma exactpalavra-chave para diferenciá-lo de outros caminhos que começam com /. O motivo também é semelhante ao /functionscaminho. Se você quiser usar outro caminho de rota como /functions-detailou /functions/open-doorque inclua /functionsnele, será necessário usá-lo exactpara a /functionsrota.

milkersarac
fonte
-1

A resposta mais curta é

Por favor, tente isso.

<switch>
   <Route exact path="/" component={Home} />
   <Route path="/about" component={About} />
   <Route path="/shop" component={Shop} />
 </switch>
Jamal Sheikh Ali
fonte
1
Isso basicamente não faz nada para explicar o significado do exactatributo / suporte e, portanto, certamente não é uma "resposta". Você deve tentar resolver a questão que está sendo efetivamente perguntada, em vez de dar uma solução para um problema que você não tem certeza de que o OP realmente possui.
Victor Zamanian 14/07