我有一个包含其他组件的Home组件。组件之一是一个多步骤注册表单,该表单包含三个步骤-1.选择计划,2。帐户详细信息和3.谢谢页面。主页组件显示“多步骤注册”表单的第一步,即“选择计划”组件。
单击计划后,我希望在同一页面上打开“帐户”组件,以覆盖“主页”组件而不是替换当前组件。同时,我希望道具能够传递给子组件。
包含SignUpForm的Home组件
class Home extends Component {
render() {
return (
<div>
<Video/>
<Featured/>
<SignUpForm />
</div>
);
}
}
多步骤注册表格-
import React, { Component } from "react";
import Plan from "./Plan";
import Account from "./Account";
import ThankYou from "./ThankYou";
export default class SignUpForm extends Component {
state = {
step: 1,
account_type: "",
first_name: "",
last_name: "",
email: "",
password: "",
};
// Proceed to next step
nextStep = () => {
const { step } = this.state;
this.setState({
step: step + 1
});
console.log(this.state.step);
};
// Go back to previous step
prevStep = () => {
const { step } = this.state;
this.setState({
step: step - 1
});
};
// Handle fields change
handleChange = input => e => {
this.setState({ [input]: e.target.value });
};
render() {
const { step } = this.state;
const {
account_type,
price,
first_name,
last_name,
email,
password,
token
} = this.state;
const values = {
account_type,
price,
first_name,
last_name,
email,
password,
token
};
switch (step) {
case 1:
return (
<Plan
nextStep={this.nextStep}
handleChange={this.handleChange}
values={values}
/>
);
case 2:
return (
<Account
nextStep={this.nextStep}
prevStep={this.prevStep}
handleChange={this.handleChange}
values={values}
/>
);
case 3:
return <ThankYou />;
}
}
}
答案 0 :(得分:1)
因此,您希望Home
组件的孙子覆盖home组件吗?您根本无法通过这种方式做到这一点。
如果要覆盖的原因是,您不想显示Video
和Featured
组件,只需将“步进”逻辑上移到Home
组件即可。然后,您可以像这样返回:
switch (step) {
case 1:
return (
<Video />
<Featured />
<Plan
nextStep={this.nextStep}
handleChange={this.handleChange}
values={values}
/>
);
case 2:
return (
<Account
nextStep={this.nextStep}
prevStep={this.prevStep}
handleChange={this.handleChange}
values={values}
/>
);
case 3:
return (
<Video>
<Featured />
<ThankYou />
);
}
如果您真的要替换Home组件,则将所有逻辑再上移一个组件,即High Order组件。
class MyComponent extends React.Component {
\\all your logic and inside the render function:
switch (step) {
case 1:
return (
<Home {...props}/>
);
case 2:
return (
<Account
{...props}
/>
);
case 3:
return (
<Home {...props}/>
);
}
}
请记住,当逻辑上移时,状态变成较低组件中的道具,您需要将状态从较高组件中的逻辑向下传递为道具。
答案 1 :(得分:0)
我不清楚您是否希望它停留在屏幕顶部吗?
<Video/>
<Featured/>
如果您在应用中使用的是类似React-Navigation的东西,则可以通过这种方式传递参数,而不是使用switch语句,请使用Navigation.navigate转到您选择的特定屏幕。