<?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>Vue  |  鉄駆ブログ</title>
	<atom:link href="https://ichi-station.com/tag/vue/feed/" rel="self" type="application/rss+xml" />
	<link>https://ichi-station.com</link>
	<description></description>
	<lastBuildDate>Fri, 05 Mar 2021 10:59:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.5</generator>

<image>
	<url>https://ichi-station.com/wp-content/uploads/2022/04/cropped-blog-favicon512x512-4-32x32.png</url>
	<title>Vue  |  鉄駆ブログ</title>
	<link>https://ichi-station.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>リロード時にVuexのデータが初期化されるのを防ぐ方法</title>
		<link>https://ichi-station.com/vuex-persisted-state/</link>
					<comments>https://ichi-station.com/vuex-persisted-state/#respond</comments>
		
		<dc:creator><![CDATA[いっちー]]></dc:creator>
		<pubDate>Fri, 05 Mar 2021 10:59:36 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Vue]]></category>
		<category><![CDATA[Vuex]]></category>
		<guid isPermaLink="false">https://ichi-station.com/?p=1686</guid>

					<description><![CDATA[こんにちは。いっちー(@tetestkake_blog)です！ Vue.jsでアプリケーション開発をしている際に、全体で共有したいデータをVuexに入れて管理することがあると思います。 しかしVuexに保存しているデータ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。いっちー(@<a rel="noopener" href="https://twitter.com/tetsukake_blog" target="_blank">tetestkake_blog</a>)です！</p>



<p>Vue.jsでアプリケーション開発をしている際に、全体で共有したいデータをVuexに入れて管理することがあると思います。</p>



<p>しかしVuexに保存しているデータはブラウザをリロードすると消えてしまいます。</p>



<p>そこでこの記事では<a rel="noopener" href="https://github.com/robinvdvleuten/vuex-persistedstate" target="_blank">vuex-persistedstate</a>を使用して、リロード時にもVuexのデータを保持し続ける方法を紹介します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>vuex-persistedstateを使うことによってさらにVuexが便利になります！</p>
</div></div>



<p>今回の記事ではVuexに関しての解説はしておりません。Vuexに関しては以下の記事をご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-鉄オタエンジニアの駆け出し日記 wp-block-embed-鉄オタエンジニアの駆け出し日記"><div class="wp-block-embed__wrapper">
<a href="https://ichi-station.com/firebase-data-in-vuex/" title="Vuexを使用してFirebaseのログイン情報を保持する方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img width="160" height="90" src="https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" decoding="async" srcset="https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法-160x90.png 160w, https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法-300x169.png 300w, https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法-120x68.png 120w, https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法-320x180.png 320w, https://ichi-station.com/wp-content/uploads/2021/03/Vuexを使用してFirebaseのログイン情報を保持する方法.png 560w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Vuexを使用してFirebaseのログイン情報を保持する方法</div><div class="blogcard-snippet internal-blogcard-snippet">Vue.jsを使用してアプリケーションを開発している時、ログインデータなどをアプリケーション全体で共有したい時ってありますよね。そこで今回の記事ではVuexを使用した、Firebaseのログイン情報保持方法に関して解説したいと思います。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img src="https://www.google.com/s2/favicons?domain=https://ichi-station.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ichi-station.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.03.03</div></div></div></div></a>
</div></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">リロードするとVuexに起こる問題</a></li><li><a href="#toc2" tabindex="0">解決方法</a><ol><li><a href="#toc3" tabindex="0">保存場所</a></li><li><a href="#toc4" tabindex="0">使用上の注意点</a><ol><li><a href="#toc5" tabindex="0">セキュアな情報を保存してはいけない</a></li><li><a href="#toc6" tabindex="0">意図的にステートを初期化しないとずっとストレージに残り続ける</a></li></ol></li></ol></li><li><a href="#toc7" tabindex="0">vuex-persistedstateの使い方</a><ol><li><a href="#toc8" tabindex="0">インストール</a></li><li><a href="#toc9" tabindex="0">サンプルコード</a><ol><li><a href="#toc10" tabindex="0">key</a></li><li><a href="#toc11" tabindex="0">paths</a></li><li><a href="#toc12" tabindex="0">storage</a></li></ol></li></ol></li><li><a href="#toc13" tabindex="0">さいごに</a><ol><li><a href="#toc14" tabindex="0">参考リンク</a></li><li><a href="#toc15" tabindex="0">Vue.jsおすすめ書籍</a></li><li><a href="#toc16" tabindex="0">お知らせ</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">リロードするとVuexに起こる問題</span></h2>



<p>冒頭でも少し説明しましたが、リロードするとVuexのステートが初期化されてしまいます。</p>



<p>これはVuexのステートがメモリ上に保存されているためです。</p>



<p>リロードの他にも、ブラウザを閉じたりすると同じくVuexの値が初期化されてしまいます。</p>



<h2><span id="toc2">解決方法</span></h2>



<p>それらの事象を解決するには<a rel="noopener" href="https://github.com/robinvdvleuten/vuex-persistedstate" target="_blank">vuex-persistedstate</a>を使用します。</p>



<p>vuex-persistedstateでは、ストアに保存した値をメモリ上から指定したストレージに保存することで、</p>



<p>リロードされてもステートの値が初期化されることを防ぎます。</p>



<h3><span id="toc3">保存場所</span></h3>



<p>ステートの保存場所は以下の3つから選択できます。</p>



<figure class="wp-block-table"><table><tbody><tr><td>保存場所</td><td>storageプロパティの値</td><td>保存期間</td></tr><tr><td>ローカルストレージ</td><td>window.localStrage</td><td>消すまで残り続ける</td></tr><tr><td>セッションストレージ</td><td>window.sessionStrage</td><td>セッションが切れるまで or タブやブラウザが閉じられるまで</td></tr><tr><td>Cookie</td><td><a rel="noopener" href="https://github.com/robinvdvleuten/vuex-persistedstate#customize-storage" data-type="URL" data-id="https://github.com/robinvdvleuten/vuex-persistedstate#customize-storage" target="_blank">このページ</a>を参照</td><td>任意の期間を指定可能</td></tr></tbody></table></figure>



<h3><span id="toc4">使用上の注意点</span></h3>



<p>vuex-persistedstateを使う上での注意点は以下になります。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box has-border-color has-orange-border-color"><div class="caption-box-label block-box-label box-label fab-edit"><span class="caption-box-label-text block-box-label-text box-label-text">注意点</span></div><div class="caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-caret-right block-box"><div class="iconlist-title"></div>
<ul><li>セキュアな情報を保存してはいけない</li><li>意図的にステートを初期化しないとずっとストレージに残り続ける</li></ul>
</div>
</div></div>



<h4><span id="toc5">セキュアな情報を保存してはいけない</span></h4>



<p>ローカルストレージやCookieなどは簡単に値を確認することができてしまいます。</p>



<p>情報漏洩の観点からセキュアな情報（ログイン情報など）は保存しないことが推奨されています。</p>



<h4><span id="toc6">意図的にステートを初期化しないとずっとストレージに残り続ける</span></h4>



<p>いったんローカルストレージに保存すると、その後削除しない限り残り続けます。</p>



<p>例えばローカルストレージにログイン名を保存していたとして、ログアウト時にステートの初期化処理がない場合、</p>



<p>別のユーザーにて同じブラウザでログインした場合に前のログインユーザー名が表示されるなどの不具合が生じる場合があります。</p>



<p>その場合はログアウト時に意図的にステートの値を初期化すると良さそうです。</p>



<h2><span id="toc7">vuex-persistedstateの使い方</span></h2>



<p>ここからはサンプルコードを用いてvuex-persistedstateの使い方を解説します。</p>



<h3><span id="toc8">インストール</span></h3>



<p>以下のコマンドでインストールします。</p>



<pre class="wp-block-code"><code>yarn add vuex-persistedstate</code></pre>



<p>npmの場合は以下のコマンドを使用します。</p>



<pre class="wp-block-code"><code>npm install --save　vuex-persistedstate</code></pre>



<h3><span id="toc9">サンプルコード</span></h3>



<p>以下がvuex-persistedstateを使用したサンプルコードになります。</p>



<p>src/store.js</p>



<pre class="wp-block-code"><code>import Vue from 'vue';
import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    isLoggedIn: false,
    userId: 0,
  },
  mutations: {
    onUserLoginStatusChanged(state, isLoggedIn) {
      // ログインしているかどうか
      state.isLoggedIn = isLoggedIn;
    },
    updateUserId(state, userId) {
      state.userId = userId;
    }
  },
  getters: {
    isLoggedIn(state) {
      return state.isLoggedIn;
    },
    userId(state) {
      return state.userId;
    }
  },
  plugins: &#91;createPersistedState(
    {
      // ストレージのキーを指定。デフォルトではvuex
      key: 'myApp',
      // 管理対象のステートを指定
      paths: &#91;
        'isLoggedIn',
        'userId',
      ],
      // ストレージの種類を指定。デフォルトではローカルストレージ
      storage: window.sessionStorage,
    }
  )]
});</code></pre>



