React-Router: No Not Found Route?

2022-08-30 01:32:46

请考虑以下事项:

var AppRoutes = [
    <Route handler={App} someProp="defaultProp">
        <Route path="/" handler={Page} />
    </Route>,

    <Route  handler={App} someProp="defaultProp">
        <Route path="/" handler={Header} >
            <Route path="/withheader" handler={Page} />
        </Route>
    </Route>,

    <Route handler={App} someProp="defaultProp">
        <Route path=":area" handler={Area} />
        <Route path=":area/:city" handler={Area} />
        <Route path=":area/:city/:locale" handler={Area} />
        <Route path=":area/:city/:locale/:type" handler={Area} />
    </Route>
];

我有一个应用程序模板,一个标题模板和具有相同处理程序的参数化路由集(在应用程序模板中)。我希望能够在找不到某些内容时为404路线提供服务。例如,/CA/SanFrancisco 应由 Area 查找和处理,而 /SanFranciscoz 应为 404。

以下是我如何快速测试路线。

['', '/', '/withheader', '/SanFranciscoz', '/ca', '/CA', '/CA/SanFrancisco', '/CA/SanFrancisco/LowerHaight', '/CA/SanFrancisco/LowerHaight/condo'].forEach(function(path){
    Router.run(AppRoutes, path, function(Handler, state){
        var output = React.renderToString(<Handler/>);
        console.log(output, '\n');
    });
});

问题是/SanFranciscoz总是由区域页面处理,但我希望它为404。此外,如果我将 NotFoundRoute 添加到第一个路由配置中,则所有区域页面均为 404。

<Route handler={App} someProp="defaultProp">
    <Route path="/" handler={Page} />
    <NotFoundRoute handler={NotFound} />
</Route>,

我做错了什么?

这里有一个可以下载和实验的要点。

https://gist.github.com/adjavaherian/aa48e78279acddc25315


答案 1

DefaultRoute 和 NotFoundRoute 在 react-router 1.0.0 中被删除。

我想强调的是,带有星号的默认路由必须在当前层次结构级别中排在最后才能工作。否则,它将覆盖树中它之后出现的所有其他路由,因为它是第一个并且与每个路径匹配。

对于反应路由器 1、2 和 3

如果要显示 404 并保留路径(与 NotFoundRoute 的功能相同)

<Route path='*' exact={true} component={My404Component} />

如果要显示 404 页面但更改 url(与 DefaultRoute 的功能相同)

<Route path='/404' component={My404Component} />
<Redirect from='*' to='/404' />

具有多个级别的示例:

<Route path='/' component={Layout} />
    <IndexRoute component={MyComponent} />
    <Route path='/users' component={MyComponent}>
        <Route path='user/:id' component={MyComponent} />
        <Route path='*' component={UsersNotFound} />
    </Route>
    <Route path='/settings' component={MyComponent} />
    <Route path='*' exact={true} component={GenericNotFound} />
</Route>

对于反应路由器 4 和 5

保留路径

<Switch>
    <Route exact path="/users" component={MyComponent} />
    <Route component={GenericNotFound} />
</Switch>

重定向到其他路由(更改网址)

<Switch>
    <Route path="/users" component={MyComponent} />
    <Route path="/404" component={GenericNotFound} />
    <Redirect to="/404" />
</Switch>

顺序很重要!


答案 2

在较新版本的反应路由器中,您希望将路由包装在交换机中,该交换机仅呈现第一个匹配的组件。否则,您将看到渲染的多个组件。

例如:

import React from 'react';
import ReactDOM from 'react-dom';
import {
  BrowserRouter as Router,
  Route,
  browserHistory,
  Switch
} from 'react-router-dom';

import App from './app/App';
import Welcome from './app/Welcome';
import NotFound from './app/NotFound';

const Root = () => (
  <Router history={browserHistory}>
    <Switch>
      <Route exact path="/" component={App}/>
      <Route path="/welcome" component={Welcome}/>
      <Route component={NotFound}/>
    </Switch>
  </Router>
);

ReactDOM.render(
  <Root/>,
  document.getElementById('root')
);