【问题标题】:Formik: target is undefined when passing Material UI Date Picker as prop to React ComponentFormik:将 Material UI Date Picker 作为道具传递给 React 组件时,目标未定义
【发布时间】:2021-07-18 23:27:12
【问题描述】:

我正在尝试创建一个可重用的组件。我将表单字段作为道具传递的地方。当我单击日期选择器字段时。我收到此错误:

TypeError: 目标未定义

我该如何解决这个问题?

这是我的输入组件的样子:

import { useField } from 'formik';
import { DatePicker } from '@material-ui/pickers';

export const DatePickerField = ({ label, ...props }) => {
  const [field, meta] = useField(props);

  return (
    <DatePicker label={label} fullWidth {...field} {...props} />
  );
};

这是可重用组件的外观:

import { Form } from 'formik'

export const ReusableComp = ({ fields }) => (
  <Form noValidate>
      {fields}
  </Form>
)

这里是我使用这个组件的地方:

export const App = () => (
    <ReusableComp fields={
      <div className='mb-3'>
        <DateTimePickerField
          label='Start DateTime'
          name='start_date_time'
        />
      </div>
    } />
)

console.log(fields)的结果

【问题讨论】:

  • 什么是“道具”值?

标签: javascript reactjs material-ui formik


【解决方案1】:

就我而言,我使用的是 Material UI DesktopDatePicker(带有 Typescript),并像这样定义 onChange 道具解决了它:

onChange={(value): void => {
    formik.setFieldValue("dueDate", value);
}}

您必须将“dueDate”替换为您的表单值名称。

【讨论】:

    【解决方案2】:

    经过大量研究并感谢@Rosen Tsankov 将我的注意力指向onChange 函数。

    我在 SO 上看到了关于相同错误的问题,但没有得到解答。所以这可能会帮助他们以及将来遇到此错误的任何人。

    正如@Rosen Tsankov 所说,材料ui DatePicker 组件返回日期值作为onChange 函数的第一个参数。

    useField 返回的field 具有以下内容:namevalueonChangeonBlur

    useField 返回的onChange 函数期望第一个参数是一个事件,在这种情况下是日期值。这就是我们得到错误的原因:

    TypeError: 目标未定义

    因为 formik 试图访问 target 属性并且 date 没有属性 target。类似这样的date.target,这是undefined

    这就是我修复它的方法。而不是传播领域。我已将名称和值从 field 添加到 DatePicker。然后我使用了来自 formik 的setFieldValue 像这样手动更新输入值。

    import { DatePicker } from '@material-ui/pickers';
    import { useField, useFormikContext } from 'formik';
    
    export const DatePickerField = ({ label, ...props }) => {
      const [field, meta] = useField(props);
      const { setFieldValue } = useFormikContext();
    
      return (
        <DatePicker
          fullWidth
          {...props}
          label={label}
          name={field.name}
          value={field.value}
          helperText={meta.error}
          error={meta.touched && Boolean(meta.error)}
          onChange={(value) => setFieldValue(field.name, value)}
        />
      );
    };
    

    【讨论】:

      【解决方案3】:

      DatePicker 期望 onChange((date) =&gt; ...) but you are passing formik handler wich expects onChange((event) =&gt; ....)

      【讨论】:

      • 你能分享文档链接吗?这提到的地方。所以我可以阅读更多关于它的信息。尝试修复错误
      • 将 formik 处理程序传递给 DatePicker ?
      • console.log(field) 并粘贴到这里
      • 您好,很抱歉错过了您的评论。已经睡着了。更新了问题
      猜你喜欢
      • 2018-11-24
      • 2020-10-02
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多