web-dev-qa-db-ja.com

JavaScriptファイルからvuexの状態を取得する方法(vueコンポーネント)の代わりに)

私はvuex(2.1.1)で作業しており、vue=単一ファイルコンポーネント内で動作します。ただし、vue単一ファイルコンポーネントいくつかの関数をvueファイルにインポートするutils.jsモジュールに移動しましたが、このutils.jsでvuexの状態を読みたいのですが、どうすれば状態に近づいているのでしょうか?ゲッターなどは、vueコンポーネント内から作業しているかどうかを想定していますか?

import state from '../store/modules/myvuexmodule'を参照してからstate.mystatepropertyを参照しようとしましたが、常に 'undefined'になりますが、vue-devtoolsではstateプロパティに適切な値があることがわかります。

この時点での私の推定では、jsファイル内のstate.property値はリアクティブではないため更新されないなど、単なる「進むべき道」ではありませんが、誰かが間違っていることを確認/証明できる可能性があります。

19
musicformellons

外部jsファイル内のオブジェクトとしてストアにアクセスすることは可能です。また、状態の変化を示すテストを追加しました。

これが外部jsファイルです。

import { store } from '../store/store'

export function getAuth () {
  return store.state.authorization.AUTH_STATE
}

状態モジュール:

import * as NameSpace from '../NameSpace'
/*
   Import everything in NameSpace.js as an object.
   call that object NameSpace.
   NameSpace exports const strings.
*/

import { ParseService } from '../../Services/parse'

const state = {
  [NameSpace.AUTH_STATE]: {
    auth: {},
    error: null
  }
}

const getters = {
  [NameSpace.AUTH_GETTER]: state => {
    return state[NameSpace.AUTH_STATE]
  }
}

const mutations = {
  [NameSpace.AUTH_MUTATION]: (state, payload) => {
    state[NameSpace.AUTH_STATE] = payload
  }
}

const actions = {
  [NameSpace.ASYNC_AUTH_ACTION]: ({ commit }, payload) => {
    ParseService.login(payload.username, payload.password)
      .then((user) => {
        commit(NameSpace.AUTH_MUTATION, {auth: user, error: null})
      })
      .catch((error) => {
        commit(NameSpace.AUTH_MUTATION, {auth: [], error: error})
      })
  }

export default {
  state,
  getters,
  mutations,
  actions
}

店舗:

import Vue from 'vue'
import Vuex from 'vuex'
import authorization from './modules/authorization'

Vue.use(Vuex)

export const store = new Vuex.Store({
  modules: {         
    authorization    
  }                  
})                   

これまでにやったことは、authorization状態変数のAUTH_STATEプロパティを返す関数をエクスポートするjsファイルを作成することだけです。

テスト用のコンポーネント:

<template lang="html">
    <label class="login-label" for="username">Username
        <input class="login-input-field" type="text" name="username" v-model="username">
    </label>
    <label class="login-label" for="password" style="margin-top">Password
         <input class="login-input-field" type="password" name="username" v-model="password">
    </label>
    <button class="login-submit-btn primary-green-bg" type="button" @click="login(username, password)">Login</button>
</template>

<script>
import { mapActions, mapGetters } from 'vuex'
import * as NameSpace from '../../store/NameSpace'
import { getAuth } from '../../Services/test'

export default {
  data () {
    return {
      username: '',
      password: ''
    }
  },
  computed: {
    ...mapGetters({
      authStateObject: NameSpace.AUTH_GETTER
    }),
    authState () {
      return this.authStateObject.auth
    },
    authError () {
      return this.authStateObject.error
    }
  },
  watch: {
    authError () {
        console.log('watch: ', getAuth()) // ------------------------- [3]
      }
    },
    authState () {
      if (this.authState.sessionToken) {
        console.log('watch: ', getAuth()) // ------------------------- [2]
      }
    },
  methods: {
    ...mapActions({
      authorize: NameSpace.ASYNC_AUTH_ACTION
    }),
    login (username, password) {
      this.authorize({username, password})
      console.log(getAuth())             // ---------------------------[1]
    }
  }
}
</script>

ボタンをクリックすると、デフォルト状態がコンソールにログオンします。私の場合のアクションは、ユーザー名とパスワードの組み合わせにレコードがあった場合に、API呼び出しが行われ、状態が変化します。

成功した場合、authStateウォッチにコンソールが表示されます。インポートされた関数は、状態に加えられた変更を印刷できます。

同様に、失敗した場合、authErrorの監視は状態に加えられた変更を表示します

18

Javascriptファイルからミューテーションにアクセスする方法を知りたい場合は、次のことができます。

store.commit('mutation_name', mutation_argument);
0
Nic Scozzaro