<p>state, mutations, gettersはVuex用のコードになり、</p>



<p>pluginsでvuex-persistedstateの設定を記述します。</p>



<h4><span id="toc10">key</span></h4>



<p>keyではストレージに保存する際のキーを指定します。</p>



<p>デフォルトではvuexという名前が使用されます。</p>



<p>他との競合を避けるという意味でも、ユニークな名前をつけると良いでしょう。</p>



<h4><span id="toc11">paths</span></h4>



<p>pathsでは管理対象のステートを指定します。</p>



<p>今回の場合ではisLoggedIn, userIdを指定してリロード時にも値が保持できるようにしています。</p>



<h4><span id="toc12">storage</span></h4>



<p>storageでは保存するストレージを指定します。</p>



<p>ローカルストレージ・セッションストレージ・Cookieから選択でき、</p>



<p>デフォルトではローカルストレージが選択されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>これでリロードしてもVuexの値が保持されるようになりました！</p>
</div></div>



<h2><span id="toc13">さいごに</span></h2>



<p>今回はvuex-persistedstateを使用した、リロード時にVuexのデータが初期化されるのをを防ぐ方法を解説しました。</p>



<p>Vuexにて値を保持したい場合はvuex-persistedstateを使ってみてください！</p>



<h3><span id="toc14">参考リンク</span></h3>



