Vuex で状態管理
1.Vuex
Firebase を使用して、ログイン機能を追加できた。
つぎは、コンポーネント間で、データのやり取りを行いたい。
状態管理を行う手法の記述があるが、Fluxライクな公式実装ということで、Vuex を素直に使用する。
1.1 インストール
npm install vuex –save
2.実装
2.1 main.js
- Vue.user(Vuex) で使用準備
- Vuex.Store でストアを作成
- state に、firebase のログインユーザー情報を格納
- muattions で、stateに設定した user情報を操作するメソッドを公開
- firebase のユーザーが取得出来たら、store.commit にて、stateにユーザーを格納する
- new Vue() 内に、storeを設定することで、グローバルにstoreを参照できるように
import Vue from 'vue' import Vuex from 'vuex' import '@/plugins/vuetify' import firebase from '@/plugins/firebase' import 'firebase/auth' import { MUTATION_LOGIN_USER } from '@/consts' Vue.use(Vuex) const store = new Vuex.Store({ state: { user:null }, mutations: { user(state, user) { state.user = user; } } }) firebase.auth().onAuthStateChanged(user => { if (user) { store.commit(MUTATION_LOGIN_USER, user); } }) new Vue({ render: h => h(App), store, }).$mount('#app')
2.2 const.js
ミューテーションを介して、stateを操作するが、ミューテーションを介した操作をトラックするためにミューテーションの名称を外だし
export const MUTATION_LOGIN_USER = "user";
2.3 App.vue
- computed の userName で、Vuexのstoreから、firebaseのログインユーザを取得する
- {{userName}} で上記にバインド。ログインユーザーの表示名をツールバーに表示する
<template> <v-app> <v-navigation-drawer fixed clipped app v-model="navBar"> <v-list dense class="pt-0"> <router-link to="/login"> <v-list-tile> <v-list-tile-action> <v-avatar v-if="photoUrl" size="28px"> <img :src="photoUrl"> </v-avatar> <v-icon v-else>account_box</v-icon> </v-list-tile-action> <v-list-tile-content>{{userName}}</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/"> <v-list-tile> <v-list-tile-action> <v-icon>home</v-icon> </v-list-tile-action> <v-list-tile-content>HOME</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/entry"> <v-list-tile> <v-list-tile-action> <v-icon>edit</v-icon> </v-list-tile-action> <v-list-tile-content>ENTRY</v-list-tile-content> </v-list-tile> </router-link> <router-link to="/about"> <v-list-tile> <v-list-tile-action> <v-icon>settings</v-icon> </v-list-tile-action> <v-list-tile-content>ABOUT</v-list-tile-content> </v-list-tile> </router-link> </v-list> </v-navigation-drawer> <v-toolbar clipped-left fixed app> <v-toolbar-side-icon @click.stop="navBar = !navBar"></v-toolbar-side-icon> <v-toolbar-title>FavoPhrase</v-toolbar-title> <v-spacer></v-spacer> <v-toolbar-items class="hidden-sm-and-down"> <v-btn flat to="/">Home</v-btn> <v-btn flat to="/entry">Entry</v-btn> <v-btn flat to="/about">About</v-btn> <v-btn flat to="/login"> <v-avatar v-if="photoUrl" size="32px" class="pa-4"> <img :src="photoUrl"> </v-avatar> {{userName}} </v-btn> </v-toolbar-items> </v-toolbar> <v-content> <v-container fluid fill-height> <v-fade-transition mode="out-in"> <router-view></router-view> </v-fade-transition> </v-container> </v-content> </v-app> </template> <script> import firebase from '@/plugins/firebase' export default { name: 'App', data() { return { navBar: null, } }, computed: { userName() { var user = this.$store.state.user; if (user != null) { if (user.displayName) { return user.displayName; } if (user.email) { return user.email; } } return "LOG IN"; }, photoUrl() { var user = this.$store.state.user; return (user == null)?null:user.photoURL; } }, created() { }, mounted() { } } </script> <style> a { text-decoration: none; } </style>
3.実行
3.1 ログインしていない状態から
3.2 Firebase ログインUIから、ログイン
3.3 ログインが成功し表示名とアイコンが表示された OK
|