react-router v4 默认页面(未找到页面)

IT技术 reactjs react-router
2021-04-12 02:41:04

这是常见的目的,将不匹配的请求定向到 notfound 页面。

使用 react-router v4 使它看起来像以前的版本,我希望这个示例在下面工作。链接工作正常,但我希望 NotFound 组件只调用了未知的 url 请求;但它总是在那里。

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

在此处输入图片说明 在此处输入图片说明

它因为path="*"代表所有请求和未找到的组件总是在那里,但我怎么能说隐藏这个组件以获得有效的 url 路径?

6个回答

React Router 的No Match文档涵盖了这一点。您需要导入<Switch>组件,然后您可以path完全删除该属性。

A<Switch>呈现<Route>匹配的第一个孩子A<Route>没有路径总是匹配

这是使用的示例:

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

因此,在您的情况下,您只需删除path="*"并引入<Switch>

<Switch>
  <Route exact path="/" component={Home}/>
  <Route path="/user" component={User}/>
  <Route component={Notfound} />
</Switch>

请记住在Switch您的import声明中包含在顶部。

但是如何为我的 404 选择位置路径?
2021-05-26 02:41:04
像魅力一样工作,谢谢!iǘe 刚刚找到了一篇很棒且有用的帖子,只是为了补充有关 react-routes v4 的更多信息 - medium.com/@pshrmn/...
2021-06-02 02:41:04

这是我的解决方案,包含两个组件。

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>

那份工作对我来说是完美的。谢谢。

404位置路径怎么改写
2021-06-11 02:41:04
很简单,只要你在最后有一个开关,就放一个 <Route component={NotFoundRedirect} /> 并且总是有一个 404 重定向。谢谢
2021-06-16 02:41:04

此方法完美运行,如果 url 不存在或为 false,则允许进行重定向

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/sorties-scolaires" component={SortiesScolaires} />
        <Route path="/voyages-entreprise" component={VoyagesEntreprise} />
        <Route path="*">
          <Redirect to="/" />
        </Route>
      </Switch>
    </Router>
  );
}

尽管接受解决方案确实提供了答案,但是当您嵌套路由时它不起作用

例如,如果Home组件具有嵌套的 Routes 之类的/home/dashboard并且如果访问的 url 是/db,则它NotFound只会在 Route 部分中显示一个组件,而不是整个页面。

为避免这种情况,您可以对使用组件和提供程序进行非常简单的调整

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;

然后你可以像这样使用它

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>

并在 Home 组件中

render() {
    return (
         <Switch>
               <Route path="/home" component={NewHome} />
               <Route path="/dashboard" component={Dashboard} />
               <NoMatch />
         </Switch>
    )
}

react-router v6

我知道这是 Router v4 的一个问题,但是由于v6出来了,要重定向和导航到我们选择的路由之一,我们可以使用<Navigate>React Router 中的组件。

例子:

<Router>
  <Routes>
    <Route path="users" element={<Users />} />
    <Route path="posts" element={<Posts />} />
  </Routes>
</Router>

现在我们可以在我们的路由配置下面声明空路由的情况,如下所示:

<Router>
  <Routes>
    <Route path="users" element={<Users />} />
    <Route path="posts" element={<Posts />} />
    <Route path="" element={<Navigate to="/users" />} />
  </Routes>
</Router>

现场演示:使用 React Router 重定向默认或 404 路由