【Laravel】Inertiaのフォームの使い方を簡潔にまとめる
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
Laravel プロジェクトで Inertia.js を使ったフロントエンドのフォームの基本的な使い方を簡潔にまとめました
はじめに
この記事はフォームの書き方に特化したもので、特に Laravel の Inertia.js は、useForm を使った書き方で実装する前提で作られていると思います。
流れで実装したい人は、Inertia.js を使って実装する記事があるのでそちらをご覧ください。
基本的な書き方
Inertia.js で React を選択した時の基本的な書き方です。
import { useForm } from "@inertiajs/react"
export default function Create() {
const form = useForm({
title: "",
content: "",
})
const createPost = e => {
e.preventDefault() // デフォルトのフォーム送信を防ぐ
form.post(route("post.store"), {
preserveScroll: true,
onSuccess: () => reset(), //formのリセット
onError: errors => {
//エラー時の処理を書く
},
})
}
return (
<>
<div className="w-4/5 mx-auto py-12">
<h1>新規作成</h1>
<form onSubmit={createPost}>
<div>
<div>
<input
value={form.data.title}
onChange={e => form.setData("title", e.target.value)}
placeholder="タイトル"
/>
</div>
<div>
<textarea
value={form.data.content}
onChange={e => form.setData("content", e.target.value)}
placeholder="内容"
></textarea>
</div>
<button>投稿</button>
<div>{form.data.title}</div>
</div>
</form>
</div>
</>
)
}
ここまでが基本形で本題でした。
以降はプロパティの一覧と使い方についてまとめています。
非常に長いですが、便利な機能もあるので一読してみると新しい発見があるかもしれません。
プロパティを確認する
useForm
を使うと様々な便利なデータを使用することができ、リアクティブにこのプロパティが更新されるため、とても便利です。
どんなプロパティがあるのか詳細をみていきたいと思います。
- data
- setData
- get
- post
- put
- patch
- delete
- submit
- transform
- cancel
- reset
- clearErrors
- errors
- hasErrors
- setError
- progress
- isDirty
- processing
- recentlySuccessful
- wasSuccessful
- setDefaults
プロパティの使い方
data や cancel を例にすると
const form = useForm()
const data = form.data
const cancel = form.cancel
または、
const { data, cancel } = useForm()
data
フォームの入力値を保持するオブジェクト。useForm の初期値で指定したデータが格納されます。
const { data } = useForm({
title: "",
content: "",
})
console.log(data.title) // 現在のタイトル
console.log(data.content) // 現在のコンテンツ
<div>{data.title}</div>
setData
フォームの特定のフィールドの値を動的に更新します。
const { setData } = useForm({
title: "",
content: "",
})
setData("title", "新しいタイトル")
setData("content", "新しいコンテンツ")
get
GET リクエストを送信します。
const Posts = () => {
form.get(route("post.index"), {
onSuccess: () => {},
onError: errors => {},
})
}
Laravel 側のルーティングの GET に対応します。
Route::get('/posts',[PostController::class, 'index'])->name('post.index');
post
POST リクエストを送信します。
const createPost = () => {
form.post(route("post.store"), {
onSuccess: () => {},
onError: errors => {},
})
}
Laravel 側のルーティングの POST に対応します。
Route::post('/post',[PostController::class, 'store'])->name('post.store');
put
PUT リクエストを送信します。
const updatePost = id => {
form.put(route("post.update", id), {
onSuccess: () => {},
onError: errors => {},
})
}
Laravel 側のルーティングの PUT に対応します。
Route::put('/post/{id}/update',[PostController::class, 'update'])->name('post.update');
patch
PATCH リクエストを送信します。
const updatePostPartially = id => {
form.patch(route("post.update", id), {
onSuccess: () => {},
onError: errors => {},
})
}
Laravel 側のルーティングの PATCH に対応します。
Route::patch('/post/{id}/update',[PostController::class, 'update'])->name('post.update');
delete
DELETE リクエストを送信します。
const deletePost = id => {
form.delete(route("post.destroy", id), {
onSuccess: () => alert("投稿が削除されました!"),
})
}
Laravel 側のルーティングの DELETE に対応します。
Route::delete('/post/{id}/destroy',[PostController::class, 'destroy'])->name('post.destroy');
submit
post
,put
,patch
,delete
を手動で指定して送信することが できます。
const method = "post" //`put`,`patch`,`delete`
const customSubmit = (method, id) => {
form.submit(method, route(`post.store`, id), {
onSuccess: () => {},
onError: errors => {},
})
}
transform
送信前にデータを変換します。
form.transform(data => ({
...data,
title: data.title.trim(),
}))
cancel
現在進行中のフォーム送信をキャンセルすることができます。
const cancelRequest = () => {
form.cancel() // 送信をキャンセル
}
reset
フォームのデータを初期状態にリセットします。
form.reset()
form.reset("title") //特定のフィールドのみ
clearErrors
現在のフォームのエラーをクリアします。
const handleClearErrors = () => {
form.clearErrors() // エラーをクリア
}
errors
フォーム送信時のバリデーションエラーを保持します。
ようするに以下のように書くだけで、バリデーションエラーの内容を表示できます。
<span>{form.errors.title}</span>
Laravel 側のバリデーション
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|string|max:255', // タイトルは必須、文字列、最大255文字
'content' => 'nullable|string', // 内容は任意、文字列
]);
//略
}
hasErrors
エラーが存在するかどうかをチェックします。
true
or false
if (form.hasErrors) {
alert("フォームにエラーがあります!")
}
<input
value={form.data.title}
onChange={(e) => form.setData('title',e.target.value)}
placeholder="タイトル"
required
/>
<button disabled="{form.hasErrors}">送信</button>
setError
自分でエラーを設定することができます
form.setError({
title: "タイトルは必須です",
content: "コンテンツは空であってはいけません",
})
progress
アップロード進行状況を示します(ファイルアップロードの場合)。
これ本当に便利。
form.post(route("upload"), {
onProgress: progress => {
console.log(`アップロード進行状況: ${progress.percentage}%`)
},
})
{form.progress &&
<progress value="{form.progress.percentage}" max="100"></progress>}
isDirty
フォームのデータが変更されたかどうかを判定します。
変更されたら True
if (form.isDirty) {
alert("フォームが変更されています!")
}
<button disabled="{!form.isDirty}">変更を保存</button>
processing
フォームが送信中であることを示します。
送信中 True
if (form.processing) {
console.log("送信中...")
}
<button disabled="{form.processing}">送信</button>
recentlySuccessful
送信が成功したあと True になり、数秒後 False に戻ります。
{form.recentlySuccessful &&
<p>送信が成功しました!</p>
}
wasSuccessful
直前のリクエストが成功したかどうかを判定します。
if (form.wasSuccessful) {
alert("送信に成功しました!")
}
setDefaults
フォームの初期値を設定します。
form.setDefaults({
title: "初期タイトル",
content: "初期コンテンツ",
})
おわりに
以上、使えるプロパティをまとめてみました。
console.log(form)
で確認できるプロパティを全て書いてみましたが、もし他にもあったら教えてください!
誰かの参考になれば幸いです。