(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>
);
}
}
FridgePage.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
が行う唯一のことは、一致する最初のルートを排他的にレンダリングすることであり、省略した結果として共通の問題は両方のページを一度にレンダリングすることです。もし私の "/"
ルートは正確です。スイッチがない場合でも、一致するルートは冷蔵庫だけです。なぜまったくレンダリングされないのですか?
<Switch>
は、最初に一致したルートを1つだけ返します。
exact
は、完全に一致する任意の数のルートを返します。
例えば:
<Switch>
<Route exact path="/animals" component={Animals} />
<Route path="/animals/fish" component={Fish} />
<Route component={Missing} />
</Switch>
<Route path="/animals" component={Order} />
Missingコンポーネントが<Switch>
内にない場合、すべての単一ルートで返されます。
exact
を使用すると、「/ animals」ルートは「animals/fish」などの「/ animals」を含むすべてのルートをキャッチしません。
exact
がない場合、「/ animals/fish」ルートは、「animals/fish/cod」、「/ animals/fish/salmon」などのFishコンポーネントも返します。
<Switch>
ステートメントの外側にあり、exact
なしで、Orderコンポーネントは「/ animals」を含むすべてのパスでレンダリングされます。
通常、完全一致を使用していない場合はワイルドカードを使用するため、ランダムなページは返されません。