將Formik與打字稿(離子)配合使用 [英] Using formik with typescript (Ionic)

查看:0
本文介紹了將Formik與打字稿(離子)配合使用的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我嘗試使用Formik庫來驗證表單,但在將Change函數傳遞給輸入組件時遇到問題。

以下是主要組件:

    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;
錯誤信息獲取為"Type‘(eventOrPath:字符串|ChangeEvent)=>void|((ventOrTextValue:String|ChangeEvent)=>void)’不可分配給類型‘()=>any’。"在我的onChange道具上。

如何為TS正確聲明它?

推薦答案

該消息指出問題所在。

BasicInput中,您正在定義道具onChange: () => any。但是很明顯,將要調用的函數將需要接收新的輸入值作為參數,并且不需要返回任何內容,因此您的屬性定義應該是這樣的:

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

但是,如果您將鼠標懸停在<IonInput />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;

這篇關于將Formik與打字稿(離子)配合使用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放