如何使React多步骤表单与React Router一起使用?

时间:2017-02-26 18:31:59

标签: javascript reactjs react-router

我正在努力学习React + ReactRouter来构建一个多步骤的表单。我在这里工作了一个例子:https://www.viget.com/articles/building-a-multi-step-registration-form-with-react

问题是此示例没有使用ReactRouter,因此URL在表单期间永远不会更改。作者提到"您可以将每个步骤设置为自定义路线"但是,我还没有弄清楚如何让它发挥作用。如何更新当前的渲染过程以使用ReactRouter?

render: function() {
    switch (this.state.step) {
        case 1:
    return <AccountFields fieldValues={fieldValues}
                          nextStep={this.nextStep}
                          saveValues={this.saveValues} />
        case 2:
    return <SurveyFields  fieldValues={fieldValues}
                          nextStep={this.nextStep}
                          previousStep={this.previousStep}
                          saveValues={this.saveValues} />
        case 3:
    return <Confirmation  fieldValues={fieldValues}
                          previousStep={this.previousStep}
                          submitRegistration={this.submitRegistration} />
        case 4:
    return <Success fieldValues={fieldValues} />
    }
}

我试过了:

  render: function() {
        switch (this.state.step) {
            case 1:
        return <AccountFields fieldValues={fieldValues}
                              nextStep={this.nextStep}
                              saveValues={this.saveValues} />
            case 2:
                       browserHistory.push('/surveyfields')
            case 3:
                      browserHistory.push('/confirmation')
            case 4:
                       browserHistory.push('/success')
        }
    }

已更新

..
        case 2:
            <Route path="/surveyfields" component={SurveyFields}/>
..

var Welcome = React.createClass({
  render() {
    return (
      <Router history={browserHistory}>
        <Route path='/welcome' component={App}>
          <IndexRoute component={Home} />
          <Route path='/stuff' component={Stuff} />
          <Route path='/features' component={Features} />
          <Route path='/surveyfields' component={SurveyFields} />

        </Route>
      </Router>
    );
  }
});

1 个答案:

答案 0 :(得分:1)

如果您按照这样的方式进行路由,则从/surveyfields转换为/success不会影响Survey组件的状态。

<Route path="/surveyfields" component={Survey}/>
<Route path="/confirmation" component={Survey}/>
<Route path="/success" component={Survey}/>
然而,

React Router会更新道具并触发渲染。如果您想根据网址呈现不同的内容,请使用render方法。

if(this.props.location.pathname==="/surveyfields")
   return (
     <span>
       survey things
       <Button onClick={() => this.props.history.push("/confirmation")}>next page</Button>
   </span>)
if(this.props.location.pathname==="/confirmation")
   return <span>do you want to do this</span>

单击该按钮将导航到下一页。 React路由器为路由组件插入locationhistory道具。