2016-11-25 76 views
0

我已經在我的應用中使用react-router v4進行路由。我已經使用路由顯示各種形式像顯示公寓的形式,體驗的形式,登錄,註冊等react路由器需要兩次點擊來更新路由

問題

當我在公寓的圖片的點擊,反應路由器的路由公寓形式。路線變成/公寓。如果我再次點擊註冊按鈕,路線不會得到更新。我必須雙擊註冊按鈕來更新到/註冊的路線。

這裏是我的代碼

class App extends Component { 
    constructor(props, context) { 
    super(props, context); 
    console.log('context', context); 
    this.state = { show: false }; 
    } 

    showModal(e) { 
    e.preventDefault(); 
    this.setState({ show: true }); 
    } 

    hideModal() { 
    this.setState({ show: false }); 
    } 

    render() { 
    return (
     <div className="container-fluid"> 
      <Nav 
      showModal={(e) => this.showModal(e)} 
      hideModal={() => this.hideModal()} 
      show={this.state.show} 
      onHide={() => this.hideModal()} 
      /> 
     </div> 
     ); 
    } 
} 

App.contextTypes = { 
    router: React.PropTypes.object 
}; 



const Nav = (props) => (
    <Router> 
    <div> 
     <nav className="navbar navbar-default"> 
     <div className="container-fluid"> 
      <div className="navbar-header"> 
      <a className="navbar-brand" href=""> 
       <img 
       alt="Brand" 
       className="img-responsive" 
       src={logo} 
       role="presentation" 
       /> 
      </a> 
      </div> 
      <div className="collapse navbar-collapse" id="collapse-1"> 
      <ul className="nav navbar-nav navbar-right nav-social-icon"> 
       <li className="dropdown"> 
       <a 
        href="" 
        className="dropdown-toggle" 
        data-toggle="dropdown" 
       > 
        ES 
        <span className="caret" /> 
       </a> 
       <ul className="dropdown-menu" style={{ color: '#000', fontWeight: 'bold' }}> 
        <li onClick={() => props.selectedLocale('en')}> 
        en 
        </li> 
        <li onClick={() => props.selectedLocale('es')}> 
        es 
        </li> 
       </ul> 
       </li> 
       <li className="btn-group regLog"> 
       <button 
        className="btn btn-default" 
        onClick={props.showModal} 
       > 
        <Link to={{ pathname: '/signup' }}> 
        {props.intl.formatMessage({ id: 'nav.registration.text' }) } 
        </Link> 
       </button> 
       <button 
        onClick={props.showModal} 
        className="btn btn-default" 
       > 
        <Link to={{ pathname: '/login' }}> 
        {props.intl.formatMessage({ id: 'nav.login.text' }) } 
        </Link> 
       </button> 
       {props.show ? 
        <ModalForm 
        show={props.show} 
        onHide={props.onHide} 
        /> : <span /> 
       } 
       </li> 
      </ul> 
      </div> 
     </div> 
     </nav> 
    </div> 
    </Router> 
); 


class ModalForm extends Component { 
    render() { 
    const { show, onHide, intl } = this.props; 
    return (
     <Router> 
     <Modal 
      {...this.props} 
      show={show} 
      onHide={onHide} 
      dialogClassName="custom-modal" 
     > 
      <Modal.Header closeButton> 
      <Link to='/login' className="logTitle"> 
       <Modal.Title id="contained-modal-title-lg"> 
       {intl.formatMessage({ id: 'nav.login.text' })} 
       </Modal.Title> 
      </Link> 
      <Link to='/signup' className="logTitle"> 
       <Modal.Title id="contained-modal-title-lg"> 
       {intl.formatMessage({ id: 'nav.registration.text' })} 
       </Modal.Title> 
      </Link> 
      </Modal.Header> 
      <Modal.Body> 
      <Match pattern='/login' component={Login} /> 
      <Match pattern='/signup' component={Signup} /> 
      </Modal.Body> 
     </Modal> 
     </Router> 
    ); 
    } 
} 

我想是因爲使用onClick事件和路由的。我如何解決它?

UPDATE

我試圖用路由器環境,但我越來越undefined。 App是父組件,Nav是子組件。 Nav組件使用路由器,而onClick函數在必須處理this.context.router的App組件中處理。

感謝

+0

您認爲哪個onClick事件是問題?另外,/ register路由的代碼在哪裏,我在你的示例中看不到它,你的意思是註冊路線嗎? – Jayce444

+0

我的壞,它的/註冊路線。 – Serenity

+0

我已更新我的問題。 showModal可以用於在模態中顯示錶單,但我的模態有兩種形式,一種用於註冊,另一種用於登錄。所以當點擊註冊時,註冊表格應該以模式顯示,但是如果點擊登錄,登錄表單應該以模態顯示。 – Serenity

回答

0

放在的onClick功能重定向使用路由器環境...

https://github.com/ReactTraining/react-router/blob/master/docs/API.md#routercontext

您使用contextTypesreact訪問來自react-routerrouter和n使用推改變URL

+0

我已更新我的問題。我試圖使用路由器上下文,但未定義。你可以看到App是我的父組件,Nav是子組件。 – Serenity

+0

您做了一半更改... where.context.router.push()????這個調用將URL更改爲你想去的地方...所以你可以刪除鏈接... –

+0

我在應用程序組件的構造函數中調用時得到了undefined。 – Serenity

0

我也使用RRv4,來處理按鈕鏈接,然後我把button換成link。將整體點擊處理程序放在鏈接上。這應該在過渡之前調用,並且如果您需要防止轉換,則可以簡單地致電e.preventDefault

這將保持RRv4的聲明性質,並防止需要在反應中使用實驗context功能。