2016-06-29 53 views
0

我在React JS中有多步註冊表單。我的主要成分如下:後退按鈕在React中不能以多步形式工作

import React, {PropTypes} from 'react'; 
import {connect} from 'react-redux'; 
import {bindActionCreators} from 'redux'; 
import * as actionCreators from '../../actions/actionCreators'; 
import countries from '../../data/countries'; 

import RegistrationFormStepOne from './registrationFormStepOne'; 
import RegistrationFormStepTwo from './registrationFormStepTwo'; 
import RegistrationFormStepThree from './registrationFormStepThree'; 
import RegistrationFormStepFour from './registrationFormStepFour'; 

class RegistrationPage extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
      user: Object.assign({}, this.props.userData), 
      fileNames: {}, 
      selectedFile: {}, 
      icons: { 
       idCard: 'upload', 
       statuten: 'upload', 
       blankLetterhead: 'upload', 
       companyPhoto: 'upload' 
      }, 
      step: 1, 
      errors: {} 
     }; 

     this.setUser = this.setUser.bind(this); 
     this.onButtonClick = this.onButtonClick.bind(this); 
     this.onButtonPreviousClick = this.onButtonPreviousClick.bind(this); 
    } 

    getCountries(){ 
     return countries; 
    } 

    setUser(event) { 
     const field = event.target.name; 
     const value = event.target.value; 

     let user = this.state.user; 
     user[field] = value; 
     this.setState({user: user}); 
    } 

    onButtonClick(name, event) { 
     event.preventDefault(); 
     this.props.actions.userRegistration(this.state.user); 
     switch (name) { 
      case "stepFourConfirmation": 
       this.setState({step: 1}); 
       break; 
      case "stepTwoNext": 
       this.setState({step: 3}); 
       break; 
      case "stepThreeFinish": 
       this.setState({step: 4}); 
       break; 
      default: 
       this.setState({step: 2}); 
     } 
    } 

    onButtonPreviousClick(){ 
     this.setState({step: this.state.step - 1}); 
    } 

    render() { 
     const languageReg = this.props.currentLanguage.default.registrationPage; 

     let formStep = ''; 
     let step = this.state.step; 
     switch (step) { 
      case 1: 
       formStep = (<RegistrationFormStepOne user={this.props.userData} 
                onChange={this.setUser} 
                onButtonClick={this.onButtonClick} 
                countries={this.getCountries(countries)} 
                errors={this.state.errors} 
                step={step}/>); 
       break; 
      case 2: 
       formStep = (<RegistrationFormStepTwo user={this.props.userData} 
                onChange={this.setUser} 
                onButtonClick={this.onButtonClick} 
                onButtonPreviousClick={this.onButtonPreviousClick} 
                errors={this.state.errors}/>); 
       break; 
      case 3: 
       formStep = (<RegistrationFormStepThree user={this.props.userData} 
                 onFileChange={this.onFileChange} 
                 onButtonClick={this.onButtonClick} 
                 onButtonPreviousClick={this.onButtonPreviousClick} 
                 errors={this.state.errors} 
                 fileNames={this.state.fileNames} 
                 icons={this.state.icons} 
                 fileChosen={this.state.selectedFile}/>); 
       break; 

      default: 
       formStep = (<RegistrationFormStepFour user={this.props.userData} 
                 onChange={this.setUser} 
                 onChangeCheckboxState={this.changeCheckboxState} 
                 onButtonClick={this.onButtonClick} 
                 onButtonPreviousClick={this.onButtonPreviousClick} 
                 errors={this.state.errors}/>); 
     } 

     return (
      <div className="sidebar-menu-container" id="sidebar-menu-container"> 

       <div className="sidebar-menu-push"> 

        <div className="sidebar-menu-overlay"></div> 

        <div className="sidebar-menu-inner"> 
         <div className="contact-form"> 
          <div className="container"> 
           <div className="row"> 
            <div className="col-md-10 col-md-offset-1 col-md-offset-right-1"> 
             {React.cloneElement(formStep, {currentLanguage: languageReg})} 
            </div> 
           </div> 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
     ); 
    } 
} 

RegistrationPage.contextTypes = { 
    router: PropTypes.object 
}; 

