【问题标题】:Using formik with typescript (Ionic)使用带有 typescript 的 formik (Ionic)
【发布时间】:2020-07-13 06:24:25
【问题描述】:

我尝试使用 Formik 库来验证表单,但是我无法将 onChange 函数传递给我的输入组件。

这里是主要组件:

    import React from 'react';
import { IonHeader, IonContent, IonToolbar, IonTitle, IonButton, IonPage, IonList } from '@ionic/react';
import { useFormik } from 'formik';

import BasicInput from '../components/form/BasicInput';

const Login: React.FC = () => {

    const validate = (values: {
        name: string;
    }) => {
        const errors = {};
        if (!values.name) {

        }

        return errors;
    }

    const formik = useFormik({
        initialValues: {
            name: ''
        },
        validateOnChange: false,
        validateOnBlur: false,
        validate,
        onSubmit: values => {
            alert(JSON.stringify(values, null, 2));
        },
    })

    const {
        name
    } = formik.values

    return (
        <IonPage>
            <IonHeader>
                <IonToolbar>
                    <IonTitle>Login</IonTitle>
                </IonToolbar>
            </IonHeader>
            <IonContent>
                <IonList>
                    <BasicInput
                        id="name"
                        placeholder={"Your name"}
                        onChange={formik.handleChange}
                    />

                </IonList>

                <div>
                    <IonButton onClick={handleLogin}>
                        Done
                    </IonButton>
                </div>
            </IonContent>
        </IonPage>
    )
     }

    export default Login;

这是我的输入组件:

    import React from 'react';
import { IonInput, IonItem } from '@ionic/react';

const BasicInput: React.FC<{
    id: string,
    placeholder: string,
    onChange: () => any
}> = (props) => {
    return (
        <IonItem>
            <IonInput
                placeholder={props.placeholder}
                onIonChange={props.onChange}
            >

            </IonInput>
        </IonItem>
    )
}

export default BasicInput;

我得到的错误是“类型 '(eventOrPath: string | ChangeEvent) => void | ((eventOrTextValue: string | ChangeEvent) => void)' 不能分配给类型 '() => any'。”在我的 onChange 道具上。

如何正确地为 TS 声明它?

【问题讨论】:

  • 你可以定义为any??
  • @AaronSaunders 我不是刚做的吗?如果不是,我现在完全糊涂了

标签: reactjs typescript ionic-framework formik


【解决方案1】:

消息指出问题出在哪里。

BasicInput 中,您正在定义一个道具onChange: () =&gt; any。但很明显,要调用的函数将需要接收新的输入值作为参数并且不需要返回任何内容,所以你的 prop 定义应该是这样的:

{
    // ...
    onChange: (newValue: string) => void;
}

但是,如果您将鼠标悬停在&lt;IonInput /&gt;onIonChange 属性上,您可以看到传递的函数没有接收字符串作为参数!

这是完整的定义:https://github.com/ionic-team/ionic/blob/976e68da5b030baf26dc60034ff80d8db2cff8e6/core/src/components.d.ts#L4137

它实际上触发了CustomEvent。拥有此事件e,您可以通过e.target.value 访问输入值。

完整的代码变成这样:

import React from 'react';
import { IonInput, IonItem } from '@ionic/react';

const BasicInput: React.FC<{
    id: string,
    placeholder: string,
    onChange: (newValue: string) => void
}> = (props) => {
    return (
        <IonItem>
            <IonInput
                placeholder={props.placeholder}
                onIonChange={(e) => props.onChange(e.target.value)}
            >

            </IonInput>
        </IonItem>
    )
}

export default BasicInput;

【讨论】:

  • 它有效,但是我关闭了“strictNullChecks”,因为它与“e.details.value”有问题,谢谢 :)
  • 不错!我建议不要关闭此标志,因为无法防止许多错误。如果我理解正确,您可以使用新的可选链接功能:e.details?.value 并更改 onChange 处理程序以接受未定义的值
猜你喜欢
  • 2021-03-29
  • 2017-09-16
  • 2022-11-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2020-12-21
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多