【问题标题】:React router Switch behavior反应路由器开关行为
【发布时间】:2017-12-20 17:24:48
【问题描述】:

react-router-dom 版本:4.1.1)

我已经设置了工作路线,但我有点困惑为什么<Switch> 是必要的:

index.js

import React from 'react';
import { HashRouter, Route, Switch } from 'react-router-dom';

import App from './components/App.jsx';
import FridgePage from './components/FridgePage.jsx';

ReactDOM.render(
    <HashRouter>
        <Switch>
            <Route exact path="/" component={App} />
            <Route path="/fridge" component={FridgePage} />
        </Switch>
    </HashRouter>,
    document.getElementById('root')
)

App.jsx

import Header from './Header.jsx';
import {Link} from 'react-router-dom';

export default class App extends React.Component {
    render() {
        console.log(this.props);
        return (
            <div>
                <h1>Herbnew</h1>
                <Link to="fridge">Fridge</Link>
                {this.props.children}
            </div>
        );
    }
}

Frid​​gePage.jsx

import React from 'react';

export default class FridgePage extends React.Component {
    render() {
        return (
            <div>
                <h1>Fridge</h1>
                You finally found the fridge!
            </div>
        );
    }
}

我曾经有一个 div 包裹路线,而不是 Switch。在这种情况下,我看到 App 呈现并尝试单击 Fridge 链接,但没有任何反应(FridgePage 未呈现),并且没有错误输出到控制台。

据我了解,Switch 所做的唯一事情就是专门渲染它匹配的第一个路由,而由于省略它而导致的常见问题是同时渲染两个页面。如果我的"/" 路线是准确的,那么即使没有交换机,冰箱也应该是唯一匹配的路线,对吧?为什么它根本不渲染?

【问题讨论】:

    标签: reactjs react-router react-router-v4 react-router-dom


    【解决方案1】:

    Frid​​gePage 不呈现,因为 .我想应该是

    【讨论】:

      【解决方案2】:

      &lt;Switch&gt; 只返回一个第一个匹配的路由。

      exact 返回任意数量的完全匹配的路由。

      例如:

      <Switch>
        <Route exact path="/animals" component={Animals} />
        <Route path="/animals/fish" component={Fish} />
        <Route component={Missing} />
      </Switch>
      <Route path="/animals" component={Order} />
      

      如果 Missing 组件不在 &lt;Switch&gt; 内,它将在每条路由上返回。

      使用exact,“/animals”路由不会捕获所有包含“/animals”的路由,例如“animals/fish”。

      如果没有exact,“/animals/fish”路由也会返回“animals/fish/cod”、“/animals/fish/salmon”等的 Fish 组件。

      &lt;Switch&gt; 语句之外并且没有exact,Order 组件在包含“/animals”的每个路径上呈现。


      通常,如果您不使用精确,您将使用通配符,因此您不会返回随机页面。

      【讨论】:

      • @OliverWatkins 如果没有与上述路径匹配的路径,则将呈现该组件。就像在/humans 路线上一样,Missing 组件将被渲染。我建议将其命名为更明显的名称,例如 PageNotFoundError404
      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 2019-05-27
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2020-06-27
      相关资源
      最近更新 更多