2017-08-29 13 views
3

ユーザーが3部フォームの次のステップに進むと、状態が変わるだけでURLは変わりません。問題は、ブラウザボタンを使用してフォームを修正して戻すことができないことです。複数ステップフォームでブラウザの戻るボタンを処理する

onBackButtonEvent = (e) => { 
    console.log('handling back button press', e) 
    if (typeof e !== 'undefined') { 
     e.preventDefault() 
     console.log(e); 
    } 
    } 

    componentDidMount =() => { 
    window.onpopstate = this.onBackButtonEvent(); 
    } 
+2

これはあなたの時間を再発明する価値がありません。 React-Routerをチェックしてください。 – gravityplanx

+0

なぜあなたのURLにハッシュを使用せず、 'location.hash'を使ってチェックしますか?あるいは、 'react-router'を使用してください。 – Phil

答えて

1

コメンターは、上記のように、あなたの最善の策は、個々の構成要素として、フォームのページをレンダリングすること、及びにブラウザナビゲーションの懸念を委譲します。この問題を解決しようとするすべての午後を過ごした後、ここで私が得た最も近いですリアクションルータ。 React Router docsで詳細を読むことができます。以下では、フォームをいくつかのコンポーネントに再組み立てした後で、アプリケーションに追加できる基本的なものをいくつか示しました。

// index.js (or file where you add your App to dom) 
import { BrowserRouter } from 'react-router-dom'; 

ReactDOM.render(
    <BrowserRouter> 
    <App /> 
    </BrowserRouter>, 
    document.getElementById('root') 
); 


// App.js 
import { Route } from 'react-router-dom' 

// render 
<Route exact path="/form/page1" render={(props) => (
    <FormPage1 
    {...props} 
    necessaryProp={this.state.necessaryProp} 
    handleSubmit={this.props.handleSubmit} /> 
)} /> 

<Route exact path="/form/page2" render={(props) => (
    <FormPage2 
    {...props} 
    necessaryProp={this.state.necessaryProp} 
    handleSubmit={this.props.handleSubmit} /> 
)} /> 

あなたは

がフォームを送信するか、ページを変更し、やったページ#に基づいて、それを処理するために...あなたのページコンポーネントのcomponentDidMountやcomponentWillMountライフサイクルイベントを使用して検証して遊ぶことができ提出する。もう1つの方法は、ページコンポーネントの内部に<Link to="/form/page2" />を使用することです。最後に、ボタンのonClickハンドラに検証を実行させるという方法があります。フォームが有効な場合は、props.history.push('/form/page2')を使用してプログラムでリダイレクトします。実装の詳細はあなた次第です!

キーはReact Routerであり、ブラウザのナビゲーションに関する懸案事項を摘要し、ブラウザ間の影響を処理し、探しているものです。

+0

このようにReact Routerを使用する場合、マルチページの状態を処理するための良いパターンは何ですか? 私のアプリは、ウィザードの最後に確認と持続があります。私はに状態を保存し、などに渡して状態を使ってレンダリングすることができますが、ブラウザの履歴は機能しません。だから、React Routerは正しい解決策のようだが、3つのオプションがある:a)各ステップの後に持続する、b)ルートにあるので、マルチページの状態をAppまですべて持ち上げる、またはc) Reduxのようなものを使用してください。 もっと簡単な方法がありますか? – Spencer

+0

Reduxを使用して状態を保存することをお勧めします。 Reduxは基本的に 'b'と 'c'を行い、[制御されたフォームコンポーネント](https://reactjs.org/docs/forms.html#controlled-components)で実装されている場合は 'a'を実行します。 ''および ''などは、それらが表す状態の部分を検証するためにコンポーネントにロジックを持ちます。前回の提出までにフォームの状態を別のレデューサー(永続的なデータモデルとは別のもの)に保存すると便利なことがあります。 –

関連する問題