外部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
}
})
これまでのところ私が行っているすべてのJSファイルを作成しています状態変数のAUTH_STATE
プロパティを返す関数をエクスポートします。テストのための
コンポーネント:ボタンをクリックし、デフォルトの状態で
<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
上の時計は、私はあなたのファイルを参照してくださいカントとして十分に理解しないが、vue.use(vuex)は、すべてのVUEにvuexを加算
状態に加えられた変更を表示しますコンポーネント。あなたのutils.jsがアクセス権を持っていないのは、これが原因かもしれません。私は、外部関数をアクションの一部にすることを可能にしました。これは引数として状態を取り、突然変異の値を返します。 –
「一般的な問題」であるため、デモファイルはありません。そしてはい、私はvueファイル内でこれを解決する方法を知っていますが、私の質問は 'jsファイルで状態を取得する方法'です。あなたの「解決策」は私には分かりません。 vueファイル内の状態に近づいているようです(「外部機能」を使用して)。しかし、私は(可能であれば)jsファイル内からvue状態に近づけたいと思っています。 – musicformellons
はい、私は外部から状態を変更したくないです。あなたは、あなたがどのような仕事をしているのかを知ることができますか?私が強く感じるのは、vuexの動作や変異を使用すると、vuexストアの外部に状態を取得する必要性がなくなります。 –