- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的多步表单的代码:
import clsx from 'clsx';
import React from 'react';
import PropTypes from 'prop-types';
import { makeStyles, withStyles } from '@material-ui/styles';
import Step from '@material-ui/core/Step';
import Stepper from '@material-ui/core/Stepper';
import StepLabel from '@material-ui/core/StepLabel';
import StepConnector from '@material-ui/core/StepConnector';
import { Container, Row, Col, Button } from 'react-bootstrap';
import Description from '@material-ui/icons/Description';
import AccountCircle from '@material-ui/icons/AccountCircle';
import DirectionsCar from '@material-ui/icons/DirectionsCar';
import Step1 from '../components/Step1';
import Step2 from '../components/Step2';
import Step3 from '../components/Step3';
const styles = () => ({
root: {
width: '90%',
},
button: {
marginRight: '0 auto',
},
instructions: {
marginTop: '0 auto',
marginBottom: '0 auto',
},
});
const ColorlibConnector = withStyles({
alternativeLabel: {
top: 22,
},
active: {
'& $line': {
backgroundColor: '#00b0ff',
},
},
completed: {
'& $line': {
backgroundColor: '#00b0ff',
},
},
line: {
height: 3,
border: 0,
backgroundColor: '#eaeaf0',
borderRadius: 1,
},
})(StepConnector);
const useColorlibStepIconStyles = makeStyles({
root: {
backgroundColor: '#ccc',
zIndex: 1,
color: '#fff',
width: 50,
height: 50,
display: 'flex',
borderRadius: '50%',
justifyContent: 'center',
alignItems: 'center',
},
active: {
backgroundColor: '#00b0ff',
boxShadow: '0 4px 10px 0 rgba(0,0,0,.25)',
},
completed: {
backgroundColor: '#00b0ff',
},
});
function ColorlibStepIcon(props) {
const classes = useColorlibStepIconStyles();
const { active, completed } = props;
const icons = {
1: <AccountCircle />,
2: <DirectionsCar />,
3: <Description />,
};
return (
<div
className={clsx(classes.root, {
[classes.active]: active,
[classes.completed]: completed,
})}
>
{icons[String(props.icon)]}
</div>
);
}
function getSteps() {
return ['Dati Assicurato', 'Dati Veicolo', 'Dati Assicurazione'];
}
function getStepContent(step) {
switch (step) {
case 0:
return <Step1/>;
case 1:
return <Step2/>;
case 2:
return <Step3/>;;
default:
return 'Unknown step';
}
}
class HorizontalLinearStepper extends React.Component {
constructor(props) {
super(props);
this.state = {
activeStep: 0,
agencyData: {}
};
}
static propTypes = {
classes: PropTypes.object,
};
isStepOptional = step => {
return step === 1;
};
handleNext = () => {
const { activeStep } = this.state;
this.setState({
activeStep: activeStep + 1,
});
};
handleBack = () => {
const { activeStep } = this.state;
this.setState({
activeStep: activeStep - 1,
});
};
handleReset = () => {
this.setState({
activeStep: 0,
});
};
logout = () => {
localStorage.clear();
this.props.history.push('/');
}
render() {
const { classes } = this.props;
const steps = getSteps();
const { activeStep } = this.state;
return (
<Container fluid>
<div className={classes.root}>
<Stepper alternativeLabel activeStep={activeStep} connector={<ColorlibConnector />}>
{steps.map((label, index) => {
const props = {};
return (
<Step key={label} {...props}>
<StepLabel StepIconComponent={ColorlibStepIcon}>{label}</StepLabel>
</Step>
);
})}
</Stepper>
<div>
{activeStep === steps.length ? (
<div style={{textAlign: 'center'}}>
<h1 style={{textAlign: 'center', paddingTop: 100, color: '#7fc297'}}>
TERMINATO
</h1>
<h4 style={{textAlign: 'center', paddingTop: 50}}>
Tutti gli step sono stati completati con successo!
</h4>
<h4 style={{textAlign: 'center'}}>
Procedi con la generazione del QR Code.
</h4>
<Row style={{marginTop: '40px'}} className='justify-content-center align-items-center text-center'>
<Col md={{span: 3}}>
<Button
style={{borderRadius: 30, borderWidth: 0, height: 50, width: 150, backgroundColor: '#f32a19', borderColor: '#f32a19'}}
disabled={activeStep === 0}
onClick={this.handleReset}
>
Annulla
</Button>
</Col>
<Col md={{span: 3}}>
<Button
style={{borderRadius: 30, borderWidth: 0, height: 50, width: 150, backgroundColor: '#00b0ff'}}
onClick={() => console.log('Click')}
>
Procedi
</Button>
</Col>
</Row>
</div>
) :
(
<Container style={{}}>
<h2 className={classes.instructions}>{getStepContent(activeStep)}</h2>
<Row className='justify-content-center align-items-center text-center'>
<Col md={{span: 3}}>
<Button
style={{marginTop: 10, backgroundColor: 'gold', borderRadius: 30, borderWidth: 0, height: 50, width: 150}}
disabled={activeStep === 0}
onClick={this.handleBack}
>
Indietro
</Button>
</Col>
<Col md={{span: 3}}>
{
activeStep === steps.length - 1 ?
<Button
style={{marginTop: 10, borderRadius: 30, borderWidth: 0, height: 50, width: 150, backgroundColor: '#7fc297'}}
onClick={this.handleNext}
>
Finito
</Button>
:
<Button
style={{marginTop: 10, backgroundColor: '#00b0ff', borderRadius: 30, borderWidth: 0, height: 50, width: 150}}
onClick={this.handleNext}
>
Avanti
</Button>
}
</Col>
</Row>
</Container>
)}
</div>
</div>
</Container>
);
}
}
export default withStyles(styles)(HorizontalLinearStepper);
它由三个步骤组成,在每个步骤中我都要求提供很多数据。
这是其中一个Step
的代码(都是一样的,不同的是输入框的内容):
import React from 'react';
import { Container, Row, Col, Form } from 'react-bootstrap';
export default function Step2(props) {
return(
<Container>
<Row style={{marginTop: '30px'}} className='h-100 justify-content-center align-items-center'>
<Col md={{ span: 6 }} className='text-center my-auto'>
<h3 style={{marginBottom: '1rem'}}>Dati Veicolo</h3>
<Form>
<Form.Row>
<Form.Group as={Col}>
<Form.Control
type='text'
placeholder='Marca'
required
/>
</Form.Group>
<Form.Group as={Col}>
<Form.Control
type='text'
placeholder='Targa'
required
/>
</Form.Group>
</Form.Row>
<Form.Group>
<Form.Control
type='text'
placeholder='Paese immatricolazione'
required
/>
</Form.Group>
<h6 style={{marginBottom: '1rem'}}>Possiede un rimorchio?</h6>
<Form.Group>
<Form.Control
type='text'
placeholder='Targa'
/>
</Form.Group>
<Form.Group>
<Form.Control
type='text'
placeholder='Paese immatricolazione'
/>
</Form.Group>
</Form>
</Col>
</Row>
</Container>
);
}
我需要做的是在用户进入下一步之前检查每一步是否有错误,以便他们只有在正确完成第一步的情况下才能开始填写表单的第二步,并且很快 ...我如何逐步进行此检查?
此外,我如何收集我在表单的主要部分中要求的所有数据,以便在用户完成整个表单后我可以处理所有这些数据?
在此link有例子
最佳答案
你的组件层次结构看起来不错,我想添加一件事来把东西放在一起,比如你可以像这样在主要组件状态中创建一个数组的步骤
class Main extends React.Component{
state = {
...OTHER_STATE_PROPERTIES,
activeStep: 0 | 1| 2,
steps: [{
name: 'step-name',
icon: 'icon-name',
content: Form1 | Form2 | Form3, // this is optional, you can use getContent too
data: {}
}]
}
// pass this function as prop to every Form Component
// We will talk about this function soon
handleStepSubmit = (stepIndex, data) => {
this.setState((prevState) => ({
...prevState,
activeIndex: prevState.activeIndex + 1,
steps: prevState.map((step, index) => {
if(stepIndex !== index){
return step;
}
return {
...step,
data
}
})
}))
}
//... Other stuff
}
现在每个 Form 都应该有自己的 state
(这样只有表单在输入更改时重新呈现)和 form
,其中您可以处理输入并验证它们并使用 Prop 将其发送到父组件步骤,因此我们需要在父组件中添加一个函数。 handleStepSubmit
函数只会在 onSubmit
调用 form
如何验证数据由你决定,你可以使用
这是我更喜欢的,通过使用 formik 你不必担心 onChange
、validation 和更多的东西,你可以提供它 validate
prop 你可以自己编写验证逻辑或者 validationSchema
prop 应该只给出 yup schema,如果 onSubmit
如果验证失败则不允许触发,你可以如果表单很简单,还可以输入属性。我们必须在 onSubmit
handleStepSubmit
P.S.: 它维护一个本地状态
在第0步我们将有
// I am omitting other stuff for understanding
state:{
activeStep: 0,
steps: [
{data: {}},
{data: {}},
{data: {}},
]
}
当用户提交表格 1 时,我们将拥有
// I am omitting other stuff for understanding
state:{
activeStep: 1,
steps: [
{data: formOneData},
{data: {}},
{data: {}},
]
}
现在,当 activeStep
为 3 时,您将拥有状态中的所有经过验证的数据,Horray!!举手击掌!如果需要,您还可以在进一步的步骤中获取之前步骤中的数据,因为我们的父组件状态中都有这些数据。
关于javascript - 如何使用 React 管理多步骤表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863744/
我在 mongodb 中的玩家和锦标赛之间存在多对多关系。 我希望能够一次将许多玩家添加到锦标赛中。如果没有 ajax,这很简单,但我们有一个包含数千名玩家的数据库,因此表单选择变得巨大。 我们想为此
这个问题已经有答案了: When should I use html's and when spring's in Spring MVC web app? (3 个回答) 已关闭 6 年前。 我正
我正在 C++ Builder XE4 上使用 VCL。 我有以下组件。 FormMain 具有 TButton *B_select; FormSelect(或DialogSelect)具有 TCom
如何在不影响表单控件的情况下更改表单的 alphablend? 德尔福XE7 最佳答案 此问题的一个解决方案是使用多设备应用程序(如果无法使用VCL)。 如果您需要保留透明的TForm,只需更改属性T
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在尝试扩展 Django 注册以包含我自己的注册表单。原则上这是相当简单的。我只需要编写自己的表单( CustomRegistrationForm ),它是原始表单( RegistrationFo
我正在尝试为我的网站实现聊天功能。为了做到这一点,我遵循了以下教程:https://channels.readthedocs.io/en/latest/tutorial/ 然后我稍微更改了代码以实现它
有一个问题,我需要用一个 html 表单提交两个相互关联的模型表单。我知道如何提交两个单独的表格,但是在相关模型表格的情况下外键让我发疯。 问题是,第二个表单应该用外键填充字段到第一个表单的实例。 在
我正在创建一个工具,允许某人输入食谱,然后将其保存为 XML 文件,我已经创建了 XSD,但我想知道如何在我的网页上制作一个表单以允许用户输入他们的食谱并遵守模式。我一直在研究 Ajax 和 Jque
在 .net win 表单(如 asp.net web 表单)中是否有可用的验证控件? 因为很难为我的每个控件设置正确的条件,所以我的表单中也有很多重复的代码。 正确的做法是什么? 最佳答案 看看这个
我有一个简短的问题。我正在学习如何使用 javascript 制作注册表,发现此链接非常有用。 http://www.w3resource.com/javascript/form/javascript
我正在开发一个项目,该项目将使用循环将许多表单添加到 mysql 数据库中。在 javascript 部分中,我无法让 var i 在函数 updatesum() 中工作。有人可以帮我吗? 我试图避免
在我的应用程序上有一个包含 2 个字段和一个保存按钮的表单。 在我的 onClick 结束时我需要什么来将光标返回到第一个字段。 我有这个来清除它们 txtData.setText("
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
<input type="text" name="textfield" onKeyPress="javascript:alert(event.
我正在构建的网站有一个登录表单,作为所有其他模板扩展的 base.html 模板的一部分;因此,我需要以某种方式处理每个页面上的登录/注销逻辑。 目前每个页面都在单独的 View 中加载,那么实现它的
我有一个表单类,看起来像.. #forms.py class ExampleForm(forms.Form): color = forms.CharField(max_length=25)
有没有办法在表单定义中给表单一个特殊的错误渲染函数?在 customizing-the-error-list-format 下的文档中它展示了如何为表单提供特殊的错误呈现函数,但似乎您必须在实例化表单
我正在处理由多个页面组成的表单,我想解决验证问题。 当我点击提交按钮时,当前页面上的所有字段都会在下方显示错误消息,但是如果我更改页面,那么我需要再次点击提交,因为这些字段未设置为已触摸。 如果我可以
是否可以附加到继承表单的 exclude 或 widgets 变量? 到目前为止,我有以下设置。 class AddPropertyForm(forms.ModelForm): num_mon
我是一名优秀的程序员,十分优秀!