2015-09-26 2 views
7

Я смотрю redux-blog-example. Существует SignupRoute.js, который выглядит следующим образом:Как React Router попадает в контекст React?

@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} 
     /> 
    ); 
    } 
} 

Как работает router получить проводной до context этого class?

ответ

10

В нем используется context, недокументированная, но довольно широко реализованная функция Реактива. Для полной низкой оценки см. this article, но вот в чем суть:

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'));