javascript - 如何从 javascript 文件(而不是 vue 组件)获取 vuex 状态

标签 javascript vue.js vue-component vuejs2 vuex

我正在使用 vuex (2.1.1) 并在 vue 单文件组件中工作。但是,为了避免在我的 vue 单文件组件中出现过多的问题,我将一些函数移到了 utils.js 模块中,并将其导入到 vue 文件中。在这个 utils.js 中,我想读取 vuex 状态。我怎样才能做到这一点?似乎使用 getters 等接近状态是假设您是在 vue 组件内工作,还是不是?

我尝试从 '../store/modules/myvuexmodule' 导入状态 然后引用 state.mystateproperty 但它总是给出 'undefined',而在vue-devtools 我可以看到 state 属性确实有正确的值。

我目前的估计是,这根本不是“要走的路”,因为 js 文件中的 state.property 值不会 react ,因此不会更新或其他东西,但也许有人可以确认/证明我错了。

最佳答案

可以在外部 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 文件,该文件导出一个返回 authorization 状态变量的 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 watch 中显示控制台,导入的函数可以打印对状态所做的更改。

同样,在失败的情况下,authError 上的监视将显示对状态所做的更改

关于javascript - 如何从 javascript 文件(而不是 vue 组件)获取 vuex 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41534412/

相关文章:

javascript - 防止绝对定位的 div 在不禁用滚动条的情况下吞噬点击事件

javascript - 图像立方体动画不工作

javascript - 在 Elixir Phoenix 1.3 应用程序的 .vue 文件中使用扩展运算符时出现语法错误

vue.js - 在页面加载时根据vue js中的父高度设置元素高度

javascript - vuejs全局注册组件

javascript - 同一页面上的相同 Vue 组件两次重复组件 View

php - 为什么我的表单在忽略弹出警报时提交

javascript - 未呈现 AngularJS 指令

vue.js - npm run build 生成错误的路径

javascript - Vue js 具有相同值的复选框