<p><a rel="noopener" href="https://github.com/robinvdvleuten/vuex-persistedstate#customize-storage" data-type="URL" data-id="https://github.com/robinvdvleuten/vuex-persistedstate#customize-storage" target="_blank">robinvdvleuten/vuex-persistedstate</a></p>



<p><a rel="noopener" href="https://qiita.com/_masa_u/items/b58b92c283f4e770e094" data-type="URL" data-id="https://qiita.com/_masa_u/items/b58b92c283f4e770e094" target="_blank">【Vue】リロードしても大丈夫。そう、vuex-persistedstateならね。</a></p>



<h3><span id="toc15">Vue.jsおすすめ書籍</span></h3>



<p><a rel="noopener" href="https://amzn.to/3q6yh0N" data-type="URL" data-id="https://amzn.to/3q6yh0N" target="_blank">改訂2版 基礎から学ぶVue.js</a></p>



<p><a rel="noopener" href="https://amzn.to/3kEAFdW" data-type="URL" data-id="https://amzn.to/3kEAFdW" target="_blank">Vue.js入門 基礎から実践アプリケーション開発まで</a></p>



<h3><span id="toc16">お知らせ</span></h3>



<p>にほんブログ村のランキングに参加しています。よろしければ下のボタンをポチッとしていただけると嬉しいです＼(^^)／</p>



