javascript - 在Vue JS项目中使用Vuex出现错误 "TypeError: this.$state is undefined"

标签 javascript vue.js vuex

目标是从 Firebase 对用户进行身份验证并使用 Vuex 存储状态,当打开应用程序时,我使用状态来了解用户是否已登录,并将其用于更多操作。 我需要获得一个状态来填充 App.vue 文件上的 data() 方法上的变量,但它显然没有获得正确的引用。页面加载时出现以下错误:

[Vue warn]: Error in data(): "TypeError: this.$state is undefined"
found in

---> <App> at src/App.vue
       <Root>

[Vue warn]: Property or method "isLoggedIn" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://v2.vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

found in

---> <App> at src/App.vue
       <Root>

App.vue

<template>
  <v-app>
    <router-view v-if="isLoggedIn"></router-view>
    <login v-else />
  </v-app>
</template>

<script>
import login from "@/views/Login";

export default {
  name: "App",
  components: {
    login
  },
  data() {
    return {
      isLoggedIn: this.$state.getters.user != null
    };
  }
};
</script>

<style>
</style>

store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    status: null,
    error: null
  },
  mutations: {
    setUser(state, payload) {
      this.user = payload
    },

    removeUser(state) {
      this.user = null
    },

    setStatus(state, payload) {
      this.status = payload
    },

    setError(state, payload) {
      this.error = payload
    }
  },
  actions: {
    setUserAction({ commit }, payload) {
      commit('setUser', payload)
      commit('setStatus', 'success')
      commit('setError', null)
    }

  },
  modules: {
  },
  getters: {
    status(state) {
      return state.status
    },

    user(state) {
      return state.user
    },

    error(state) {
      return state.error
    }
  }
})

最佳答案

你应该已经有这样的东西来初始化 vue 和 vuex

import Vue from 'vue'
import App from './App' // src/App.vue
import store from './store' // store/index.js

Vue.use(store)

new Vue({ store, render: h => h(App) }).$mount('#app') // notice the "store" attribute here

所以在组件中,它应该在 this.$store.state

中可用

而且,正如 @skirtle 所指出的,如果你希望它与 vuex react ,请使用计算

computed: {
  isLoggedIn () {
     return  this.$store.getters.user != null // remove .state
     // or you can use the state directly
     // return  this.$store.state.user != null
  }
}

在 vuex 中,您应该通过突变来更改状态。我看到你已经有 setUser

setUser(state, payload) {
  state.user = payload // change this.user to state.user
},

然后您可以使用 this.$store.commit('setUser', this.user) 更改组件中的状态

我看到您已经执行了一个操作 setUserAction 来进行 3 次提交,因此您可以在组件中使用 this.$store.dispatch('setUserAction', this.user 来调用它)

关于javascript - 在Vue JS项目中使用Vuex出现错误 "TypeError: this.$state is undefined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59761944/

相关文章:

javascript - 使用来自 JSON 数据的不同值,而不是使用 Typeahead 的 displayKey

javascript - 递归调用异步 API 调用

javascript - VueJS 使用 prop 作为数据属性值

javascript - 让 Vue 在对象更新时进行更新

javascript - vuex:未知 setter/getter :用户

javascript - 为什么 key 是 for ... in 中的字符串

javascript - 如何使用 HTML 5 实现类似文件上传/附件的 gmail

reactjs - EmberJS 中的 Vuex/Redux 等价物是什么?

javascript - 如何在VUE组件的Scoped区域中使用JSON数据

javascript - 如何在 VueJS test-utils parentComponent 中模拟 Vuex 商店