- 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/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!