<a rel="noopener" href="https://it.blogmura.com/ranking/in?p_cid=11090436" target="_blank"><img decoding="async" src="https://b.blogmura.com/it/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログへ"></a><br><a href="https://it.blogmura.com/ranking/in?p_cid=11090436">にほんブログ村</a>
]]></content:encoded>
					
					<wfw:commentRss>https://ichi-station.com/vuex-persisted-state/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vuexを使用してFirebaseのログイン情報を保持する方法</title>
		<link>https://ichi-station.com/firebase-data-in-vuex/</link>
					<comments>https://ichi-station.com/firebase-data-in-vuex/#respond</comments>
		
		<dc:creator><![CDATA[いっちー]]></dc:creator>
		<pubDate>Wed, 03 Mar 2021 12:54:01 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Firebase]]></category>
		<category><![CDATA[Vue]]></category>
		<category><![CDATA[Vuex]]></category>
		<guid isPermaLink="false">https://ichi-station.com/?p=1662</guid>

					<description><![CDATA[こんにちは！いっちー(@tetestkake_blog)です。 Vue.jsを使用してアプリケーションを開発している時、ログインデータなどをアプリケーション全体で共有したい時ってありますよね。 そこで今回の記事ではVue [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは！いっちー(@<a rel="noopener" href="https://twitter.com/tetsukake_blog" data-type="URL" data-id="https://twitter.com/tetsukake_blog" target="_blank">tetestkake_blog</a>)です。</p>



<p>Vue.jsを使用してアプリケーションを開発している時、ログインデータなどをアプリケーション全体で共有したい時ってありますよね。</p>



<p>そこで今回の記事ではVuexを使用した、Firebaseのログイン情報保持方法に関して解説したいと思います。</p>



<p>Vueは2系を使用したサンプルコードも掲載しているのでそちらもご参照ください。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>Vuexを使用するとアプリケーション全体でデータが共有できて便利です。</p>
</div></div>



<p>※この記事ではFirebaseに関しての詳細な説明は省略しています。以下の記事で解説しているのでよろしかったらご覧ください！</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-鉄オタエンジニアの駆け出し日記 wp-block-embed-鉄オタエンジニアの駆け出し日記"><div class="wp-block-embed__wrapper">
<a href="https://ichi-station.com/firebase-authentication/" title="ログインを数行で実装できるFirebase Authenticationが便利すぎた" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img width="160" height="90" src="https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた-160x90.png 160w, https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた-300x169.png 300w, https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた-120x68.png 120w, https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた-320x180.png 320w, https://ichi-station.com/wp-content/uploads/2021/02/ログインを数行で実装できる-Firebase-Authentication-が便利すぎた.png 560w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ログインを数行で実装できるFirebase Authenticationが便利すぎた</div><div class="blogcard-snippet internal-blogcard-snippet">皆さんはアプリのログインはどのように実装していますか？Firebase Authenticationを使用するとログイン機能がたった数行で実装でき、大変便利です。料金は無料・有料プランから選択でき、電話認証以外は無料プランで充分使うことができます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img src="https://www.google.com/s2/favicons?domain=https://ichi-station.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ichi-station.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.02.08</div></div></div></div></a>
</div></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Vuexとは？</a></li><li><a href="#toc2" tabindex="0">Firebaseのログイン情報をVuexで管理</a><ol><li><a href="#toc3" tabindex="0">src/store.js</a></li><li><a href="#toc4" tabindex="0">src/main.js</a></li><li><a href="#toc5" tabindex="0">src/firebaseUtils.js</a></li><li><a href="#toc6" tabindex="0">Login.vue</a></li><li><a href="#toc7" tabindex="0">Logout.vue</a></li></ol></li><li><a href="#toc8" tabindex="0">さいごに</a><ol><li><a href="#toc9" tabindex="0">参考リンク</a></li><li><a href="#toc10" tabindex="0">おすすめ書籍</a></li><li><a href="#toc11" tabindex="0">お知らせ</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">Vuexとは？</span></h2>



<p>Vuexとは、Vue.js用の状態管理用ライブラリです。</p>



<p>状態とは、<span class="marker-under-red">アプリケーションが保持しているデータのこと</span>を指します。</p>



<p>Vuexでデータを管理すると、全てのコンポーネントから保存したデータを参照することが可能になります。</p>



<p>要は、アプリケーション全体で使いまわしたいデータを入れておく箱のようなものです。</p>



<p>例えばログイン情報など、全てのコンポーネントから参照しうるデータを格納する場所として使われます。</p>



<p>コンポーネント間のデータのやり取りはpropsやemitからも可能ですが、より広い範囲でデータをやり取りする時などにはVuexを選択すると良さそうです。</p>



<h2><span id="toc2">Firebaseのログイン情報をVuexで管理</span></h2>



<p>ここからはコードのサンプルを紹介しながらFirebaseのログイン情報をVuexで保持する方法に関して紹介します。</p>



<p>サンプルではログイン機能を担当するLogin.vue, Logout.vueのコードも追加しましたのでそちらもご覧ください！</p>



<h3><span id="toc3">src/store.js</span></h3>



<p>Vuexに値を保存する部分を担当するstore.jsを作成します。全体のコードは以下になります。</p>



<pre class="wp-block-code"><code>import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    user: {},
    isLoggedIn: false,
  },
  mutations: {
    onAuthStateChanged(state, user) {
      // firebaseが返したユーザー情報
      state.user = user;
    },
    onUserLoginStatusChanged(state, isLoggedIn) {
      // ログインしているかどうか
      state.isLoggedIn = isLoggedIn;
    }
  },
  getters: {
    user(state) {
      return state.user;
    },
    isLoggedIn(state) {
      return state.isLoggedIn;
    }
  }
});</code></pre>



<p>保存するデータの本体はstateの箇所にて宣言します。初期値はuserには空のオブジェクト、isLoggedInにはfalseを設定しています。</p>



<p>データを保存する部分はmutationsが担当します。</p>



<p>mutationsでは第一引数でVuexの状態（state）を受け取り、第二引数で更新する情報を受け取ります。</p>



