ルートごとに異なるテンプレートを使用してルーターを反応させるv。5

Jan 18 2021

こんにちは私はこの質問を見ました、そしてこれはまさに私が探しているものです、しかし私はそれを働かせることができません。マスターページ/テンプレートを使用したReactRouterV4ルーター

バージョン5.2を使用しています

アプリコンポーネントにはナビゲーションが含まれ、2つのパスを「パブリック」と「プライベート」の2つのテンプレートコンポーネントでラップします。各リンクをクリックすると、ページがそのテンプレートでラップされると予想されますが、代わりに最初のリンクのみが機能し、テンプレートが表示されます。2番目のリンクはブラウザのアドレスバーのURLのみを変更し、最初のテンプレートのコンテンツのみがページに残り、2番目のページのコンテンツは表示されません。リンクの順序を変更すると、常に一番上のリンクだけが正しいテンプレートを取得します。

これは私がルートとそれらへのリンクを定義するところです。

class App extends Component {
  render() {
    return (
      <Router>
        <div>
          <ul><li><Link to="/">Home</Link></li>
            <li><Link to="/members">Members</Link></li>
          </ul>
        </div>
        <Switch>
          <Public>
            <Route exact path="/"><Home /></Route>
          </Public>
          <Private>
            <Route path="/members"><Members /></Route>
          </Private>
        </Switch>
      </Router>
    );
  }
}
export default App;

私のプライベートテンプレートとパブリックテンプレートは、一方がプライベートともう一方がパブリックと言うタイトルを除いて同じです。

class Private extends Component {
  render() {
    return (
      <div className="container">
        <div className="row">
          <div className="col-md-2"><h2>PRIVATE</h2></div>
          <div className="col-md-8">{this.props.children}</div>
          <div className="col-md-2"></div>
        </div>
      </div>
    );
  }
}

export default Private;

それは潜在的にきちんとした解決策のように見えるので、私はしばらくの間このようなものを探していました。誰かがこれを修正する方法を知っているなら、私は本当にそれをいただければ幸いです。ありがとう

回答

1 TaghiKhavari Jan 18 2021 at 18:15

ここでは何であるSwitchコンポーネントが行います。

          React.Children.forEach(this.props.children, child => {
            if (match == null && React.isValidElement(child)) {
              element = child;

              const path = child.props.path || child.props.from;

              match = path
                ? matchPath(location.pathname, { ...child.props, path })
                : context.match;
            }
          });

ご覧のSwitchとおり、コンポーネントはその子の最初のレベルのみを考慮し、そのpath or from中で呼び出される小道具を探します。見つからない場合は、すべてpathが一致すると見なされます。そのため、何があっても常に最初の子が表示されます。

あなたがする必要があるのは、このように子供の順序を変更することです:

<Switch>
  <Route exact path="/">
    <Public>
      <Home />
    </Public>
  </Route>
  <Route path="/members">
    <Private>
      <Members />
    </Private>
  </Route>
</Switch>