- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 formik 创建登录表单。我对如何触发 handleSubmit 函数来调用登录 api 以供用户登录感到困惑。我一直在 onSubmit 中调用 handleSubmit,但它无法识别 ValidatedLoginForm.js 文件中我的代码和框中第 10 行和第 11 行的 onSubmit 方法中的值和 handleSubmit。我在哪里确切地调用 handleSubmit 并让用户登录到我的网站?
my codesandbox
我的代码看起来像这样:
import React, { useState } from "react";
import { Formik } from "formik";
import TextField from "@material-ui/core/TextField";
import * as Yup from "yup";
const ValidatedLoginForm = props => (
<Formik
initialValues={{ email: "", password: "" }}
onSubmit={values => {
const handleSubmit = async event => {
event.preventDefault();
var body = {
password: password,
email: email
};
console.log(body);
const options = {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json"
},
body: JSON.stringify(body)
};
const url = "/api/authenticate";
try {
const response = await fetch(url, options);
const text = await response.text();
if (text === "redirect") {
props.history.push(`/editor`);
} else if (text === "verifyemail") {
props.history.push(`/verifyOtp/${this.state.email}`);
} else {
console.log("login failed");
window.alert("login failed");
}
} catch (error) {
console.error(error);
}
};
}}
//********Using Yup for validation********/
validationSchema={Yup.object().shape({
email: Yup.string()
.email()
.required("Required"),
password: Yup.string()
.required("No password provided.")
.min(8, "Password is too short - should be 8 chars minimum.")
.matches(/(?=.*[0-9])/, "Password must contain a number.")
})}
>
{props => {
const {
values,
touched,
errors,
isSubmitting,
handleChange,
handleBlur,
handleSubmit
} = props;
return (
<>
<form onSubmit={handleSubmit} noValidate>
<TextField
variant="outlined"
margin="normal"
required
fullWidth
id="email"
value={values.email}
label="Email Address"
name="email"
autoComplete="email"
autoFocus
onChange={handleChange}
onBlur={handleBlur}
className={errors.email && touched.email && "error"}
/>
{errors.email && touched.email && (
<div className="input-feedback">{errors.email}</div>
)}
<TextField
variant="outlined"
margin="normal"
required
fullWidth
name="password"
value={values.password}
label="Password"
type="password"
id="password"
onBlur={handleBlur}
autoComplete="current-password"
className={errors.password && touched.password && "error"}
onChange={handleChange}
/>
{errors.password && touched.password && (
<div className="input-feedback">{errors.password}</div>
)}
<button type="submit" disabled={isSubmitting}>
Login
</button>
</form>
</>
);
}}
</Formik>
);
export default ValidatedLoginForm;
最佳答案
您目前正在 onSubmit
中创建一个新函数永远不会被调用的代码。函数values => { ... }
在提交表单时调用,但在该函数中您创建 handleSubmit
并且永远不会调用它。
如果移动创建handleSubmit
一点点,这一切都变得更容易阅读。这将变成类似
import React, { useState } from "react";
import { Formik } from "formik";
import TextField from "@material-ui/core/TextField";
import * as EmailValidator from "email-validator";
import * as Yup from "yup";
const ValidatedLoginForm = props => {
// The function that handles the logic when submitting the form
const handleSubmit = async values => {
// This function received the values from the form
// The line below extract the two fields from the values object.
const { email, password } = values;
var body = {
password: password,
email: email
};
console.log(body);
const options = {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json"
},
body: JSON.stringify(body)
};
const url = "/api/authenticate";
try {
const response = await fetch(url, options);
const text = await response.text();
if (text === "redirect") {
props.history.push(`/editor`);
} else if (text === "verifyemail") {
props.history.push(`/verifyOtp/${this.state.email}`);
} else {
console.log("login failed");
window.alert("login failed");
}
} catch (error) {
console.error(error);
}
};
// Returning the part that should be rendered
// Just set handleSubmit as the handler for the onSubmit call.
return (
<Formik
initialValues={{ email: "", password: "" }}
onSubmit={handleSubmit}
//********Using Yup for validation********/
validationSchema={Yup.object().shape({
email: Yup.string()
.email()
.required("Required"),
password: Yup.string()
.required("No password provided.")
.min(8, "Password is too short - should be 8 chars minimum.")
.matches(/(?=.*[0-9])/, "Password must contain a number.")
})}
>
{props => {
const {
values,
touched,
errors,
isSubmitting,
handleChange,
handleBlur,
handleSubmit
} = props;
return (
<>
<form onSubmit={handleSubmit} noValidate>
<TextField
variant="outlined"
margin="normal"
required
fullWidth
id="email"
value={values.email}
label="Email Address"
name="email"
autoComplete="email"
autoFocus
onChange={handleChange}
onBlur={handleBlur}
className={errors.email && touched.email && "error"}
/>
{errors.email && touched.email && (
<div className="input-feedback">{errors.email}</div>
)}
<TextField
variant="outlined"
margin="normal"
required
fullWidth
name="password"
value={values.password}
label="Password"
type="password"
id="password"
onBlur={handleBlur}
autoComplete="current-password"
className={errors.password && touched.password && "error"}
onChange={handleChange}
/>
{errors.password && touched.password && (
<div className="input-feedback">{errors.password}</div>
)}
<button type="submit" disabled={isSubmitting}>
Login
</button>
</form>
</>
);
}}
</Formik>
);
};
export default ValidatedLoginForm;
关于reactjs - 在 Formik 表单中无法识别 handleSubmit 和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59735137/
我是 React 和 Javascript 的新手。 我正在尝试让用户填写一个描述“Mob”应该是什么样子的表格。当用户点击提交时,我希望 handleSubmit()(通过父级传入)修改父级的状态,
我正在尝试编写一个可以更改多个表单状态的 handlesubmit 函数。我在检索输入值并在我的 handlesubmit 函数中使用它时遇到问题。此外,当我尝试设置状态时,值从表中消失。 h
Formik 文档 说 https://jaredpalmer.com/formik/docs/guides/form-submission To submit a form in Formik, y
我有一个带有登录表单的组件。 我需要做的是让它在用户点击提交按钮后重新加载页面/路由。 原因是点击提交按钮后,需要对导航组件进行一些更改,而这不是这个。 您可以看到我使用了 sessionStorag
我正在尝试编写一个测试来模拟在表单的 handleSubmit 中调用一个函数,但是,我无法证明该函数已被调用。 形式如下: import React, { Component } from 'rea
在将 place_id 推送到 BrowserHistory 之前,我需要等待回调 handleSubmit(event) { event.preventDefault(); brow
我想使用 react-hook-form 来处理来自用户的输入。 React 给我一个错误,说“handleSubmit 不是一个函数”。任何帮助将不胜感激。 我的代码如下(react-hook-fo
我正在尝试使用 formik 创建登录表单。我对如何触发 handleSubmit 函数来调用登录 api 以供用户登录感到困惑。我一直在 onSubmit 中调用 handleSubmit,但它无法
我在使用redux-form时遇到错误 控制台中的错误消息: bundle.js:32511 Uncaught Error: You must either pass handleSubmit() a
我正在努力使用 redux 形式的 FieldArray。我在将表单与实际的 react 组件连接起来时遇到了挑战。当我尝试提交表单时,出现以下错误:错误“handleSubmit”未定义 文件如下。
我正在使用最新的[email protected]使用组合 API。我想使用当前的[email protected]根据他们的文件。但是当使用 handleSubmit 时,没有任何效果如我所料。
我尝试了上述所有方法来单击查找按钮,但没有收到响应 网址:https://www.jetblue.com/plan-a-trip/#/ 按钮:查找 源代码 你能帮忙得到结果吗? 最佳答案 这是您问题
我有一个带有一些输入的简单组件,我试图验证单击按钮后是否调用模拟函数。 这是我在测试文件中尝试的内容: import React from 'react' import { mount } from
我有以下 redux-form (6.5.0) 源代码: class MyForm extends Component { handleSubmit() { console.log("Inside
由于我是 React 生态系统的新手,我的描述和做事的方式可能有很大偏差,但我希望你能关注我的问题。 我有一个父组件,它获取从路由器注入(inject)的表单并将状态和 Action 创建者映射到属性
我正在使用 withFormik HOC 来通过 Formik 管理我的表单。表单组件有 useState Hook 来显示消息。如何从 handleSubmit 处理程序调用此 Hook ?我还尝试
我将选择的日期传递给 this.state.value获取当天午夜的时间戳,但我似乎无法让它呈现新页面,因此我无法构建预订页面。它在哪里获取时间戳并检查当天的可用时间。当我在重新渲染成功一半时返回 H
我有一个 redux-form,它有一个 handleSubmit 函数,我用它来进行一些异步 http 服务器身份验证。如果身份验证由于某种原因失败,我想抛出一个 redux-form 错误。如果我
我使用了 React 类组件,但知道我想使用函数。我有一个问题,因为它一直告诉我handleSubmit 没有定义。但不是在调用中,而是在函数的开头。 这是正确的。 class Registrati
onSubmit 没有执行,我不知道是什么问题,它在没有 handleSumbit 的情况下执行,但我需要它来从表单中获取所有数据。我想我已经为这个表格做了所有必要的事情,但它不起作用。我需要帮助吗?
我是一名优秀的程序员,十分优秀!