【问题标题】:Formik validations not being shown on React Native appFormik 验证未显示在 React Native 应用程序上
【发布时间】:2021-09-06 11:41:38
【问题描述】:

我正在做一个使用 Native-Base 样式库的 Expo/React-Native 项目。为了验证表单,我使用 Formik + Yup。 所以我有这个登录屏幕,并且“onSubmit”方法仅在验证工作时被调用,但是当验证失败时,即使我选择使用 标签显示错误,它也不会显示错误。

这是我登录屏幕的相关部分

export default function LoginScreen(props) {

const { handleChange, handleSubmit, handleBlur, values, errors } = useFormik({
    initialValues: { username: "", password: "" },
    validationSchema: LoginSchema,
    onSubmit: (values) => {
      console.log(values);
    },
  });

  return (
    <SafeAreaView>
      <Center width="90%">
        <FormControl marginTop={10} marginBottom={5}>
          <FormControl.Label>Email ou nome de usuário</FormControl.Label>
          <Input
            type="text"
            onChangeText={handleChange("username")}
            onBlur={handleBlur("username")}
            value={values.username}
          />  
          <FormControl.ErrorMessage>{errors.username}</FormControl.ErrorMessage>
        </FormControl>

        <FormControl>
          <FormControl.Label>Senha</FormControl.Label>
          <Input
            type="password"
            onBlur={handleBlur("password")}
            onChangeText={handleChange("password")}
            secureTextEntry={true}
            value={values.password}
          />
          <FormControl.ErrorMessage>{errors.password}</FormControl.ErrorMessage>
        </FormControl>

        <Button marginTop={5} onPress={handleSubmit}>
          Login
        </Button>
      </Center>
    </SafeAreaView>
  );
}

这里是 Yup 验证模式

export const LoginSchema = Yup.object().shape({
  username: Yup.string().required("Este campo é obrigatório"),
  password: Yup.string()
    .max(20, "Senha muito longa")
    .required("Este campo é obrigatório"),
});

【问题讨论】:

    标签: react-native formik native-base yup


    【解决方案1】:

    也许错误在您的&lt;FormControl.ErrorMessage&gt; 组件中。我用 React Native 组件做了一个测试,它的代码运行良好:

    import React from 'react';
    import {View, Text, TextInput, Button} from 'react-native';
    import {useFormik} from 'formik';
    import * as Yup from 'yup';
    
    const App = () => {
      const {handleChange, handleSubmit, values, errors} = useFormik({
        initialValues: {username: '', password: ''},
        validationSchema: Yup.object().shape({
          username: Yup.string().required('Este campo é obrigatório'),
          password: Yup.string()
            .max(20, 'Senha muito longa')
            .required('Este campo é obrigatório'),
        }),
        onSubmit: values => {
          console.log(values);
        },
      });
    
      return (
        <View>
          <Text>Email</Text>
          <TextInput
            value={values.username}
            onChangeText={handleChange('username')}
          />
          <Text>{errors.username}</Text>
          <Text>Senha</Text>
          <TextInput
            value={values.password}
            onChangeText={handleChange('password')}
          />
          <Text>{errors.password}</Text>
          <Button onPress={handleSubmit} title="Submit" />
        </View>
      );
    };
    
    export default App;
    

    【讨论】:

    • 是的,你完全正确。正如您所建议的,我尝试了另一个组件来显示错误,并且效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-03-21
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多