如何根据条件显示表单组件?
How to show form components based on conditions?
我有一个包含 3 个表单的表单,每个子表单都有其单独的提交按钮,而父表单将有其自己的提交按钮。我想一个接一个地显示表格,就像最初只显示第一个表格,然后单击继续,将显示第一个和第二个表格,然后再次单击继续,将显示第一个、第二个、第三个表格。所有 3 个表单都在 3 个不同组件的同一页面上。
代码结构是这样的: Codebox link
我也遇到了错误
<form> cannot appear as a descendant of <form>
因为表格中的表格,有没有办法实现同样的效果而不是错误
我想到了这样的事情,我们可以保留表格编号的计数,并在每次单击继续时加一。但是在启用继续按钮之前需要进行验证,另外,您需要额外处理最后一步。
export default function App() {
const [formNumber, setFormNumber] = useState(0)
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{formNumber === 0 && <Form1 initialValues={initialValues} />}
{formNumber === 1 && <Form2 initialValues={initialValues} />}
{formNumber === 2 && <Form3 initialValues={initialValues} />}
<div className="flex flex-row-reverse">
<button onClick={()=> setFormNumber(formNumber + 1)} type="button">Continue</button>
</div>
</Form>
)}
</Formik>
);
}
您可以不使用表单组件,而是将其设为具有 3 个输入的单个表单。我相信那会更容易。
您应该使用 useState
保存当前表单的索引,然后创建一个函数来更改当前索引并将其作为函数传递给 child 组件!
使用这个:
import "./styles.css";
import React,{useState} from "react";
import { Formik, Form } from "formik";
import Form1 from "./Form1";
import Form2 from "./Form2";
import Form3 from "./Form3";
export default function App() {
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
const [index, setIndex] = useState(0);
const nextIndex = ()=>{
setIndex(index+1);
}
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{
index==0?<Form1 initialValues={initialValues} handleIndex={nextIndex}/>:
index==1?<Form2 initialValues={initialValues} handleIndex={nextIndex}/>:
<Form3 initialValues={initialValues} handleIndex={nextIndex}/>
}
<div className="flex flex-row-reverse">
<button type="button">Continue</button>
</div>
</Form>
)}
</Formik>
);
}
现在,在每个 child 中使用 handleIndex
函数转到下一个表格!
你需要使用状态来控制它:https://codesandbox.io/s/elated-dawn-zlh5x?file=/src/App.js
export default function App() {
const [formNumber, setFormNumber] = useState(0);
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{formNumber >= 0 && <Form1 initialValues={initialValues} />}
{formNumber >= 1 && <Form2 initialValues={initialValues} />}
{formNumber >= 2 && <Form3 initialValues={initialValues} />}
<div className="flex flex-row-reverse">
<button type="button" onClick={() => setFormNumber(formNumber + 1)}>
Continue
</button>
</div>
</Form>
)}
</Formik>
);
}
我有一个包含 3 个表单的表单,每个子表单都有其单独的提交按钮,而父表单将有其自己的提交按钮。我想一个接一个地显示表格,就像最初只显示第一个表格,然后单击继续,将显示第一个和第二个表格,然后再次单击继续,将显示第一个、第二个、第三个表格。所有 3 个表单都在 3 个不同组件的同一页面上。 代码结构是这样的: Codebox link
我也遇到了错误
<form> cannot appear as a descendant of <form>
因为表格中的表格,有没有办法实现同样的效果而不是错误
我想到了这样的事情,我们可以保留表格编号的计数,并在每次单击继续时加一。但是在启用继续按钮之前需要进行验证,另外,您需要额外处理最后一步。
export default function App() {
const [formNumber, setFormNumber] = useState(0)
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{formNumber === 0 && <Form1 initialValues={initialValues} />}
{formNumber === 1 && <Form2 initialValues={initialValues} />}
{formNumber === 2 && <Form3 initialValues={initialValues} />}
<div className="flex flex-row-reverse">
<button onClick={()=> setFormNumber(formNumber + 1)} type="button">Continue</button>
</div>
</Form>
)}
</Formik>
);
}
您可以不使用表单组件,而是将其设为具有 3 个输入的单个表单。我相信那会更容易。
您应该使用 useState
保存当前表单的索引,然后创建一个函数来更改当前索引并将其作为函数传递给 child 组件!
使用这个:
import "./styles.css";
import React,{useState} from "react";
import { Formik, Form } from "formik";
import Form1 from "./Form1";
import Form2 from "./Form2";
import Form3 from "./Form3";
export default function App() {
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
const [index, setIndex] = useState(0);
const nextIndex = ()=>{
setIndex(index+1);
}
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{
index==0?<Form1 initialValues={initialValues} handleIndex={nextIndex}/>:
index==1?<Form2 initialValues={initialValues} handleIndex={nextIndex}/>:
<Form3 initialValues={initialValues} handleIndex={nextIndex}/>
}
<div className="flex flex-row-reverse">
<button type="button">Continue</button>
</div>
</Form>
)}
</Formik>
);
}
现在,在每个 child 中使用 handleIndex
函数转到下一个表格!
你需要使用状态来控制它:https://codesandbox.io/s/elated-dawn-zlh5x?file=/src/App.js
export default function App() {
const [formNumber, setFormNumber] = useState(0);
const initialValues = { name: "", email: "", number: "" };
const onSubmit = async (values, { setSubmitting }) => {
console.log(" Final Values", values);
};
return (
<Formik initialValues={initialValues} onSubmit={onSubmit}>
{({ isSubmitting, values, setFieldValue }) => (
<Form className="space-y-7">
{formNumber >= 0 && <Form1 initialValues={initialValues} />}
{formNumber >= 1 && <Form2 initialValues={initialValues} />}
{formNumber >= 2 && <Form3 initialValues={initialValues} />}
<div className="flex flex-row-reverse">
<button type="button" onClick={() => setFormNumber(formNumber + 1)}>
Continue
</button>
</div>
</Form>
)}
</Formik>
);
}