reactjs - 验证消息未显示使用简单反应验证器的反应挂钩
问题描述
我正在尝试验证表单,验证似乎正在工作,因为我无法显示消息,在控制台中显示消息属性在验证工作时为真,但它未在 UI 中显示,我尝试了不同的方法,我是新的bie,只是想学习反应的基础知识。所以我现在被困在显示验证错误上。检查我的以下代码
import React, { useState, useRef } from "react";
import Header from "./Layouts/Header";
import Footer from "./Layouts/Footer";
import { PROJECT_NAME } from "./Config";
import SimpleReactValidator from "simple-react-validator";
const ContactUs = () => {
document.title = PROJECT_NAME + " Contact Us";
const [formData, SetFormData] = useState({
cname: "",
cemail: "",
cmessage: "",
});
const [state, setState] = useState({
cname: "",
});
const { cname, cemail, cmessage } = formData;
const handleChange = (e) => {
SetFormData({ ...formData, [e.target.name]: e.target.value });
setState({
cname: e.target.value,
});
//console.log(e.target);
};
const validator = new SimpleReactValidator({
className: "text-danger",
messages: {
cname: "That is not an email.",
},
validators: {
cname: {
message: "The :attribute must be a valid IP address.",
},
},
});
const onSubmit = (e) => {
e.preventDefault();
const contactUsData = {
cname: formData.cname,
cmessage: formData.cmessage,
cemail: formData.cemail,
};
console.log(validator);
console.log(contactUsData);
if (validator.allValid()) {
alert("You submitted the form and stuff!");
} else {
validator.showMessages();
}
};
return (
<div>
<Header />
<div className="container" style={{ marginTop: "30px" }}>
<div className="row">
<h2>Contact US</h2>
<div className="container">
<form onSubmit={(e) => onSubmit(e)}>
<div className="form-group">
<label htmlFor="pwd">Name:</label>
<input
type="text"
className="form-control"
id="pwd"
placeholder="Enter Name"
value={formData.cname}
name="cname"
onChange={handleChange}
/>
{validator.message("cname", formData.cname, "required|alpha")}
</div>
<div className="form-group">
<label htmlFor="email">Email:</label>
<input
type="email"
className="form-control"
id="email"
placeholder="Enter email"
value={cemail}
name="cemail"
onChange={(e) => handleChange(e)}
/>
</div>
<div className="form-group">
<label htmlFor="message">Message:</label>
<textarea
className="form-control"
id="message"
placeholder="Enter Message"
value={cmessage}
name="cmessage"
onChange={(e) => handleChange(e)}
></textarea>
</div>
<button type="submit" className="btn btn-primary">
Submit
</button>
</form>
</div>
</div>
</div>
<Footer />
</div>
);
};
export default ContactUs;
解决方案
OnSubmit 不会更改任何状态,因此组件不会重新渲染。您需要将验证器与状态相关联,以便它可以强制重新渲染和验证器消息显示一些东西。
我可能会摆脱你额外的 useState,因为它什么都不做,并在 state 中存储一个“isValidated”标志(由 handleSubmit 设置),以指示验证器在下一次渲染时显示消息。(也许在 handleChange 上清除该状态)。
推荐阅读
- reactjs - 在 React Router 中的嵌套路由中刷新后看到空白页面
- spring-boot - 如何在 Spring Boot 2.x 中使用 HttpServletRequest?
- c++ - 'class':非法使用这种类型作为表达式我该如何解决?
- asp.net - 我的 .asp 文件出现错误,我不知道如何解决(我不懂 ASP)。我得到的错误如下
- python - Python中的类变量和实例变量
- javascript - 列中的 JS 条件模板
- php - wp-admin/admin-AJAX 403 禁止
- ios - 如何在 WKWebview 中添加观察者以播放和暂停音频文件的操作?
- flutter - 在 CupertinoTabBar 视图内外导航
- google-cloud-platform - 聚合时是否可以使堆栈驱动程序监视不填充时间序列间隙