【发布时间】:2018-10-24 03:50:03
【问题描述】:
我正在构建一个将用于逐步流程的组件,例如:
这个Workflow 组件将'steps' 的array 作为道具,然后它会完成其余的工作。这是上图中的调用方式:
let steps = [
{
display: "Sign Up Form",
component: SignupForm
},
{
display: "Verify Phone",
component: VerifyPhone
},
{
display: "Use Case Survey",
component: UseCase
},
{
display: "User Profile",
component: UserProfile
},
];
return (
<Workflow
steps={steps}
/>
);
component 字段指向要在该步骤中呈现的组件。例如SignupForm 组件如下所示:
export default class SignupForm extends React.Component {
...
render() {
return (
<div>
<div className="page-header">
<h1>New User Sign Up Form</h1>
<p>Something here...</p>
</div>
<div className="form-group">
<input type="email" className="form-control" placeholder="Email address..." />
<small id="emailHelp" className="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
</div>
);
}
}
我面临的问题是,在每个步骤中都需要一个Next 按钮来验证该步骤中的信息并移至下一步。我打算只将该按钮放在每个步骤的组件中,但这会降低用户友好性。当用户单击“下一步”并且一切都有效时,该步骤应该被折叠并且下一步应该打开。然而这意味着我的Workflow 组件需要呈现这个按钮。
所以,我需要我的Workflow 组件来调用每个步骤组件的方法来验证步骤中的信息并返回一个承诺,让它知道它是通过还是失败(带有任何错误消息)。我需要如何调用这个方法?这里是Workflow 组件呈现所有步骤的地方
如<step.component {...this.props} />:
{
this.state.steps.map((step, key) => {
return (
...
<Collapse isOpen={!step.collapsed}>
<step.component {...this.props} />
<Button color="primary"
onClick={() => this.validate(key)}>Next</Button>
<div className="invalid-value">
{step.error}
</div>
</Collapse>
...
);
})
}
这会呈现下一个按钮,以及 onClick 处理程序validate():
validate(i) {
let steps = _.cloneDeep(this.state.steps);
let step = steps[i];
step.component.handleNext().then(function () {
...
}).catch((err) => {
...
});
}
理想情况下,step.component.validate() 会在已渲染的组件内调用validate 方法:
export default class SignupForm extends React.Component {
....
validate() {
return new Promise((resolve, reject) => {
resolve();
})
}
render() {
...
}
}
.. 可以访问该组件的状态。但是,这不是它的工作原理。我怎样才能让它工作?我读了一些关于转发 refs 的内容,但不完全确定它是如何工作的。非常感谢任何帮助!
【问题讨论】: