2016-07-27 25 views
4

私はReactアプリケーションを構築しており、React Routerを使ってルーティングを管理しています。次のようにアプリケーションの情報アーキテクチャを表すことができるように/#/projects/1/components/1ネストされたナビゲーションのリアクタ・ルータのベストプラクティス?

----------------------------------------------------------- 
|   | Home > Projects > 0 > Object > 1   | 
| Home  |--------------------------------------------| 
|   |           | 
| Projects | Object 1         | 
|   |           | 
| Services | Blah blah blah       | 
|   |           | 
| Users  |           | 
|   |           | 
----------------------------------------------------------- 

としてルートいずれかのために与えられたことに注意を見たときに

- App 
    - Projects 
     - Project 1 
      - Objects 
       - Object 1 
       - Object 2 
       - etc... 
      - Collaborators 
     - ... 
    - Services 
    - Users 

アプリケーションのUIは、次のようになりますルートは、上記の情報アーキテクチャースキームに示されているように、ビューはボディーセクションにレンダリングする必要があります(上記の図では、「コンポーネント1」がレンダリングされています)。私は私のルートを定義するPlainRoutesを使用している

は今、私が誤ってでこれを実施しているルータに反応使ってどのように反応するかを説明します。ここでルートが定義されている方法の簡単な例である: <Router routes={routes}></Router>

が働いのこの種を行う。このように、ルータに反応成分に送り込ま取得

const routes = [ 
    { 
     path: '/', 
     component: App, 
     name: 'Home', 
     childRoutes: [ 
      // /projects 
      { 
       path: 'projects', 
       component: Projects, 
       name: 'Projects' 
      }, 
      { 
       path: 'projects/:projectid', 
       component: ProjectDetails, 
       name: 'Project Details', 
       childRoutes: [ 
        { 
         path: 'objects', 
         component: Objects, 
         name: 'Objects' 
        }, 
        { 
         path: 'objects/:objectid', 
         component: ObjectDetails, 
         name: 'Object Details' 
        }, 
        { 
         path: 'collaborators', 
         component: Collaborators, 
         name: 'Collaborators' 
        } 
       ] 
      }, 
      // /services 
      { 
       path: 'services', 
       component: Services, 
       name: 'Services' 
      }, 
      // /users 
      { 
       path: 'users', 
       component: Users, 
       name: 'Users' 
      } 
     ] 
    } 
]; 

。私はに移動しようとすると:

/#/projects

私はアプリのボディでレンダリングプロジェクトのコンポーネントを参照してくださいでしょう。私はアプリケーションの本体でレンダリングProjectDetail成分を見ること

/#/projects/1

:私に移動しようとする

。私はまだアプリのボディでレンダリングProjectDetailコンポーネントを見ることが

/#/projects/1/objects

:私はに移動しようと試みるしかし

、。 /projects/:projectidパラメータが解決されたときにルータがただ停止し、/projects/:projectid/objectsルートに割り当てられたコンポーネントを引き続きレンダリングしない理由がわかりません。

私は問題が私がReact Routerを間違った方法で使っていたと思います。子ルートは、論理的にネストされているだけではなく、親コンポーネントの内部に物理的にネストされています。少なくとも、私はそれが問題だと思う。明らかに、私はリアクタ・ルータがどのように使用されるべきかに関してちょっと混乱しています - 特にchildRoutesのコンセプト。

質問は、React Routerを使用して、上記のように私が求めている階層構造をアプリケーションに与える方法です。私は、ルータがアプリケーションの深く入れ子構造(ブレッドクラムやナビゲーションなど)を認識してもらいたいのですが、コンポーネントを物理的に入れ子にしたくはありません。ここでベストプラクティスは何ですか?

+1

'ProjectDetails'コンポーネントは' this.props.children'を使用しますか?そうでなければ、 'Objects'コンポーネントはレンダリングする場所がありません。あなたはそれらを両方同時に画面上に、またはどちらか一方でもどちらにしたいですか? – azium

+0

'ProjectDetails'は' this.props.children'を使用しません。私はどちらか一方をレンダリングしたい。だから、階層の各レベルのように聞こえる、空のコンテナを作成し、子を表示していないかどうかを示す 'indexRoute'を作成する必要があります。それが正しい方法でしょうか? –

+0

いいえ、入れ子にしないでください。私は答えを加えましたが、あなたに尋ねたかったのですが、ここに何の理由で巣を入れていたのですか?文字列の一部を共有するためだけですか? – azium

答えて

1

あなたはパス/#/projects/1/objectsProjectDetailsObjectsの両方を表示したくないことを考えると、あなたは巣にこれらのルートを望んでいません。

childRoutes: [ 
     // /projects 
     { 
      path: 'projects', 
      component: Projects, 
      name: 'Projects' 
     }, 
     { 
      path: 'projects/:projectid', 
      component: ProjectDetails, 
      name: 'Project Details', 
     }, 
     { 
      path: 'projects/:projectid/objects', 
      component: Objects, 
      name: 'Objects' 
     }, 
     { 
      path: 'projects/:projectid/objects/:objectid', 
      component: ObjectDetails, 
      name: 'Object Details' 
     }, 

あなたはなりますが、ProjectDetailsthis.props.children内移入するObjectsを意図された場合にのみ、巣ルート。

+0

右 - それはうまくいく別の方法のようです。その方法の唯一の問題は、ルータが情報階層を理解していないように見えることです。たとえば、ブレッドクラムの軌跡を作成したい場合は、 'routes'プロップからその情報を取得したいと思うでしょう(' App'コンポーネントから継承され、 'withRouter'を使用しています)。 '' Home''、 '' Object 1'' '' '' Home''、 '' Projects''には '/ ' '、' Project 1 '、' Objects '、' Object 1 ']' –

+0

ごめんなさい申し訳ありませんが、これについてあなたに戻ってきませんでした。 (場所を確認しています)。子供の代わりに複数の名前付きコンポーネントをネストしたルートを使用している可能性があります。 – azium

+0

心配はありません - 私は現在のルートの完全なパスを解析してブレッドクラムと適切なナビゲーション要素。 –

関連する問題