【问题标题】:how to use react number format with formik如何在 formik 中使用反应数字格式
【发布时间】:2021-08-23 06:43:45
【问题描述】:

我的formik表单是这样的

const NewProduct = ({}) => {
    const validate = (values) => {
        const errors = {}
        if (!values.title) {
            errors.title = 'Required'
        }
        return errors
    }
    const formik = useFormik({
        initialValues: {
            title: '',
            price: '',
        },
        validate,
        onSubmit: (values) => {
            alert(JSON.stringify(values, null, 2))
        },
    })

    return (
        <div className="newProductComponent">
            <form onSubmit={formik.handleSubmit}>
                <label>title</label>
                <input
                    type="text"
                    id="title"
                    name="title"
                    onChange={formik.handleChange}
                    value={formik.values.title}
                />
                {formik.errors.title ? (
                    <div className="error">{formik.errors.title}</div>
                ) : null}

                <NumberFormat
                    value={formik.values.price}
                    thousandSeparator={true}
                    onValueChange={(values) => {
                        const { formattedValue, value } = values
                    }}
                />
            </form>
        </div>
    )
}

如何让该表单中的数字格式组件与 formik 一起使用?

【问题讨论】:

    标签: reactjs formik


    【解决方案1】:

    useFormik - 您已经在使用的钩子 - 返回一个函数 setFieldValue,可用于手动设置值。

    第一个参数是字段名称price,第二个是值。您还必须在&lt;NumberFormat&gt; 上设置属性name="price"

    const App = () => {
      const validate = (values) => {
          const errors = {}
          if (!values.title) {
              errors.title = 'Required'
          }
          return errors
      }
      const formik = useFormik({
          initialValues: {
              title: '',
              price: '',
          },
          validate,
          onSubmit: (values) => {
              alert(JSON.stringify(values, null, 2))
          },
      })
    
      return (
          <div className="newProductComponent">
              <form onSubmit={formik.handleSubmit}>
                  <label>title</label>
                  <input
                      type="text"
                      id="title"
                      name="title"
                      onChange={formik.handleChange}
                      value={formik.values.title}
                  />
                  {formik.errors.title ? (
                      <div className="error">{formik.errors.title}</div>
                  ) : null}
                  <br />
                  <label>Price</label>
                  <NumberFormat
                      name="price"
                      value={formik.values.price}
                      thousandSeparator={true}
                      onValueChange={(values) => {
                          const {  value } = values;
                          formik.setFieldValue('price', value);
                      }}
                  />
                  <br />
                  <button type="submit">Submit</button>
              </form>
          </div>
      )
    };
    

    Live Demo

    【讨论】:

      【解决方案2】:

      您可以使用useFielduseFormikContext 设置值

      示例:

      const [field, meta] = useField('price');
      const { setFieldValue } = useFormikContext();
      
      const isError = meta.touched && Boolean(meta.error);
      
      <NumberFormat
        value={formik.values.price}
        thousandSeparator={true}
        onValueChange={(values) => {
            const { formattedValue, value } = values
      
            setFieldValue(field.name, formattedValue)
        }}
      />
      
      {isError && <div className="error">{meta.error}</div>}
      

      【讨论】:

      • const [field, meta] = useField('price') 这将给出错误 × TypeError: Cannot read property 'getFieldProps' of undefined
      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2020-10-18
      • 2020-07-28
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多