【问题标题】:onChange handler doesn't fire when using custom-component使用自定义组件时,onChange 处理程序不会触发
【发布时间】:2019-09-21 12:12:41
【问题描述】:

我在 React 应用程序中使用 Formik 进行验证。

验证工作正常,但我的 onChange 处理程序没有触发:

  <Field
    type="text"
    name="name"
    placeholder="First Name"
    component={Input}
    onChange={() => console.log("gfdg")}
  />

Link to Sandbox

这是为什么?

【问题讨论】:

  • github.com/jaredpalmer/formik/issues/1243 这讨论了您的问题,但老实说,我会考虑摆脱那个似乎太复杂而无法实现验证的 formik 库......但我不是熟悉formik。也许这很有用...
  • @messerbill formik 的目的不是验证,而是处理表单
  • @EllaSharakanski 我知道。 我在 React 应用程序中使用 Formik 进行验证。 OP 说:D

标签: javascript reactjs forms onchange formik


【解决方案1】:

首先让我澄清一下,这个答案只是为了帮助目的,我知道这个问题已被接受,但如果上述解决方案对任何人都不起作用,我对上述答案的版本进行了一些修改

这里onChangeText会返回数量字段的值

  <Formik
     initialValues={{ product_id: '', quantity: '', amount: '' }}
     onSubmit={(values, actions) => {
        this.submitLogin(values);
     }}

     //some other elements ....
    <Field placeholder='No. of Quantity' name='quantity' component={CustomInputComponent}
        onChangeText={value => {
           console.warn(value); // will get value of quantity
        }}
     />
  />

你可以在你的类之外定义你的组件

const CustomInputComponent = ({
   onChangeText,
   field, // { name, value, onChange, onBlur }
   form: { touched, errors, isValid, handleBlur, handleChange, values, setFieldValue }, // also values, setXXXX, handleXXXX, dirty, isValid, status, etc.
   ...props
}) => {
   return (
      <Input {...field} {...props} onBlur={handleBlur(field.name)}
        onChangeText={value => {
           setFieldValue(field.name, value);
           onChangeText(value); // calling custom onChangeText
        }}
     />
   )
}

【讨论】:

    【解决方案2】:

    Input 内部,您订购传递给输入元素的道具的方式意味着您的onChange 将被Formik 的onChange 覆盖。当您使用自定义组件创建Field(即您的情况下为Input)时,Formik 将其FieldProps 传递给组件。 FieldProps 包含一个属性 field,其中包含各种处理程序,包括 onChange

    在你的Input 组件中你这样做(我已经删除了不相关的道具):

    <input
        onChange={onChange}
        {...field}
    />
    

    看看你自己的onChange 将如何被Formik 的onChange() 替换为field 内的field?为了更清楚...field 基本上是导致这种情况发生:

    <input
        onChange={onChange}
        onChange={field.onChange}
        // Other props inside "field".
    />
    

    如果您要对它们重新排序,现在将显示控制台消息:

    <input
        {...field}
        onChange={onChange}
    />
    

    但是现在您的输入现在不起作用,因为您确实需要在输入更改时立即调用 Formik 的 onChange 以让 Formik 现在。如果您希望自定义 onChange 事件和输入正常工作,您可以这样做:

    import React from "react";
    import { color, scale } from "./variables";
    
    const Input = React.forwardRef(
      ({ onChange, onKeyPress, placeholder, type, label, field, form }, ref) => (
        <div style={{ display: "flex", flexDirection: "column" }}>
          {label && (
            <label style={{ fontWeight: 700, marginBottom: `${scale.s2}rem` }}>
              {label}
            </label>
          )}
          <input
            {...field}
            ref={ref}
            style={{
              borderRadius: `${scale.s1}rem`,
              border: `1px solid ${color.lightGrey}`,
              padding: `${scale.s3}rem`,
              marginBottom: `${scale.s3}rem`
            }}
            onChange={changeEvent => {
              form.setFieldValue(field.name, changeEvent.target.value);
              onChange(changeEvent.target.value);
            }}
            onKeyPress={onKeyPress}
            placeholder={placeholder ? placeholder : "Type something..."}
            type={type ? type : "text"}
          />
        </div>
      )
    );
    
    export default Input;
    

    See it here in action.

    虽然总的来说我不太确定你想要做什么。您的表单工作正常,您可能不需要自定义 onChange,但也许您有一些特定的用例。

    【讨论】:

    • 我没有得到 on change 值changeEvent.target.value
    • 我正在使用 react native 和 changeEvent.target.value 得到 undefined
    • onChange={changeEvent => {props.setFieldValue(props.name, changeEvent.target.value); }} 我为这条线搜索了几个小时。试图了解如何将 setFieldValue 与我的自定义 组件一起使用。 Formik 文档中没有这方面的迹象。谢谢!
    • 感谢您的评论,我能够在 formik 中集成 MarkdownEditor。谢谢!
    • 当前我遇到了同样的问题,但我使用的是打字稿。你能帮我定义这些{ onChange, onKeyPress, placeholder, type, label, field, form }的类型吗
    猜你喜欢
    • 2018-02-27
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2021-12-09
    • 2021-10-16
    • 2021-06-10
    • 2019-11-20
    相关资源
    最近更新 更多