<p>gettersはstoreに保存した情報を参照する際に使用します。</p>



<p>直接stateを参照することもできてしまいますが、Vuexのお作法的にはgetterを経由して参照することが推奨されています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>直接stateを参照しないことでVuexでは値に対する秩序を守っているのですね！</p>
</div></div>



<h3><span id="toc4">src/main.js</span></h3>



<p>main.jsではstoreをVueインスタンスに渡してあげることで、全体でstoreを使用できるようにします。</p>



<pre class="wp-block-code"><code>import Vue from 'vue';
import App from './App.vue';
import vuetify from './plugins/vuetify';
import router from './router';
import firebase from 'firebase';
import store from './store';

Vue.config.productionTip = false;

const firebaseAuthConfig = {
  apiKey: process.env.VUE_APP_FIREBASE_API_KEY,
  authDomain: process.env.VUE_APP_FIREBASE_AUTH_DOMAIN
};

firebase.initializeApp(firebaseAuthConfig);

new Vue({
  vuetify,
  router,
  store,
  render: h =&gt; h(App)
}).$mount('#app');</code></pre>



<p>また今回はfirebaseのinit処理もmain.jsに配置しています。</p>



<h3><span id="toc5">src/firebaseUtils.js</span></h3>



<p>firebaseUtils.jsでは、firebaseから取得したログイン情報と、ログインしているかどうかのboolの値をstoreに保存します。</p>



<pre class="wp-block-code"><code>import firebase from 'firebase';
import store from './store';

export default {
  onAuthStateChanged() {
    firebase.auth().onAuthStateChanged(u => {
      let user = u ? u : {};
      store.commit('onAuthStateChanged', user);
      store.commit('onUserLoginStatusChanged', user.uid ? true : false);
    });
  }
}</code></pre>



<p>ログイン状態が変化した際の処理であるonAuthStateChanged()にて処理を行います。</p>



<p>ここでは、firebaseのログイン状態が変化したことを検知し、</p>



<p>storeに保存しているuser, isLoggedInの情報を更新しています。</p>



<p>処理的には、</p>



<pre class="wp-block-code"><code>user = user ? user : {};</code></pre>



<p>の部分でuserが存在したらuserを、そうでなければ空オブジェクトをuserに詰めています。</p>



<pre class="wp-block-code"><code>store.commit('onAuthStateChanged', user);</code></pre>



<p>ではstoreのonAuthStateChangedを介してuserの情報を更新し、</p>



<pre class="wp-block-code"><code>store.commit('onUserLoginStatusChanged', user.uid ? true : false);</code></pre>



<p>でログインしているかのboolの情報を更新します。</p>



<h3><span id="toc6">Login.vue</span></h3>



<p>以下のログインコンポーネントでは、ログインフォームの表示とfirebaseを使用したログインを実装しています。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
  &lt;div&gt;
    &lt;h1&gt;ログイン&lt;/h1&gt;
    &lt;v-card
      class="pa-5 ma-auto mt-3"
      width="50%"
    &gt;
      &lt;v-form
        ref="loginForm"
      &gt;
        &lt;v-text-field
          v-model="email"
          label="Email"
          :rules="requiredRule"
          required
        &gt;&lt;/v-text-field&gt;
        &lt;v-text-field
          v-model="password"
          :append-icon="showPassword ? 'mdi-eye' : 'mdi-eye-off'"
          label="Password"
          :rules="requiredRule"
          :type="showPassword ? 'text' : 'password'"
          required
          @click:append="showPassword = !showPassword"
        &gt;&lt;/v-text-field&gt;
        &lt;v-btn
          @click="login"
        &gt;
          ログイン
        &lt;/v-btn&gt;
      &lt;/v-form&gt;
    &lt;/v-card&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
import firebase from 'firebase';
import firebaseUtils from './../firebaseUtils';

export default {
  name: 'Login',
  data: () =&gt; ({
    email: "",
    password: "",
    requiredRule: &#91;
      value =&gt; !!value || '必須項目です',
    ],
    showPassword: false,
  }),
  methods: {
    login() {
      if (this.$refs.loginForm.validate()) {
        firebase.auth().signInWithEmailAndPassword(this.email, this.password)
        .then(() =&gt; {
          firebaseUtils.onAuthStateChanged();
          alert('login success');
        })
        .catch(e =&gt; {
          alert('login error');
          console.log('error', e);
        })
      } else {
        alert('validate error');
      }
    },
  }
}
&lt;/script&gt;</code></pre>



