2016-05-30 15 views
25

私が理解しているように、Applocationparamsのようなルーティング関連の小道具は<Route path="/" component={App} />となります。反応ルータが子コンポーネント内のこの.props.locationを取得する

  • は、ネストされた子コンポーネントのルートを作成するウィンドウオブジェクトを使用してアプリケーション
  • から小道具を渡す
    • :私のAppコンポーネントは、多くのネストされた子コンポーネントを持っている場合、どのように私は、子コンポーネントがなく、これらの小道具へのアクセス権を持っているのですか

    this.context.routerにはルートに関する情報があると思っていましたが、this.context.routerにはルートを操作する機能しかないようです。あなたのコンポーネント小道具にmatchhistorylocationを注入するためにwithRouter HOCを使用することができます

  • +0

    のようなコンテキストを使用して、子コンポーネントには、直接のネストされた子コンポーネントは、ポインタのためthis.props.children –

    答えて

    43

    (更新)V4

    。あなたのコンポーネント小道具にrouterparamslocationroutesを注入するためにwithRouter HOCを使用することができます

    class Child extends React.Component { 
        static propTypes = { 
        match: PropTypes.object.isRequired, 
        location: PropTypes.object.isRequired, 
        history: PropTypes.object.isRequired 
        } 
    
        render() { 
        const { match, location, history } = this.props 
    
        return (
         <div>{location.pathname}</div> 
        ) 
        } 
    } 
    
    export default withRouter(Child) 
    

    (更新)V3

    class Child extends React.Component { 
    
        render() { 
        const { router, params, location, routes } = this.props 
    
        return (
         <div>{location.pathname}</div> 
        ) 
        } 
    } 
    
    export default withRouter(Child) 
    

    オリジナル答え

    あなたが小道具を使用しない場合React Router documentation

    まずで説明したように、あなたはコンテキストを使用することができ、あなたのchildContextTypesgetChildContextを設定する必要があります

    class App extends React.Component{ 
    
        getChildContext() { 
        return { 
         location: this.props.location 
        } 
        } 
    
        render() { 
        return <Child/>; 
        } 
    } 
    
    App.childContextTypes = { 
        location: React.PropTypes.object 
    } 
    

    次に、あなたの場所オブジェクトにアクセスできますアプリケーションコンポーネントでこの

    class Child extends React.Component{ 
    
        render() { 
        return (
         <div>{this.context.location.pathname}</div> 
        ) 
        } 
    
    } 
    
    Child.contextTypes = { 
        location: React.PropTypes.object 
    } 
    
    +0

    おかげで見つけることができます。私はその文書のその部分を読んでいませんでした。私は '' 'context.router'''しかないと思った。 – xiaofan2406

    +0

    あなたはあなたのアプリケーションを安定させたいなら、文脈を使わないでください。これは実験的なAPIであり、今後のReactリリース(https://facebook.github.io/react/docs/context.html#why-not-to-use-context)で破損する可能性があります。 –

    関連する問題