【问题标题】:Getting error "TypeError: this.$state is undefined" using Vuex on VueJS project在 Vue JS 项目中使用 Vuex 得到错误“TypeError: this.$state is undefined”
【发布时间】:2020-05-02 20:12:02
【问题描述】:

目标是从 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://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
    }
  }
})

【问题讨论】:

  • 你的意思是this.$store而不是this.$state
  • 是的@skirtle,它奏效了。但是 上没有加载新页面
  • 如果您希望它在state.user 更改时更新,您应该使用computed 属性而不是data 属性。
  • 我改成了computed: { checkIsLoggedIn() { console.log(this.$store.getters.user); return this.$store.getters.user != null; } }&lt;router-view v-if="checkIsLoggedIn"&gt;&lt;/router-view&gt;。但不起作用
  • @Augusto by "not works",现在的错误是什么?它应该从“类型错误,此状态未定义”更改

标签: javascript vue.js vuex


【解决方案1】:

你应该已经有了这样的东西来初始化 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 反应,请使用计算

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) 在组件中调用它

【讨论】:

  • Login页面状态改变后,isLoggedIn方法不会被调用。
  • 在登录组件上我从 this.$store.dispatch("setUserAction", user); 更改为 this.$store.state.user = user 并且代码运行良好 =)
  • @Augusto 您是否肯定 vuex 状态用户已从 null 更改?我想不出任何其他问题。
  • @Augusto 不,不要直接改变状态,你应该使用 dispatch 或 commit
  • @Augusto 是的,要更改状态,您可以使用 commit 发送操作,或者您可以直接使用 this.$store.commit('mutation_name', payload) 提交,但不要在没有突变的情况下更改状态。
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2019-05-29
  • 2021-07-04
  • 2021-03-11
相关资源
最近更新 更多