在 formik 和 formik-antd 中使用 react-input-mask
Using react-input-mask with formik and formik-antd
我正在使用 formik
和 @jbuschke/formik-antd
。我需要将掩码 +7 (___) ___-__-__
应用于输入,所以我想使用 react-input-mask
.
同时我需要解析值并删除除+
和数字之外的符号,所以我自己处理onChange
和setFieldValue
。我可以在控制台日志中得到 changedValue
,但在提交时我得到的是初始值,而不是更改后的值。
这是我的代码和 demo:
const CustomInput = props => (
<InputMask {...props}>{inputProps => <Input {...inputProps} />}</InputMask>
);
const CloseForm = () => (
<Formik
initialValues={{ phone: "" }}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
validate={handleValidate}
>
{({ isSubmitting, values, setFieldValue }) => {
return (
<Form>
<FormItem name="phone" label="Phone" required="true">
<CustomInput
mask="+7 (999) 999-99-99"
name="phone"
onChange={e => {
const value = e.target.value || "";
const changedValue = value
.replace(/\)/g, "")
.replace(/\(/g, "")
.replace(/-/g, "")
.replace(/ /g, "");
console.log({ value });
console.log({ changedValue });
setFieldValue("phone", value);
}}
/>
</FormItem>
<SubmitButton type="primary" disabled={isSubmitting}>
Submit
</SubmitButton>
<pre>{JSON.stringify(values, null, 2)}</pre>
</Form>
);
}}
</Formik>
);
如何修复?
问题是您解析了值但没有在任何地方更新它,因此 changedValue
在范围的末尾终止。
将解析移至 onSubmit
回调,不仅您在每次渲染时都进行了不必要的解析,而且您也不需要解析值的另一个状态。
提示:使用单个 regex
表达式,不需要那么多替换。
const CloseForm = () => (
<Formik
initialValues={{ phone: '' }}
onSubmit={(value, { setSubmitting }) => {
const changedValue = value.phone
.replace(/\)/g, '')
.replace(/\(/g, '')
.replace(/-/g, '')
.replace(/ /g, '');
setTimeout(() => {
alert(JSON.stringify(changedValue, null, 2));
setSubmitting(false);
}, 400);
}}
validate={handleValidate}
>
{({ isSubmitting, values, setFieldValue }) => {
return (
<Form>
<FormItem name="phone" label="Phone" required="true">
<CustomInput
mask="+7 (999) 999-99-99"
name="phone"
onChange={e => {
const value = e.target.value || '';
console.log({ value });
setFieldValue('phone', value);
}}
/>
</FormItem>
<SubmitButton type="primary" disabled={isSubmitting}>
Submit
</SubmitButton>
<pre>{JSON.stringify(values, null, 2)}</pre>
</Form>
);
}}
</Formik>
);
我正在使用 formik
和 @jbuschke/formik-antd
。我需要将掩码 +7 (___) ___-__-__
应用于输入,所以我想使用 react-input-mask
.
同时我需要解析值并删除除+
和数字之外的符号,所以我自己处理onChange
和setFieldValue
。我可以在控制台日志中得到 changedValue
,但在提交时我得到的是初始值,而不是更改后的值。
这是我的代码和 demo:
const CustomInput = props => (
<InputMask {...props}>{inputProps => <Input {...inputProps} />}</InputMask>
);
const CloseForm = () => (
<Formik
initialValues={{ phone: "" }}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
validate={handleValidate}
>
{({ isSubmitting, values, setFieldValue }) => {
return (
<Form>
<FormItem name="phone" label="Phone" required="true">
<CustomInput
mask="+7 (999) 999-99-99"
name="phone"
onChange={e => {
const value = e.target.value || "";
const changedValue = value
.replace(/\)/g, "")
.replace(/\(/g, "")
.replace(/-/g, "")
.replace(/ /g, "");
console.log({ value });
console.log({ changedValue });
setFieldValue("phone", value);
}}
/>
</FormItem>
<SubmitButton type="primary" disabled={isSubmitting}>
Submit
</SubmitButton>
<pre>{JSON.stringify(values, null, 2)}</pre>
</Form>
);
}}
</Formik>
);
如何修复?
问题是您解析了值但没有在任何地方更新它,因此 changedValue
在范围的末尾终止。
将解析移至 onSubmit
回调,不仅您在每次渲染时都进行了不必要的解析,而且您也不需要解析值的另一个状态。
提示:使用单个 regex
表达式,不需要那么多替换。
const CloseForm = () => (
<Formik
initialValues={{ phone: '' }}
onSubmit={(value, { setSubmitting }) => {
const changedValue = value.phone
.replace(/\)/g, '')
.replace(/\(/g, '')
.replace(/-/g, '')
.replace(/ /g, '');
setTimeout(() => {
alert(JSON.stringify(changedValue, null, 2));
setSubmitting(false);
}, 400);
}}
validate={handleValidate}
>
{({ isSubmitting, values, setFieldValue }) => {
return (
<Form>
<FormItem name="phone" label="Phone" required="true">
<CustomInput
mask="+7 (999) 999-99-99"
name="phone"
onChange={e => {
const value = e.target.value || '';
console.log({ value });
setFieldValue('phone', value);
}}
/>
</FormItem>
<SubmitButton type="primary" disabled={isSubmitting}>
Submit
</SubmitButton>
<pre>{JSON.stringify(values, null, 2)}</pre>
</Form>
);
}}
</Formik>
);