2017-05-12 23 views
0

私はUserLoginコンポーネントを持っており、要求を送信し、応答したらAfterLoginコンポーネントにリダイレクトします。react-router-dom v4プログラマブルにリダイレクト

if (xhr.status === 200) { 
       // success 
       this.context.history.push('/dashboard') 
      } 

検索の多くが反応し、ルータ-DOMを私の後にv4のルータは、次のようになります。

import { BrowserRouter as Router, Route, Switch,Redirect} from 'react-router-dom' 
import { createBrowserHistory } from 'history'; 
const history = createBrowserHistory(); 

<Router forceRefresh={false} history={history}> 
     <div> 
      <Switch> 
       <Route exact path="/" render={() => (
        Auth.isUserAuthenticated() ? (
         <DashboardPage/> 
        ) : (
         <LoginPage/> 
        ) 
       )}/> 
       <Route path="/dashboard" render={() => (
        Auth.isUserAuthenticated() ? (
         <DashboardPage/> 
        ) : (
         <Redirect to="/login"/> 
        ) 
       )}/> 
       <Route path="/login" render={() => (
        Auth.isUserAuthenticated() ? (
         <Redirect to="/dashboard"/> 
        ) : (
         <LoginPage/> 
        ) 
       )}/> 
       <Route path="*" component={Error}/> 
      </Switch> 
     </div> 
    </Router> 

すべてがthis.context.history.push('/dashboard')一部を除いて、完全に正常に動作しています。ログイン後にユーザーをリダイレクトするにはどうすればよいですか?この方法を使用すると、コンソールでthis.contextが定義されていないことがわかります。

Cannot read property 'push' of undefined 
+0

あなたは 'this.props.history.push( '/ダッシュボード')'のように、代わりにコンテキストの小道具を使用する必要があります。今どこで 'this.context ... 'と呼んでいますか? – hinok

+0

UserLoginコンポーネントの内部で、ユーザーがフォームを送信し、サーバーからokを取得した後。 –

答えて

1

コンポーネントにアクセスさせるコンテキストのプロパティを指定する必要があります。あなたのxhrリクエストがあなたのUserLoginコンポーネント内にあるとすると、context.historyにアクセスするためには以下を追加する必要があります。

UserLogin.contextTypes = { 
    history: React.PropTypes.object, 
}; 

しかし、あなたは、コンテキストを使用してはならない、むしろ、あなたが使用する必要がありますが、あなたのコンポーネントの小道具にhistoryを置くルータwithRouter機能を反応します。

https://reacttraining.com/react-router/web/api/withRouter

import { withRouter } from 'react-router-dom'; 

class UserLogin extends React.Component { ... } 

// can call history with this.props.history in UserLogin now 
export default withRouter(UserLogin); 
+0

ありがとうございます。私は今それを試し、ドキュメントを読むでしょう。 –

+0

私はドキュメント内で 'PropTypes'を使っていますが、私が同じことをしようとすると、' PropTypes "の重複宣言が得られます。コンストラクタと 'PropTypes'の使用を含む応答を提供できますか? –

+0

あなたは何を意味するのかわかりません。小道具の種類は誰が使っていますか?どこで使ってみようとしていますか? –

関連する問題