我正在React原生应用程序中使用Formik.在登录表单上,我有两个字段:邮箱和密码,这两个字段都是必需的.

我写过这样的验证规则:

export const LoginSchema = Yup.object().shape({
  email: Yup.string()
    .email('The email is invalid')
    .required('This field is required'),
  password: Yup.string()
    .min(6, 'The password is too short')
    .max(12, 'The password is too long')
    .required('This field is required'),
});

我只需要在表单提交时触发验证,并显示一个错误弹出窗口.我已经阅读了文档,但找不到解决方案,因为验证触发了onBlur.如何做到这一点?

谢谢

const Login = ({ navigation }) => {
  const [isLoading, setIsLoading] = useState(true);
  const [isVisible, setIsVisible] = useState(false);

  useEffect(() => {
    // Later check for token
    const tokenIsStored = true;

    if (tokenIsStored) {
      setIsLoading(false);
    }
  });

  const onLogin = values => {
    console.log(values, 'on login');

    // Pass value to BE endpoint
    navigation.navigate('Dashboard');
  };

  const onModalClose = () => {
    setIsVisible(false);
  };

  console.log(isVisible);

  if (!isLoading) {
    return (
      <ScrollContainer keyboardShouldPersistTaps="handled">
        <ThemedStatusBar />

        <ThemedModal
          isVisible={isVisible}
          primaryMessage="Log In Failed"
          secondaryMessage="Please check your password"
          btnTitle="OK"
          btnPress={() => onModalClose()}
        />

        <Formik
          initialValues={{ email: '', password: '' }}
          validationSchema={LoginSchema}
          onSubmit={values => onLogin(values)}
        >
          {props => (
            <View>
              <ScrollContainer BackgroundColor={Colors.greyColor} Padding="0px" style={styles.loginForm}>
                <ThemedInput
                  onChangeText={props.handleChange('email')}
                  onBlur={props.handleBlur('email')}
                  value={props.values.email}
                  placeholder="Email"
                  keyboardType="email-address"
                />
                <ThemedInput
                  onChangeText={props.handleChange('password')}
                  onBlur={props.handleBlur('password')}
                  value={props.values.password}
                  placeholder="Password"
                  overrideStyles={styles.loginInputBottom}
                  secureTextEntry
                />
                {props.errors.email && setIsVisible(true)}
              </ScrollContainer>
              <ThemedButton onPress={props.handleSubmit} title="Log In" />
            </View>
          )}
        </Formik>
      </ScrollContainer>
    );
  }
  return <ThemedLoader isLoading />;
};

export default Login;

推荐答案

判断docs

通过根据需要更改<Formik validateOnChange>和/或<Formik validateOnBlur>props 的值,可以控制Formik何时运行验证.默认情况下,Formik将按如下方式运行验证方法:

把props validateOnChange={false}validateOnBlur={false}传给你的Formik

Reactjs相关问答推荐

无法使用#13;或br将新行设置为文本区域'"&"<>

在Reaction中测试条件组件

如何避免react 使用ESLINTreact 挂钩/穷举-deps进行第一次呈现

如何在NextJS中仅在刷新页面和页面淡出页面过渡时添加全屏加载器

Javascript - 正则表达式不适用于 MAC OS - 编码?

CORS策略:对预检请求的响应未通过访问控制判断:没有Access-Control-Allow-Origin

未捕获的运行时错误:对象作为 React 子项无效

如何在不使用 Axios 的情况下将图像文件从 React.js 发送到 Spring Boot Rest API?

将外部 JavaScript 导入 React(通过文件)

React 测试库包装器组件

使用 react pro 侧边栏展开折叠菜单

使用带有搜索字符串的全局过滤器时如何在 React-Table 中进行精确匹配?

如何通过onpress on view in react native flatlist来降低和增加特定视图的高度?

在 Formik 表单中访问子组件的值

使用 react-router-dom 时弹出空白页面

加密 Django Rest Framework API 响应 + 解密响应应用程序中的响应

如何跨微前端 React 应用管理状态管理?

如何在 Reactjs 中判断受保护路由上的用户角色?

调用函数以获取数据并在数据到达时导航到链接

Context Api React 的问题