javascript - 在 ReactJS Hook 中的表单内单击时添加更多输入
问题描述
我的 React 应用程序内部存在一些问题,目前我使用 Hook 在 ReactJS 中构建了一个多步骤,但我对这项技术还是新手。问题是:当我在表单中添加输入并传递到下一步时,数据丢失了。我可以解决谁?
为了比我的尝试更合理地重新开始,我没有将生成输入的代码提供给您,因为我知道如果我进入下一步,它不会保留数据。
表单.js
const [formData, setFormData] = useState({
stepOne: {
lastName: {
value: '',
required: true,
type: 'input',
placeholder: 'Nom du client',
label: 'Nom*',
classField: 'col-lg-6'
}
},
stepTwo: {
quantity: {
value: '',
required: true,
type: 'input',
placeholder: '3',
label: 'Quantité*',
classField: 'col-lg-2'
}
},
stepThree: {
origine: {
value: '',
required: true,
type: 'input',
placeholder: 'Sélectionnez l\'origine',
label: 'Origine*',
classField: 'col-lg-6'
}
},
});
const [errors, setErrors] = useState(1);
const changeHandler = (step, e) => {
e.persist();
setFormData(prev => ({
...prev,
[step]: {
...prev[step],
[e.target.name]: {
...prev[step][e.target.name],
value: e.target.value
}
}
}));
}
const stepChangeHandler = (values, e) => {
e.preventDefault();
const newErrors = validate(values);
setErrors(newErrors);
if (Object.keys(newErrors).length === 0) {
setStep(step + 1);
}
}
const submitHandler = (e) => {
e.preventDefault();
const data = new FormData();
// Nous pouvons envoyer la donnée à une API
console.log(formData);
}
Step.js
const Step = ({data, onChange, onStepChange, errors, stepKey, step, onPrevStep}) => {
let output = [];
for (const [key, val] of Object.entries(data)) {
if (val.type.split(':')[0] === 'input') {
output.push(
<Input
key={key}
placeholder={val.placeholder}
name={key}
label={val.label}
classField={val.classField}
value={val.value}
onChange={(e) => onChange(stepKey, e)}
error={errors[key]}
type={val.type.split(':')[1]}
/>
);
} else if (val.type === 'select') {
output.push(
<Select
key={key}
name={key}
label={val.label}
classField={val.classField}
value={val.value}
onChange={(e) => onChange(stepKey, e)}
error={errors[key]}
choices={val.choices}
/>
);
} else if (val.type === 'date') {
output.push(
<Date
key={key}
name={key}
label={val.label}
classField={val.classField}
value={val.value}
onChange={(e) => onChange(stepKey, e)}
error={errors[key]}
type={val.type.split(':')[1]}
/>
);
} else if (val.type === 'checkbox') {
output.push(
<Checkbox
key={key}
name={key}
label={val.label}
classField={val.classField}
value={val.value}
onChange={(e) => onChange(stepKey, e)}
error={errors[key]}
type={val.type.split(':')[1]}
/>
);
}
}
return (
<Fragment>
{step > 1 &&
<button type="button" className="previousStepButton" onClick={() => onPrevStep(step - 1)}>Étape
précédente</button>}
{output}
<div className="col-lg-12">
<button type="button" className="btn-step nextStepButton"
onClick={(e) => onStepChange(data, e)}>Étape suivante
</button>
</div>
</Fragment>
);
}
输入.js
const Input = ({
type = 'text',
placeholder, name, value, onChange, error, label, classField, disabled
}) => {
return (
<div className={classField}>
<div className="inputBox">
<label htmlFor={name} className={error ? "labelField is-danger" : "labelField"}>{label}</label>
<input
className={error ? "inputField is-danger" : "inputField"}
type={type}
placeholder={placeholder}
name={name}
id={name}
value={value}
onChange={onChange}
autoComplete="off"
/>
{error && <div className="has-text-danger-dark">{error}</div>}
</div>
</div>
);
}
解决方案
推荐阅读
- c++ - _tcsstr 的标头
- tensorflow - TensorFlow 无法识别的参数 \\
- javascript - 识别相同的“手气”搜索
- javascript - 检测单击当前活动的选项卡。(角材料选项卡)
- android - 与在 AndroidManifest.xml [Ionic 3] 中声明的元素重复
- r - 如何在 R 中有效地请求栅格堆栈的一部分
- r - 如何删除数据框中的列的重复项,该列是 R 中的字符?
- sql-server - SQL Server CTE 左外连接
- java - PDPageContentStream.AppendMode 无法解析
- xml - 如何在 C# 中解析 Solr facet 结果