javascript - 将 axios 验证错误显示到 html 模板
问题描述
所以我有刀片 html 表单:
<form action="/register" method="post" class="axios-form">
<div error="email">
<input name="email" type="email"/>
</div>
<div error="name">
<input name="name" type="text"/>
</div>
<button type="submit">submit</button>
</form
我正在通过 axios 提交此表单:
document.querySelectorAll('.axios-form').forEach(el => {
new Form(el);
});
export default class Form {
constructor(el) {
this.el = el;
this.method = el.method;
this.action = el.action;
el.addEventListener('submit', e => {
e.preventDefault();
this.submit();
});
}
async submit() {
try {
const formData = new FormData(this.el);
const response = await http({
method: this.method,
url: this.action,
data: formData,
});
} catch (e) {
console.error(e);
}
}
}
我在 Laravel 控制器中进行了验证
public function store(Request $request)
{
$this->validate($request, [
'name' => ['required', 'min:2', 'string'],
'email' => ['required'],
]);
}
我的问题是如何在将表单提交到我的 html 模板后显示我得到的任何验证错误?
解决方案
document.getElementById('reg-form').onsubmit = function (event) {
const form = event.target;
event.preventDefault();
const formData = new FormData(form);
event.preventDefault();
axios.request({
method: "post",
url: "/register",
data: formData
}).then(function (response) {
//....
}).catch(function (error) {
let inputs, errors, li, ul = form.querySelector('ul#form-errors');
if (error.response.status === 422) {
errors = error.response.data.errors;
ul.innerHTML = '';
inputs = form.getElementsByTagName("input");
for (let error in errors) {
errors[error].forEach(message => {
li = document.createElement("li");
li.className = 'error';
li.innerText = message;
ul.appendChild(li)
});
inputs[error].className = 'error';
}
}
});
}
input {
display: block;
margin: 10mm;
}
.error {
color: red;
border-color: red;
}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form method="post" class="axios-form" id="reg-form">
<ul id="form-errors"></ul>
<div>
<input name="email" type="email" id="email"/>
</div>
<div>
<input name="password" type="text" id="password"/>
</div>
<button type="submit">submit</button>
</form>
<script src="https://unpkg.com/axios/dist/axios.js"></script>
</body>
</html>