【问题标题】:Using react-input-mask with formik and formik-antd将 react-input-mask 与 formik 和 formik-antd 一起使用
【发布时间】:2019-07-24 20:48:45
【问题描述】:

我正在使用 formik@jbuschke/formik-antd。我需要对输入应用掩码+7 (___) ___-__-__,所以我想使用react-input-mask

同时我需要解析值并删除除+和数字之外的符号,所以我自己处理onChangesetFieldValue。我可以在控制台日志中获得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>
);

如何解决?

【问题讨论】:

    标签: reactjs antd formik


    【解决方案1】:

    问题是你解析了这个值,但你没有在任何地方更新它,所以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>
    );
    

    【讨论】:

    • 非常感谢!我用const changedValue = value.phone.replace(/\(|\)|\s|\-/g, ""); 替换了regex 表达式。但我有一个问题,我如何使用多个输入来做到这一点,其中phone 只是其中一个值?在这种情况下,onSubmit 会是什么样子?
    • 这个问题超出范围,建议再问一个
    • 最初我有alert(JSON.stringify(values, null, 2));,它应该传递所有值。在您的回答中,它是alert(JSON.stringify(changedValue, null, 2));,它只传递一个更改的值。这就是我问的原因。
    • values 是一个对象......所以你可以随意使用它的值,在答案中使用它的 values.phone,在你的情况下传递 values.somethingElse 等等
    • 您是否在values 内回答更新values.phone?据我了解,values 保持不变,我只能另外获得一个新变量changedValue。我的意图是将values.phone 内部的values 更改为setFieldValue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2020-08-31
    • 1970-01-01
    • 2019-06-24
    • 2019-08-27
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多