この記事にはプロモーションが含まれています。

【Laravel×React×inertia】useFormで連続したsetDataが動作しないとき

【Laravel×React×inertia】useFormで連続したsetDataが動作しないとき

Laravel開発でinertiaを使用してフロントエンドにReactを採用する場合、inertiaのuseFormヘルパーを活用する場面が多くあるかと思います。

今回は、そうした開発環境において

連続して記述したsetDataが上手く動作しないときの対処法(正しい記述方法)

をご紹介します。




ケケンタ

ケケンタのITブログでは、WebアプリPHPLaravel)やWeb制作WordPressコーディング)について情報を発信しています。
学習中の方や実務をされている方など多くの方にアクセスいただいていますので、ぜひほかの記事も参考にしてみてください!


運動不足、気になっていませんか?

もしプログラミング学習やお仕事で運動不足が気になっているなら
連続屈伸運動がおすすめです!

ボタンにカーソルを合わせるだけ
カウントダウンが始まるタイマーをご用意してみました!

ケケンタ

無理のない範囲で、ぜひ隙間時間に屈伸運動を取り入れてみて下さい!

タイマースタート

3:00

※運動不足だと連続3分で取り組んでもかなり息が切れます
(僕は加えて気分もちょっと悪くなりました……)
絶対にご無理の無い範囲でお取り組みください!


目次

【前提】useFormの宣言

前提として、今回は以下のような内容でuseFormの宣言をしていることとします。

const { data, setData } = useForm({
    title: iniTitle,
    status: iniStatus,
    dueDate: iniDueDate,
});

dataの値を一括更新するときのsetDataの「間違った」使い方

setDataを連続して使用する場合、以下のような書き方をしたくなります。

setData('title', newTitle);
setData('status', newStatus);
setData('dueDate', newDueDate);

しかし、実はこの書き方では最後のsetDataしか実行されず、全体としてのdataは正しく更新されません。

これはどうやらReactのstateの挙動によるもののようで、不具合ではないそうです。
■ 参考:https://sinar.blog/laravel-inertia-react-multiple-setdata/

dataの値を一括更新するときのsetDataの「正しい」使い方

正常に一括更新させるための正しい書き方は全部で3パターンあります。

ケケンタ

ひとつずつご紹介していきます!

パターン①

以下のように記述することで、dataオブジェクト内の特定のプロパティの値を更新することが可能です。

setData(data => ({...data, title: newTitle}));
setData(data => ({...data, status: newStatus}));
setData(data => ({...data, dueDate: newDueDate}));

...dataはjavascriptのスプレッド構文です。

例えば、上記のコードの1行目では

dataオブジェクトのtitleプロパティの値だけを更新した「新たなdataオブジェクト」をセットし直す

という動きをします。

スプレッド構文については公式ドキュメントをご覧ください。
■ 参考:スプレッド構文(MDN)

パターン②

以下のように記述すると、titlestatusdueDateの各プロパティの値がひとまとめに更新されます。

setData(data => ({...data, 
    title: newTitle,
    status: newStatus,
    dueDate: newDueDate,
}));

理屈としてはパターン①のときと同じで

各プロパティ(titlestatusdueDate)の値を更新した「新たなdataオブジェクト」をセットし直す

という動きをします。

ケケンタ

個人的には、パターン①よりも上記の書き方のほうが一括更新している様子がパッと見てわかりやすいので気に入っています。

パターン③

dataオブジェクトを完全に置き換えてしまっても問題が無ければ、以下のように書くことも可能です。

setData({
    title: newTitle,
    status: newStatus,
    dueDate: newDueDate,
});

このように書くと、dataオブジェクト内が完全に置き換わります。

例えば、上記3つのプロパティ(titlestatusdueDate)の他に、updateDateという4つ目のプロパティがdataオブジェクトに存在していたとします。

この状態で上記のコードを実行すると、updateDateundefined=未定義に置き換わります。

ケケンタ

上記のようなsetData({ ... });という書き方でdataオブジェクトを更新するときは、この点にご注意ください!

まとめ

いかがだったでしょうか。

今回はinertiaのuseFormヘルパーをReactで利用しているときに、

連続して記述したsetDataが上手く動作しないときの対処法(正しい記述方法)

についてご紹介しました。

連続して記述したsetDataが上手く動作しない根本的な原因は、Reactのstateの仕様にあります(※不具合ではありません)。

要するに、オブジェクトが格納されているstateを更新するときは、「オブジェクト全体に対して更新をかける必要がある」ということですね。

そんなときに便利なのが、今回ご紹介したjavascriptのスプレッド構文です。

参考:スプレッド構文(MDN)

ケケンタ

僕も今回ご紹介したケースで時間を無駄に使ってしまった経験があります。

もし「コードは合ってるのに挙動がおかしい!」と思う場面に遭遇したときは、仕様をじっくり確認してみると根本解決できるかもしれません。

それでは、最後までご覧いただきありがとうございました!

当ブログではLaravelやPHPに関する情報も発信していますので、ご興味のある方はぜひほかの記事もご覧いただけるとうれしいです。

【Laravel×React×inertia】useFormヘルパーで連続したsetDataが動作しないときの対処法のアイキャッチ画像

この記事が気に入ったら
フォローしてね!

この記事が良いと思ったらシェアしてね!

コメント

コメントする

CAPTCHA


目次