gpt4 book ai didi

javascript - 使用函数更新表单值。 { react ,与 Formik}

转载 作者:行者123 更新时间:2023-11-30 18:59:58 25 4
gpt4 key购买 nike

我正在尝试使用 switch 语句制作一个多页表单,但我在更新 props.values.step 时遇到了问题,我将其用作我的 switch 语句变量,带有函数我继续收到“xyz 不是函数”错误附加是代码任何帮助都会很好,谢谢。

<------------App.js---------------->

import React from "react";
import MyEnhancedForm from "./pages/FormHolder";

function App() {
return (
<div className="App">
<MyEnhancedForm />
</div>
);
}

export default App;

<------------FormHolder.js---------------->

import Form from "./Form";
import { withFormik, Field } from "formik";
import * as Yup from "yup";
import VerifyPage from "./Verifypage";

const FormHolder = props => {
function handleIncrease() {
props.values.step += 1;
}

switch (props.values.step) {
case 1:
return <Form {...props} handleIncrease={handleIncrease} />;
case 2:
return <VerifyPage {...props} />;
default:
return null;
}
};

const MyEnhancedForm = withFormik({
mapPropsToValues: () => ({ step: 1, name: "" }),
validationSchema: Yup.object().shape({
name: Yup.string()
.max(55, "Error: Name is too long.")
.min(3, "Error: Name to short.")
}),
handleSubmit: () => {}
})(FormHolder);

export default MyEnhancedForm;

<------------Form.js---------------->

import React from "react";
import { Field } from "formik";
import { DisplayFormikState } from "./helper";
import { Card, FormGroup, Input, Label, Button } from "reactstrap";

const Form = (props, { handleIncrease }) => {
const nextStep = e => {
props.errors.name ? console.log(props.errors) : handleIncrease();
};

return (
<Card>
<FormGroup>
<Label for="name"></Label>
<Input
tag={Field}
bsSize="lg"
type="text"
name="name"
id="name"
component="input"
/>
<Button type="submit" onClick={nextStep}>
Next
</Button>
<DisplayFormikState {...props} />
</FormGroup>
</Card>
);
};

export default Form;

<----------------VerifyPage.js------------------>

还没有进入验证页面,所以上面内容很少。

import React from "react";
import * as Yup from "yup";
import { withFormik, Field } from "formik";
import { DisplayFormikState } from "./helper";
import { Card, FormGroup, Input, Label, Button } from "reactstrap";

const VerifyPage = props => {
const prevStep = event => {
event.preventDefault();
props.handleDecrease();
};
return (
<Card>
Verify Page
<DisplayFormikState {...props} />
</Card>
);
};

export default VerifyPage;

<------------helper.js---------------->

import React from "react";

export const DisplayFormikState = props => (
<div style={{ margin: "1rem 0" }}>
<h3 style={{ fontFamily: "monospace" }} />
<pre
style={{
background: "#f6f8fa",
fontSize: ".65rem",
padding: ".5rem"
}}
>
<strong>props</strong> = {JSON.stringify(props, null, 2)}
</pre>
</div>
);

最佳答案

你的问题在 Form.js 中:

const Form = (props, { handleIncrease }) => {
const nextStep = e => {
props.errors.name ? console.log(props.errors) : handleIncrease();
};

handleIncrease 是一个 prop,因此您应该改为执行以下操作:

const Form = props => {
const nextStep = e => {
props.errors.name ? console.log(props.errors) : props.handleIncrease();
};

另一个问题:您正在改变 values.step,这将导致更多问题(例如,更新它不会导致重新渲染)。没有真正的理由让 Formik 管理 step,因为它不是表单输入值。相反,您可以将其存储在状态中:

const FormHolder = props => {
const [step, setStep] = React.useState(1);

function handleIncrease() {
setStep(step => step + 1);
}

function handleDecrease() {
setStep(step => step - 1);
}

关于javascript - 使用函数更新表单值。 { react ,与 Formik},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com