2017-05-26 3 views
2

私はもともとhashHistoryreact-routerから使用していましたが、this.props.history.push()を使用してプログラムでナビゲートしました。しかしHashRouterreact-router-domパッケージから使用しようとすると、this.props.history.push()は今度はCannot read property 'push' of undefinedというエラーをスローします。プログラムでHashRouterを使用してナビゲート

HashRouterを使ってプログラムでナビゲートするにはどうすればよいですか?

ReactDOM.render(
    <Provider store={store}> 
    <MuiThemeProvider> 
     <HashRouter> 
     <div> 
      <Route exact path="/" component={App} /> 
      <Route path="/landing" component={Landing} /> 
     </div> 
     </HashRouter> 
    </MuiThemeProvider> 
    </Provider>, 
document.getElementById('root')); 

私は私の問題が何であるかを考え出した.push()

handleSubmit(e) { 
    ... 
    this.props.history.push('/landing'); 
    ... 
} 
+0

'history.push()'はまだreact-router v4にあります。しかし、それを使用する場所や経路をどのように設定したかによって、利用できない場合があります。それらを説明するコードをいくつか共有することができれば、あなたに確かな答えを与えることができるかもしれません。 –

+0

@TharakaWijebandara、ちょうど関連コードを追加しました。 – Mike

+0

ランディングコンポーネント内の 'this.props.history.push()'をどこで使用しようとしますか? –

答えて

1

コンポーネントがルートからレンダリングされている場合(App and Landingなど)、すべてのルータ関連の小道具(matchhistorylocation)にアクセスできます。しかし、SignUpFormはRouteでレンダリングされないので、デフォルトではそれらの小道具にアクセスすることはできません。

しかし、withRoute higher-order componentを使用すると、これらの小道具を明示的に取得できます。次のようにエクスポートする前に、コンポーネントをこのHoCにラップするだけです。

export default withRouter(SignUpForm); 

SignUpFormがhistory propを取得するので、期待通りに動作します。

+0

すでにreduxを実装している場合、コンポーネントをどのようにラップするのですか? @ export既定の接続をエクスポートする(mapStateToProps)(SignUpForm); – Mike

+0

@Mike接続されたコンポーネントをwithRouter(connect(...)(MyComponent)) ' –

0

を呼んだSignUpForm.js

render() { 
    return (
    <div className="App"> 
     ... 
     <div> 
     <Collapse isOpened={this.state.activeForm === 1}> 
      <SignUpForm /> 
     </Collapse> 
     <Collapse isOpened={this.state.activeForm === 2}> 
      <SignInForm /> 
     </Collapse> 
     ... 
    </div> 
); 
} 

機能App.jsのFUNCをレンダリングします。私index.js容器がApp.jsでレンダリングされているApp.js経路の1つとしてないSignUpForm.js、とそのような(以下)として設定されています。つまり、SignUpForm.jsには、履歴プロフムApp.jsの概念はありません。

小道具としてSignUpForm.jsApp.jsの歴史の小道具を渡すことによって、私は私の目的のアクションを取得するためにSignUpForm.jsthis.props.history.push()を呼び出すことができました。

+0

これは直接の子コンポーネントで動作します。しかし時には多くのレベルを下に '歴史'を渡す必要があります。それで 'withRouter'を使うのは簡単できれいです。 –

関連する問題