【问题标题】:How to build a multi-step form flow with react-redux, that changes URLs per step如何使用 react-redux 构建多步骤表单流,每一步更改 URL
【发布时间】:2017-05-29 17:13:05
【问题描述】:

我正在构建一个用户首先加载的多步骤表单流:/welcome,然后应该引导用户完成以下操作

step 0: `/welcome` (Should redirect to step 1)
step 1: `/welcome/workplace`
step 2: `/welcome/profile`

这是我目前所拥有的:

App.jsx:

import Welcome from '../containers/welcome/Welcome';

const App = ({store}) => {
  return (
    <StoreProvider store={store}>
      <ConnectedRouter history={history}>
        <Switch>
          <PrivateRoute exact path="/welcome" layout={MainLayout} component={Welcome} />
          <WithMainLayout exact path="/" component={Home} />
          <AuthRoutes path={`/${clientResourceName}`} wrapper={WithMainLayout} />
          <WithMainLayout component={NotFound} />
        </Switch>
      </ConnectedRouter>
    </StoreProvider>
  );
};

Welcome.js

import React from 'react';
import WorkPlacePage from '../../components/welcome/WorkPlacePage';

class Welcome extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      step: 1
    };
  }

  showStep() {
    const {history} = this.props

    console.log('showStep');
    console.log({history})

    switch (this.state.step) {
      case 1:
        return <WorkPlacePage history={history} />
      default:
        return (
          <div>
            <h1>Case: Default</h1>
          </div>
        );
    }
  }

  render() {
    var style = {
      width : (this.state.step / 4 * 100) + '%'
    }
    return (
      <main>
        <span className="progress-step">Step {this.state.step}</span>
        <progress className="progress" style={style}></progress>
        {this.showStep()}
      </main>
    )
  }
}

export default Welcome;

WorkPlacePage.js

import React from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';

class WorkPlacePage extends React.Component {

  render() {

    console.log('this.props.history')
    console.log(this.props.history)

    return (
      <div>
        <h1>Workplace</h1>
        <span>
        survey things
        <button onClick={() => this.props.history.push("/confirmation")}>next page</button>
        </span>
      </div>
    );
  }
}

export default WorkPlacePage;

作为一个反应,redux 新手,我可以在以下方面使用您的建议:

  1. 我是否正确地构建了这个多步骤表单?
  2. 如果用户在其浏览器中加载/welcome,将浏览器自动重定向到步骤 1 /welcome/workplace 的正确方法是什么
  3. 在 WorkplacePage.js 上,单击 NEXT 按钮时出现以下 JS 错误:=Uncaught TypeError: Cannot read property 'push' of undefined --- 为什么未定义历史记录?

感谢所有专家的帮助!

【问题讨论】:

  • 你需要将 props 传入&lt;WorkPlacePage /&gt;
  • @BlairAnderson 感谢您的回复。对前两个问题有什么想法吗?
  • 1.是/确定这看起来不错,您正在制作一个状态机,并且必须使用结构。
  • 2.重定向你可以渲染&lt;Redirect to="/somewhere/else"/&gt; - github.com/ReactTraining/react-router/blob/master/packages/…
  • @BlairAnderson 如何将道具传递到 WorkPlacePage?

标签: reactjs react-redux


【解决方案1】:
  1. 是的,这个结构看起来不错。我认为您会希望为每个步骤创建一个单独的路由组件,因为我确信每个步骤都会随着更多规则和验证而增长。

  2. 要重定向,您可以呈现&lt;Redirect to="/somewhere/else"/&gt; - https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Redirect.md

  3. 您需要将道具传递到&lt;WorkPlacePage /&gt;

类似:

class Welcome extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      step: 1
    };
  }

  render() {
    const {history} = this.props
    switch (this.state.step) {
      case 1:
        return <WorkPlacePage history={history} />
      case 2:
        return (
          <div>
            <h1>WIP</h1>
          </div>
        );
      default:
        return (
          <div>
            <h1>Case: Default</h1>
          </div>
        );
        }

  }
}

【讨论】:

  • 谢谢...这应该住在哪里? {history} = this.props
  • @AnApprentice 在 Welcome 组件中,您将在其中呈现 WorkPlacePage
  • 谢谢,但这仍然是坏的。在 WorkPlacePage.js 中,在我 console.log this.props.history 的渲染函数中它仍然是未定义的。
  • 另外,如果我在 Welcome.js 中 console.log console.log({history}) 我会得到未定义的对象历史记录
  • 你能登录console.log(this.props)console.log(this.context)吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多