Javascript 更新Formik表单上的initialValues属性不会更新输入值
我使用了一个formik表单,前面有这样的引用 Form.js 单击第二个选项卡时Javascript 更新Formik表单上的initialValues属性不会更新输入值,javascript,reactjs,formik,Javascript,Reactjs,Formik,我使用了一个formik表单,前面有这样的引用 Form.js 单击第二个选项卡时 TabsForms.js中的initialValues状态将更新,以便value.input=30000 Form.js和FormikWithRef.js中的initialValues属性也反映了value.input=3000 但是,在MoneyBox.js组件中使用forimk中的useField钩子,field对象没有值30000,而是字段值之前的值,这是为什么 我创建了一个控制台来查看所有使用的组件,
中的TabsForms.js
状态将更新,以便initialValues
=value.input
李>30000
和Form.js
中的FormikWithRef.js
属性也反映了initialValues
=value.input
3000
- 但是,在
组件中使用MoneyBox.js
中的forimk
钩子,useField
对象没有field
值
,而是字段值之前的值,这是为什么30000
我在这个问题上纠缠了几天,似乎找不到解决方案,非常感谢您的帮助。如果您希望在更改
初始值时更改输入值,则需要将道具作为true
传递到Formik
组件
因此,您需要在代码中更改的是TabsForm.js
传递到表单
组件中的prop启用重新初始化
<Form
enableReinitialize
initialValues={initialValues}
onSubmit={onFormSubmit}
formRef={formRef}
>
<FieldWrapper>
<MoneyBox name="input" currencySymbol={"£"} />
</FieldWrapper>
</Form>
我不太确定您的业务逻辑应该如何工作,但下面是一个关于上述更改的示例。()
它被称为initialValues
,那么为什么您希望它在更改表单值时更新表单值呢?(不过,您可以使用enableReinitialize
prop要求它这样做,正如@Vencovsky在另一个答案中提到的那样。)
要将所需值(easy peasy
store中的value.input
)绑定到formik input,您可以使用:
const [field, meta, helpers] = useField(props);
useEffect(() => {
helpers.setValue(value.input)
}, [value])
每次存储中的值发生变化时,它都会更新formik输入字段的值
要更改存储中状态的值,可以使用设置选项卡的方法。(使用easy peasy
store。)
在Tabs.js
中的第49行,它在单击选项卡时更新值
在Input.js
的第19行,它将输入值绑定到您的存储状态。enableReinitialize={true}prop将为您提供帮助。谢谢。不知道道具的存在!请慢慢来提供高质量的答案。你能解释一下它的工作原理,并添加一个小例子吗?请看?
import React, { useState, useEffect, useRef } from "react";
import styled from "styled-components";
import { useStoreState } from "easy-peasy";
import Form from "./Form";
import MoneyBox from "./MoneyBox";
const Container = styled.div`
width: 100%;
background-color: #dfdfdf;
`;
const FieldWrapper = styled.div`
padding: 20px 12px;
`;
const TabsForm = () => {
const [initialValues, setInitialValues] = useState();
const type = useStoreState((state) => state.type);
const value = useStoreState((state) => state.value);
const formRef = useRef(null);
const onFormSubmit = async (values) => {
console.log({ values });
};
useEffect(() => {
if (value && type) {
let filterVal = { ...value };
/* here is where I update the input value to be 3000,
the initial values get updated and in the `Form.js` file,
the console log from here also reflects this update,
however, the input field does not update? */
if (type === "Two") filterVal.input = 30000;
setInitialValues(filterVal);
}
}, [value, type]);
useEffect(() => {
// check initialValues has updated
console.log({ initialValues });
}, [initialValues]);
return (
<Container>
{initialValues && type ? (
<Form
initialValues={initialValues}
onSubmit={onFormSubmit}
formRef={formRef}
>
<FieldWrapper>
<MoneyBox name="input" currencySymbol={"£"} />
</FieldWrapper>
</Form>
) : null}
</Container>
);
};
export default TabsForm;
<Form
enableReinitialize
initialValues={initialValues}
onSubmit={onFormSubmit}
formRef={formRef}
>
<FieldWrapper>
<MoneyBox name="input" currencySymbol={"£"} />
</FieldWrapper>
</Form>
const Form = ({
formRef,
children,
initialValues,
validationSchema,
onSubmit,
enableReinitialize
}) => {
return (
<FormikWithRef
enableReinitialize={enableReinitialize}
validateOnChange={true}
validateOnBlur={true}
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={onSubmit}
ref={formRef}
>
{(props) => <form onSubmit={props.handleSubmit}>{children}</form>}
</FormikWithRef>
);
};
const [field, meta, helpers] = useField(props);
useEffect(() => {
helpers.setValue(value.input)
}, [value])