reactjs - 将 react-input-mask 与 formik 和 formik-antd 一起使用
问题描述
我正在formik
使用@jbuschke/formik-antd
. 我需要对+7 (___) ___-__-__
输入应用掩码,所以我想使用react-input-mask
.
同时我需要解析值并删除除和数字之外的符号,+
所以我自己处理。我可以进入控制台日志,但是在提交时我得到的是初始值,而不是更改后的值。onChange
setFieldValue
changedValue
这是我的代码和演示:
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>
);
推荐阅读
- arrays - 如何在 Verilog 中预设寄存器数组?
- apache-spark - orderby 在 spark SQL 中没有给出正确的结果
- java - 如何将java文件转换为带有图标的可执行文件
- java - 如何在 Spring Boot 中更改配置变量名称?
- c# - 以下代码如何绕过 SharePoint ASP.NET 无脚本要求,以及如何防止它?
- php - 如何使用 MySQL 解决“发生数据库错误”
- sql - 使用来自同一来源的两个不同列创建一个表/视图
- javascript - PageYOffset 说明
- javascript - Javascript / HTML在鼠标单击时将照片添加到中心位置
- api - Roundcube休息api