2015-09-26 11 views
7

Ich schaue auf die redux-blog-example. Es gibt SignupRoute.js die wie folgt aussieht:Wie gelangt React Router in den React-Kontext?

@connect(state => ({ 
    auth: state.auth 
}), { 
    signup 
}) 
export default class SignupRoute extends React.Component { 
    static contextTypes = { 
    router: React.PropTypes.object 
    } 

    handleSubmit = (email, password) => { 
    const router = this.context.router; 

    this.props.signup(email, password, router); 
    } 

    render() { 
    return (
     <Signup 
      auth={this.props} 
      handleSubmit={this.handleSubmit} 
     /> 
    ); 
    } 
} 

Wie funktioniert die router zum context dieser class verdrahtet werden?

Antwort

10

Es verwendet context, eine undokumentierte, aber recht weit verbreitete React-Funktion. Für eine vollständige lowdown siehe this article, aber hier ist das Wesentliche davon:

let router = Router(); // just illustrating, this is not how you instantiate React router 

class MyComponent extends React.Component { 
    static contextTypes = { 
     router: React.PropTypes.object 
    }; 

    render(){ 
     // By declaring context type here, and childContextTypes 
     // on the parent along with a function with how to get it, 
     // React will traverse up and look for the `router` context. 
     // It will then inject it into `this.context`, making it 
     // available here. 
    } 
} 

class Parent extends React.Component { 
    static childContextTypes = { 
     router: React.PropTypes.object 
    }; 

    getChildContext(){ 
     return { 
     router: this.props.router 
     }; 
    } 

    render(){ 
     return <MyComponent />; 
    } 
} 

ReactDOM.render(<Parent router={router} />, document.getElementById('app'));