Цель
Fla sh сообщение после успешного сохранения почтового запроса в базе данных.
Проблема
Сообщение не появляется, когда почтовый запрос поступает от реагирующего веб-интерфейса. Если пользовательский интерфейс реагирует на сообщение об успехе, он перезагружает страницу, как вы можете видеть в функции handleSubmit
. Когда запрос отправляется из формы, сгенерированной «стандартным laravel способом», все работает, как и ожидалось.
Итак, вот код:
ReportsController:
use Illuminate\Support\Facades\Session;
...
public function store(Request $request)
{
$report = new Report([
'name' => $request->get('name'),
'body' => $request->get('body'),
'visible' => $request->get('visible'),
'show_in_slider' => $request->get('show_in_slider')
]);
if ($report->save()) {
Session::flash('success', 'Feedback gespeichert!');
return response()->json(['success' => true, 'url' => '/admin/reports'], 200);
}
}
Строка в api.php
Route::resource("reports", "ReportsController");
Блейд для сообщений:
@if(count($errors) > 0)
@foreach($errors->all() as $error)
<div class="warning-modal">
{{$error}}
</div>
@endforeach
@endif
@if(session("success"))
<div class="alert-modal">
{{session("success")}}
</div>
@endif
@if(session("error"))
<div class="warning-modal">
{{session("error")}}
</div>
@endif
Соответствующие фрагменты функций в интерфейсе React.
handleSubmit
:
async function handleSubmit(event) {
event.preventDefault();
const response = await saveData("/api/reports", report);
if (response.success) {
window.location = response.url;
} else {
alert("Ein Fehler ist aufgetreten.");
}
}
Отправка почтового запроса в функции saveData
:
export default async function saveData(api, data) {
const token = document
.querySelector('meta[name="csrf-token"]')
.getAttribute("content");
const url = window.location.origin + api;
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRF-TOKEN": token
},
body: JSON.stringify(data)
});
const result = await response.json();
return result;
}
Так в чем же ошибка?
Спасибо за ваше время в advance:)
Редактировать
Я решил это без перезагрузки страницы и позволил JavaScript обработать предупреждение. Спасибо elyas:)
export default async function PostData() {
const report = await CollectData();
const response = await SaveData("/api/reports", report);
const alert = document.createElement("div");
alert.innerHTML = response.message;
if (response.success) {
alert.className = "alert-modal";
ToggleNewReport();
} else {
alert.className = "warning-modal";
}
document.getElementById("content").appendChild(alert);
}
В зависимости от ответа я добавляю соответствующее предупреждение.