<?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>SPA &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/spa/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Mon, 15 Apr 2024 14:08:12 +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://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>SPA &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>LaravelにVueコンポーネントをバインドする方法</title>
		<link>https://otonan-syusyoku.work/archives/1720</link>
					<comments>https://otonan-syusyoku.work/archives/1720#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 14:06:40 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[SPA]]></category>
		<category><![CDATA[Vue]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1720</guid>

					<description><![CDATA[Laravelプロジェクトを運用している方が jQuery を卒業して Vue または React を導入したい！という悩みに直面する事はしばしばあると思います。 SPAを構築するのはコスト的に対応が難しいため、Lara [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Laravelプロジェクトを運用している方が<span class="sc_marker blue"><strong> jQuery を卒業して Vue または React を導入したい！</strong></span>という悩みに直面する事はしばしばあると思います。</p>
<p>SPAを構築するのはコスト的に対応が難しいため、Laravelプロジェクトの一部にVueを導入する方法を解説しまっす。</p>
<h2>環境</h2>
<ul>
<li>PHP8.2</li>
<li>Laravel10</li>
<li>Vue3
<ul>
<li>node v18.19.1</li>
<li>npm 10.5.0</li>
</ul>
</li>
</ul>
<h2>やりたいこと</h2>
<p>Laravel10の一部にVue.jsを適用する</p>
<ul>
<li>Vueコンポーネントを定義する</li>
<li>Vueコンポーネントをバインドする</li>
<li>Vueコンポーネントにバックエンドからデータを渡す</li>
</ul>
<h2>手順</h2>
<p><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png" alt="Let&#96;s GO" width="1000" height="500" class="aligncenter size-full wp-image-1680" srcset="https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2024/02/Lets-GO-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></p>
<h3>なにわともあれVueのインストール</h3>
<p>LaravelはビルドツールにViteを採用しているため、ViteのプラグインとしてVueをインストールします。<br />
（CLIでインストールしても良いと思いますよ！</p>
<pre class="line-numbers"><code class="language-other">$ npm install @vitejs/plugin-vue

<span>$ npm install @vitejs/plugin-vue --save-dev</span></code></pre>
<h3>vite.config.js の設定</h3>
<p>インストールしたVueを設定ファイルに追記します</p>
<pre class="line-numbers"><code class="language-js">import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // 追記

export default defineConfig({
  plugins: [vue()] // 追記
});</code></pre>
<h3>app.jsを使える状態に持っていく</h3>
<p>Vueコンポーネントをグローバルコンポーネントとして登録するために、以下の形でapp.jsを編集します。</p>
<p>下記の記述でやりたいこととしては、<span class="sc_marker blue"><strong>コンポーネントの作成及びコンポーネントのマウント</strong></span>です。</p>
<pre class="line-numbers"><code class="language-js">import './bootstrap';
import {createApp} from 'vue';
import Alpine from 'alpinejs';
import VueDatePicker from './Components/Utility/CsrfToken.vue';
import VueDatePicker from './Components/Utility/DatePicker.vue';
import AddSalesListModal from "./Components/AddSalesListModal.vue";

window.Alpine = Alpine;

Alpine.start();

const app = createApp({});

// グローバルコンポーネント
app.component('csrf-token', CsrfToken);
app.component('add-sales-list-modal', AddSalesListModal);
app.component('date-picker', VueDatePicker);

// #appにマウント
app.mount('#app');
</code></pre>
<p>&nbsp;</p>
<h3>マウント先の指定</h3>
<p>app.js でマウント先を id=&#8217;app&#8217; としたため、以下のように blade ファイルにマウント先となる記述を設定します。</p>
<pre class="line-numbers"><code class="language-php">&lt;body id="app" class="font-sans antialiased flex flex-col min-h-screen"&gt;
~
~
~
&lt;/body&gt;</code></pre>
<h3>コンポーネントの作成</h3>
<p>試しにLaravelで生成されるCSRFトークンを扱うコンポーネントを作成します。</p>
<p>このコンポーネントはaxios等で非同期通信を実装するときなどに重宝されるはずですので、皆さんも作っておくと便利ですよん。<br />
（今回は擬似的にpタグにCSRFトークンを出力していますが、本来はしません</p>
<pre class="line-numbers"><code class="language-js">&lt;script&gt;
import { ref, onMounted } from 'vue';

export default function useCsrfToken() {
    const csrfToken = ref('');

    onMounted(() =&gt; {
        const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
        if (token) {
            csrfToken.value = token;
        }
    });

    return csrfToken;
}
&lt;/script&gt;

&lt;template&gt;
&lt;p&gt;{{ csrfToken }} &lt;/p&gt;
&lt;/template&gt;</code></pre>
<h3>コンポーネントの呼び出し</h3>
<p>以下の通りに記述したらVueで取得したCSRFトークンが出力されているはずですぅぅ</p>
<pre class="line-numbers"><code class="language-php">&lt;csrf-token&gt;&lt;/csrf-token&gt;</code></pre>
<p>Vueにバックエンドのデータを渡したいときには、以下の通りに実装してみてください</p>
<pre class="line-numbers"><code class="language-other">// Blade
&lt;csrf-token :test='@json($test)'&gt;&lt;/csrf-token&gt;

// Vue
&lt;script setup&gt;
import { defineProps, ref } from "vue";

const props = defineProps({
    test: Object,
});
&lt;/script&gt;</code></pre>
<h2>最後に</h2>
<p>SPAカッコいいから時間さえあればSPA化したい。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1720/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
