<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>inertia &#8211; ケケンタの独学ITブログ</title>
	<atom:link href="https://kekenta-it-blog.com/tag/inertia/feed/" rel="self" type="application/rss+xml" />
	<link>https://kekenta-it-blog.com</link>
	<description>プログラミングやWeb制作の情報を発信</description>
	<lastBuildDate>Mon, 24 Feb 2025 06:30:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://kekenta-it-blog.com/wp-content/uploads/2023/07/cropped-KEKENTA-BLOG-32x32.png</url>
	<title>inertia &#8211; ケケンタの独学ITブログ</title>
	<link>https://kekenta-it-blog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Laravel×React×inertia】useFormで連続したsetDataが動作しないとき</title>
		<link>https://kekenta-it-blog.com/react-inertia-setdata-failure-update/</link>
					<comments>https://kekenta-it-blog.com/react-inertia-setdata-failure-update/#respond</comments>
		
		<dc:creator><![CDATA[ケケンタ]]></dc:creator>
		<pubDate>Thu, 14 Nov 2024 08:40:46 +0000</pubDate>
				<category><![CDATA[React]]></category>
		<category><![CDATA[inertia]]></category>
		<category><![CDATA[useform]]></category>
		<guid isPermaLink="false">https://kekenta-it-blog.com/?p=12312</guid>

					<description><![CDATA[<p><img src="https://kekenta-it-blog.com/wp-content/uploads/2024/11/eye-catch__react-inertia-setdata-failure-update__12312-1024x576.jpg" class="webfeedsFeaturedVisual" /></p>Laravel開発でinertiaを使用してフロントエンドにReactを採用する場合、inertiaのuseFormヘルパーを活用する場面が多くあるかと思います。 今回は、そうした開発環境において 連続して記述したset [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://kekenta-it-blog.com/wp-content/uploads/2024/11/eye-catch__react-inertia-setdata-failure-update__12312-1024x576.jpg" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">Laravel開発で<strong>inertia</strong>を使用してフロントエンドに<strong>React</strong>を採用する場合、inertiaの<strong>useFormヘルパー</strong>を活用する場面が多くあるかと思います。</p>



<p class="wp-block-paragraph">今回は、そうした開発環境において</p>



<p class="has-text-align-center is-style-big_kakko_box wp-block-paragraph"><strong><span class="swl-marker mark_yellow">連続して記述したsetDataが上手く動作しないときの対処法（正しい記述方法）</span></strong></p>



<p class="wp-block-paragraph">をご紹介します。</p>



<h2 class="wp-block-heading">【前提】useFormの宣言</h2>



<p class="wp-block-paragraph">前提として、今回は以下のような内容でuseFormの宣言をしていることとします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>const { data, setData } = useForm({
    title: iniTitle,
    status: iniStatus,
    dueDate: iniDueDate,
});</code></pre></div>



<h2 class="wp-block-heading">dataの値を一括更新するときのsetDataの「間違った」使い方</h2>



<p class="is-style-bg_stripe wp-block-paragraph"><code>setData</code>を連続して使用する場合、以下のような書き方をしたくなります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>setData(&#39;title&#39;, newTitle);
setData(&#39;status&#39;, newStatus);
setData(&#39;dueDate&#39;, newDueDate);</code></pre></div>



<p class="wp-block-paragraph">しかし、実はこの書き方では<strong><span class="swl-marker mark_orange">最後の<code>setData</code>しか実行されず、全体としての<code>data</code>は正しく更新されません。</span></strong></p>



<p class="is-style-icon_pen wp-block-paragraph">これはどうやらReactのstateの挙動によるもののようで、不具合ではないそうです。<br>■ 参考：<a href="https://sinar.blog/laravel-inertia-react-multiple-setdata/">https://sinar.blog/laravel-inertia-react-multiple-setdata/</a></p>



<h2 class="wp-block-heading">dataの値を一括更新するときのsetDataの「正しい」使い方</h2>



<p class="is-style-bg_stripe wp-block-paragraph">正常に<strong>一括更新させるための正しい書き方</strong>は全部で<strong><span class="swl-inline-color has-swl-deep-02-color">３パターン</span></strong>あります。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>ひとつずつご紹介していきます！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading" id="anc-pattern01">パターン①</h3>



<p class="is-style-bg_stripe wp-block-paragraph">以下のように記述することで、<strong><span class="swl-marker mark_yellow"><code>data</code>オブジェクト内の特定のプロパティの値を更新することが可能</span></strong>です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>setData(data =&gt; ({...data, title: newTitle}));
setData(data =&gt; ({...data, status: newStatus}));
setData(data =&gt; ({...data, dueDate: newDueDate}));</code></pre></div>



<p class="is-style-big_icon_point wp-block-paragraph"><code>...data</code>はjavascriptの<strong>スプレッド構文</strong>です。</p>



<p class="wp-block-paragraph">例えば、上記のコードの1行目では</p>



<p class="wp-block-paragraph"><strong><code>data</code>オブジェクトの<code>title</code>プロパティの値だけを更新した「新たな<code>data</code>オブジェクト」をセットし直す</strong></p>



<p class="wp-block-paragraph">という動きをします。</p>



<p class="is-style-icon_pen wp-block-paragraph">スプレッド構文については公式ドキュメントをご覧ください。<br>■ 参考：<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax">スプレッド構文（MDN）</a></p>



<h3 class="wp-block-heading">パターン②</h3>



<p class="is-style-bg_stripe wp-block-paragraph">以下のように記述すると、<strong><code>title</code>、<code>status</code>、<code>dueDate</code>の各プロパティの値がひとまとめに更新</strong>されます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>setData(data =&gt; ({...data, 
    title: newTitle,
    status: newStatus,
    dueDate: newDueDate,
}));</code></pre></div>



<p class="wp-block-paragraph">理屈としては<a href="#anc-pattern01">パターン①</a>のときと同じで</p>



<p class="wp-block-paragraph"><strong>各プロパティ（<code>title</code>、<code>status</code>、<code>dueDate</code>）の値を更新した「新たなdataオブジェクト」をセットし直す</strong></p>



<p class="wp-block-paragraph">という動きをします。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/11/kekenta-icon-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/11/kekenta-icon-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>個人的には、<a href="#anc-pattern01">パターン①</a>よりも上記の書き方のほうが一括更新している様子がパッと見てわかりやすいので気に入っています。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading">パターン③</h3>



<p class="is-style-bg_stripe wp-block-paragraph"><strong>dataオブジェクトを完全に置き換えてしまっても問題が無ければ</strong>、以下のように書くことも可能です。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-js" data-lang="JavaScript"><code>setData({
    title: newTitle,
    status: newStatus,
    dueDate: newDueDate,
});</code></pre></div>



<p class="wp-block-paragraph">このように書くと、<code>data</code>オブジェクト内が完全に置き換わります。</p>



<p class="wp-block-paragraph">例えば、上記３つのプロパティ（<code>title</code>、<code>status</code>、<code>dueDate</code>）の他に、<code>updateDate</code>という４つ目のプロパティが<code>data</code>オブジェクトに存在していたとします。</p>



<p class="wp-block-paragraph">この状態で上記のコードを実行すると、<strong><span class="swl-marker mark_orange"><code>updateDate</code>は<code>undefined</code>＝未定義に置き換わります。</span></strong></p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/キリッ-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>上記のような<code>setData({ ... });</code>という書き方でdataオブジェクトを更新するときは、この点にご注意ください！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">いかがだったでしょうか。</p>



<p class="wp-block-paragraph">今回はinertiaのuseFormヘルパーをReactで利用しているときに、</p>



<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">連続して記述したsetDataが上手く動作しないときの対処法（正しい記述方法）</span></strong></p>



<p class="wp-block-paragraph">についてご紹介しました。</p>



<p class="wp-block-paragraph">連続して記述したsetDataが上手く動作しない根本的な原因は、<strong>Reactのstateの仕様</strong>にあります（※不具合ではありません）。</p>



<p class="wp-block-paragraph">要するに、オブジェクトが格納されているstateを更新するときは、「オブジェクト全体に対して更新をかける必要がある」ということですね。</p>



<p class="wp-block-paragraph">そんなときに便利なのが、今回ご紹介したjavascriptの<strong>スプレッド構文</strong>です。</p>



<p class="is-style-icon_pen wp-block-paragraph">参考：<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax">スプレッド構文（MDN）</a></p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="gray"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/困った顔-150x150.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2023/07/困った顔-150x150.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ケケンタ</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>僕も今回ご紹介したケースで時間を無駄に使ってしまった経験があります。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<p class="wp-block-paragraph">もし「コードは合ってるのに挙動がおかしい！」と思う場面に遭遇したときは、仕様をじっくり確認してみると根本解決できるかもしれません。</p>



<p class="wp-block-paragraph">それでは、最後までご覧いただきありがとうございました！</p>



<p class="wp-block-paragraph">当ブログではLaravelやPHPに関する情報も発信していますので、ご興味のある方はぜひほかの記事もご覧いただけるとうれしいです。</p>


<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2024/11/eye-catch__react-dynamic-add-class__12265-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/react-dynamic-add-class/">【React】 条件によってクラス名（className）を動的に付与する方法【３パターン】</a>
						<span class="p-blogCard__excerpt">この記事では Reactで条件によってクラス名（className）を動的に付与する方法 を解説します。 動的にクラス名を付与することで、stateの値によって要素の見た目（装飾&#8230;</span>					</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/eye-catch__laravel-ver11-gate-policy__11851-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/laravel-ver11-gate-policy/">【Laravel11】Gate（ゲート）とPolicy（ポリシー）で「認可」機能を実装する</a>
						<span class="p-blogCard__excerpt">Webアプリでは、特定の機能を実行する権限があるかどうかをチェックするために「認可」という仕組みを利用します。 PHPのフレームワークであるLaravelには、この「認可&#8230;</span>					</div>
				</div>
			</div>
		</div>

<div class="swell-block-postLink">			<div class="p-blogCard -internal" data-type="type2" data-onclick="clickLink">
				<div class="p-blogCard__inner">
					<span class="p-blogCard__caption">あわせて読みたい</span>
					<div class="p-blogCard__thumb c-postThumb"><figure class="c-postThumb__figure"><img decoding="async" src="https://kekenta-it-blog.com/wp-content/uploads/2024/10/eye-catch__laravel-ver11-seeder-factory__11960-300x169.jpg" alt="" class="c-postThumb__img u-obf-cover" width="320" height="180"></figure></div>					<div class="p-blogCard__body">
						<a class="p-blogCard__title" href="https://kekenta-it-blog.com/laravel-ver11-seeder-factory/">【Laravel11】シーダとファクトリでテストデータを一括作成する方法</a>
						<span class="p-blogCard__excerpt">Webアプリ開発をするときは、実際の画面表示やデータ処理の動きなどを確認するためにテストデータを作成する必要があります。 テストデータは手作業で入力していっても&#8230;</span>					</div>
				</div>
			</div>
		</div>]]></content:encoded>
					
					<wfw:commentRss>https://kekenta-it-blog.com/react-inertia-setdata-failure-update/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