function mapStateToProps(state, ownProps) { 
    return { 
     userData: state.userRegistrationReducer 
    }; 
} 

function mapDispatchToProps(dispatch) { 
    return { 
     actions: bindActionCreators(actionCreators, dispatch) 
    }; 
} 

export default connect(mapStateToProps, mapDispatchToProps)(RegistrationPage); 

當我點擊下一步,國家逐步變化,下一個表單步驟renderen。當我點擊上一步時,這個步驟是遞減的,我看到了上一步。它與這些按鈕很好。

但瀏覽器後退按鈕不起作用。例如,當我進行第三步操作時,當我在瀏覽器中單擊後退按鈕時,我將重定向到主頁。

我routes.js文件如下:

import React from 'react'; 
import {IndexRoute, Route} from 'react-router'; 

import App from './components/App'; 
import HomePage from './components/HomePage'; 
import Registration from './components/registration/RegistrationPage'; 
import RegistrationStepOne from './components/registration/registrationFormStepOne'; 
import RegistrationStepTwo from './components/registration/registrationFormStepTwo'; 
import RegistrationStepThree from './components/registration/registrationFormStepThree'; 
import RegistrationStepFour from './components/registration/registrationFormStepFour'; 
import UserPage from './components/user/userHome'; 
import requireAuth from './common/highOrderComponents/requireAuth'; 
import hideIfLoggedIn from './common/highOrderComponents/hideIfLoggedIn'; 

import PasswordReset from './common/passwordReset'; 

const routes = (
    <Route path="/" component={App}> 
     <IndexRoute component={HomePage}/> 
     <Route path="registration" component={hideIfLoggedIn(Registration)} /> 
     <Route path="reset-password" component={PasswordReset} /> 
     <Route path="portal" component={requireAuth(UserPage)} /> 
    </Route> 
); 

export default routes; 

我也許應該補充內<Route path="registration" ...這些組件,我試了一下,但沒有成功。

任何建議如何使瀏覽器後退按鈕工作,並讓我回到上一步?

編輯

穆routes.js文件現在如下:

const routes = (
<Route path="/" component={App}> 
    <IndexRoute component={HomePage}/> 
    <Route path="registration/:id" component={hideIfLoggedIn(Registration)}/> 
    <Route path="reset-password" component={PasswordReset} /> 
    <Route path="portal" component={requireAuth(UserPage)} /> 
</Route> 
); 

而在我的主要成分我已經改變了onButtonClick功能(其中級增量)到:

onButtonClick(name, event) { 
    event.preventDefault(); 

    switch (name) { 
     case "stepFourConfirmation": 
      if(this.validation("four")) { 
       this.props.actions.userRegistrationThunk(this.state.user); 
       this.setState({step: 5, user: {}}); 
      } 
      break; 
     case "stepTwoNext": 
      if(this.validation("two")) { 
       this.setState({step: 3}); 
       this.context.router.push("stepThree"); 
      } 
      break; 
     case "stepThreeFinish": 
      this.setState({step: 4}); 
      break; 
     default: 
      if(this.validation("one")) { 
       this.setState({step: 2}); 
       this.context.router.push('stepTwo'); 
      } 
    } 
} 

而我已添加

componentWillMount(){ 
    console.log(this.props.params.id); 
} 

如果點擊瀏覽器後退按鈕,我會減少步驟。

當主要組件第一次加載時,我進入控制檯stepOne,這很好。但是當我點擊下一個按鈕時,進入第二步。網址更改爲註冊/步驟二,但在控制檯我得到警告:[react-router]位置「steptwo」不匹配任何路線,我看不到我的this.props.params.id是什麼。

有什麼建議嗎?

回答

0

這是因爲你管理你的組件,而不是內部航線的步驟。你必須更改註冊頁面的路徑

const routes = (
    <Route path="/" component={App}> 
     <IndexRoute component={HomePage}/> 
     <Route path="registration/:id" component={hideIfLoggedIn(Registration)} > 
</Route 
     <Route path="reset-password" component={PasswordReset} /> 
     <Route path="portal" component={requireAuth(UserPage)} /> 
    </Route> 
); 

而且clickin incrementStep改變路由/註冊/ 1和ID將可裏面該組件爲this.props.params.id

+0

我更新了我的問題。 – Boky

相關問題