<p>ログインに関しての処理は</p>



<pre class="wp-block-code"><code>firebase.auth().signInWithEmailAndPassword(this.email, this.password)</code></pre>



<p>にてフォームから入力されたメールアドレスとパスワードの情報をFirebaseに渡すことでログインを実現し、</p>



<pre class="wp-block-code"><code>firebaseUtils.onAuthStateChanged();</code></pre>



<p>にてstoreに保存しているユーザーの情報を書き換えています。</p>



<h3><span id="toc7">Logout.vue</span></h3>



<p>以下のログアウトコンポーネントでは、ログアウトボタンの表示とfirebaseを使用したログアウトを実装しています。</p>



<pre class="wp-block-code"><code>&lt;template&gt;
  &lt;v-card
    class="pa-5 ma-auto"
    width="50%"
  &gt;
    &lt;div class="logout"&gt;ログアウトしますか？&lt;/div&gt;
    &lt;v-btn
      class="ma-3"
      color="gray"
      @click="$router.go(-1)"
    &gt;戻る&lt;/v-btn&gt;
    &lt;v-btn
      color="grey lighten-1"
      dark
      @click="logout()"
    &gt;ログアウト&lt;/v-btn&gt;
  &lt;/v-card&gt;
&lt;/template&gt;

&lt;script&gt;
import firebase from 'firebase';
import firebaseUtils from './../firebaseUtils';
import router from '@/router';

export default {
  name: 'Logout',
  methods: {
    logout() {
      firebase.auth().signOut()
      .then(() =&gt; {
        firebaseUtils.onAuthStateChanged();
        // ログイン画面に遷移
        router.push({ path: '/login' });
      })
      .catch(() =&gt; {
        alert('ログアウト失敗')
      });
    }
  },
}
&lt;/script&gt;

&lt;style scoped&gt;
.logout {
  font-size: 40px;
  font-weight: bold;
}
&lt;/style&gt;</code></pre>



<p>ログアウトに関しての処理は</p>



<pre class="wp-block-code"><code>firebase.auth().signOut()</code></pre>



<p>にて完結し、それが成功したら</p>



<pre class="wp-block-code"><code>firebaseUtils.onAuthStateChanged();</code></pre>



<p>にてstoreに保存しているユーザーの情報を書き換えています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>これでログインとログアウト時にVuexに保存しているユーザーの情報を書き換えることに成功しました！</p>
</div></div>



<h2><span id="toc8">さいごに</span></h2>



<p>今回はVuexを使用してFirebaseのログイン情報を保持する方法というテーマでお伝えしました。</p>



<p>コンポーネント全体でデータを共有する必要がある場合などは、Vuexを使ってみてください。</p>



<h3><span id="toc9">参考リンク</span></h3>



<p><a rel="noopener" href="https://vuex.vuejs.org/ja/" data-type="URL" data-id="https://vuex.vuejs.org/ja/" target="_blank">Vuex 公式ドキュメント</a></p>



<p><a rel="noopener" href="https://qiita.com/ErgoFriend/items/bd1bb445e185bf45e272" data-type="URL" data-id="https://qiita.com/ErgoFriend/items/bd1bb445e185bf45e272" target="_blank">Qiita Vue vuexでfirebaseのログイン保持</a></p>



<h3><span id="toc10">おすすめ書籍</span></h3>



<p><a rel="noopener" href="https://amzn.to/3q6yh0N" data-type="URL" data-id="https://amzn.to/3q6yh0N" target="_blank">改訂2版 基礎から学ぶVue.js</a></p>



<p><a rel="noopener" href="https://amzn.to/3kEAFdW" data-type="URL" data-id="https://amzn.to/3kEAFdW" target="_blank">Vue.js入門 基礎から実践アプリケーション開発まで</a></p>



<h3><span id="toc11">お知らせ</span></h3>



<p>にほんブログ村のランキングに参加しています。よろしければ下のボタンをポチッとしていただけると嬉しいです＼(^^)／</p>



<a rel="noopener" href="https://it.blogmura.com/ranking/in?p_cid=11090436" target="_blank"><img decoding="async" src="https://b.blogmura.com/it/88_31.gif" width="88" height="31" border="0" alt="にほんブログ村 IT技術ブログへ"></a><br><a href="https://it.blogmura.com/ranking/in?p_cid=11090436">にほんブログ村</a>
]]></content:encoded>
					
					<wfw:commentRss>https://ichi-station.com/firebase-data-in-vuex/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
