C'est un objectif commun, diriger la demande d'annulation de la correspondance vers la page non trouvée.
en faisant cela avec react-router v4 ressemble aux versions précédentes et je m'attends à ce que cet exemple fonctionne ci-dessous. Les liens fonctionnent bien, mais je suppose que le composant NotFound appelé uniquement l’URL inconnue est demandé; mais c'est toujours là.
import {
BrowserRouter as Router,
Route,
Link
} from 'react-router-dom'
class Layout extends Component {
render() {
return (
<Router>
<div className="App">
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/user">User</Link></li>
</ul>
<Route exact path="/" component={Home}/>
<Route path="/user" component={User}/>
<Route path="*" component={Notfound}/>
</div>
</Router>
);
}
}
sa depuis path="*"
représente toute la requête et le composant non trouvé toujours là, mais comment puis-je dire cacher ce composant pour le chemin d'URL valide?
Le routeur réagit aucune correspondance documentation couvre cela. Vous devez importer le composant <Switch>
, puis vous pouvez supprimer complètement l'attribut path
.
Un
<Switch>
restitue le premier enfant<Route>
qui correspond. Un<Route>
sans chemin correspond toujours
C'est l'exemple qui utilise:
<Router>
<div>
<Switch>
<Route path="/" exact component={Home}/>
<Redirect from="/old-match" to="/will-match"/>
<Route path="/will-match" component={WillMatch}/>
<Route component={NoMatch}/>
</Switch>
</div>
</Router>
Donc, dans votre cas, il vous suffirait de déposer le path="*"
et d’en introduire le <Switch>
:
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/user" component={User}/>
<Route component={Notfound} />
</Switch>
N'oubliez pas d'inclure Switch
dans votre déclaration import
en haut.
c'est ma solution avec deux composants.
const NotFound = () => <div>Not found</div>
const NotFoundRedirect = () => <Redirect to='/not-found' />
//root component
<Switch>
<Route path='/users' component={UsersPages} />
<Route path='/not-found' component={NotFound} />
<Route component={NotFoundRedirect} />
</Switch>
//UsersPages component
<Switch>
<Route path='/home' component={HomePage} />
<Route path='/profile' component={ProfilePage} />
<Route component={NotFoundRedirect} />
</Switch>
Ce travail est parfait pour moi. Merci.
Bien que la solution accept donne la réponse, mais cela ne fonctionnerait pas si vous avez des routes imbriquées.
Par exemple, si le composant Home
contient des itinéraires imbriqués tels que /home
, /dashboard
et si l'URL visitée est /db
, elle affichera un composant NotFound
au sein de la section Route, mais pas la page dans son ensemble.
Pour éviter cela, vous pouvez utiliser un Tweak très simple d'utilisation d'un composant et d'un fournisseur.
const NoMatch = (props) => (
<Redirect to={{state: {noMatch: true}}} />
)
const ProviderHOC = (NotFoundRoute) => {
const RouteProvider = (props) => {
if(props.location && props.location.state && props.location.noMatch) {
return <NotFoundRoute {...props} />
}
return props.children;
}
return withRouter(RouteProvider)
}
export default ProviderHOC;
Et puis vous pouvez l'utiliser comme
const RouteManager = ProviderHOC(NotFoundComponent);
<Router>
<RouteManager>
<Switch>
<Route path="/" exact component={Home}/>
<Redirect from="/old-match" to="/will-match"/>
<Route path="/will-match" component={WillMatch}/>
<NoMatch />
</Switch>
</RouteManager>
</Router>
et dans la composante d'accueil
render() {
return (
<Switch>
<Route path="/home" component={NewHome} />
<Route path="/dashboard" component={Dashboard} />
<NoMatch />
</Switch>
)
}
Cela ne fonctionne pas pour moi, en particulier on utilise ceci config
Je dois donc vérifier le chemin dans la fonction de rendu du composant Homepage. Quelque chose comme ça:
render(){
const {match, location, history} = this.props;
if (location.pathname === '/'){
return (<div>Home</div>)
}else{
return null
}
}