web-dev-qa-db-ja.com

react-router 4.xでRouteコンポーネントをネストできないのはなぜですか?

react-router 、具体的にはバージョン4.xでネストされたルートをどのように使用しますか?以下は以前のバージョンでうまくいきました...

<Route path='/stuff' component={Stuff}>
  <Route path='/stuff/a' component={StuffA} />
</Route>

4.xにアップグレードすると、次の警告がスローされます...

警告:<Route>コンポーネントと<Route children>を同じルートで使用しないでください。 <ルートの子>は無視されます

ここで何が起こっているのですか?私は the docs を何時間も精査し、ネストされたルートを正常に機能させることができません。どのように<Route>componentsを使用して、ルートをreact-router v4にネストしますか?ルートをネストするための私の単純な例はどのようにv4.x APIコンプライアンスに変換されますか?

11
scniro

React Router <v4について知っていることを忘れてください。ルートをネストするには<Routes>。チェック この例 。具体的には、トピックコンポーネントを確認してください。ルートを事前に宣言するのではなく、コンポーネントがレンダリングされるときに動的に宣言します。

import React from 'react'
import {
  BrowserRouter as Router,
  Route,
  Link
} from 'react-router-dom'

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/topics">Topics</Link></li>
      </ul>

      <hr/>

      <Route exact path="/" component={Home}/>
      <Route path="/about" component={About}/>
      <Route path="/topics" component={Topics}/>
    </div>
  </Router>
)

const Home = () => (
  <div>
    <h2>Home</h2>
  </div>
)

const About = () => (
  <div>
    <h2>About</h2>
  </div>
)

const Topics = ({ match }) => (
  <div>
    <h2>Topics</h2>
    <ul>
      <li>
        <Link to={`${match.url}/rendering`}>
          Rendering with React
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/components`}>
          Components
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/props-v-state`}>
          Props v. State
        </Link>
      </li>
    </ul>

    {/* NESTED ROUTES */}
    <Route path={`${match.url}/:topicId`} component={Topic}/>
    <Route exact path={match.url} render={() => (
      <h3>Please select a topic.</h3>
    )}/>
  </div>
)

const Topic = ({ match }) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
)

export default BasicExample
11
Tyler McGinnis

反応ルーターv4およびv5を使用すると、renderルートをネストするためのプロップ

<Route 
  path='/stuff' 
  render={({ match: { url } }) => (
    <>
      <Route path={`${url}/`} component={Stuff} exact />
      <Route path={`${url}/a`} component={StuffA} />
    </>
  )} 
/>

私の意見では、この構文は、サブルートをcomponentプロパティを介して渡される個別に定義されたコンポーネントに分割する場合と比較して、ほとんどの状況で読みやすくなります。

同様の答えはこちら を投稿しましたが、この質問にも多くの見解があるため、ここに移植すると役立つと思いました。

0
davnicwil