无法访问 Vuex 模块 Getter - 无法读取未定义的 属性 'getters'”
Can't access Vuex Module Getter - Cannot read property 'getters' of undefined"
出于某种原因,我无法访问商店 getter。
文件结构:
/store/index.js
/store/modules/auth.js
store/index.js
import Vuex from 'vuex';
import Vue from 'vue';
import auth from './modules/auth';
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
auth
}
});
auth.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state: {
token: '',
status: ''
},
mutations: {},
actions: {
[AUTH_REQUEST]: ({ commit }, {username, password}) => {
return new Promise((resolve, reject) => {
commit(AUTH_REQUEST)
axios({ url: 'authenticate', data: {username, password}, method: 'POST' })
.then(resp => {
const token = resp.data.token
commit(AUTH_SUCCESS, token)
resolve(resp) // router.push in login vue
})
.catch(err => {
commit(AUTH_ERROR, err)
reject(err)
})
})
}
},
getters: {
isAuthenticated: state => !!state.token,
authStatus: state => state.status
}
})
App.vue
...
<v-app-bar-nav-icon @click="drawer = !drawer" v-if="this.authenitcated">
...
computed: {
...mapGetters({authenitcated: 'isAuthenticated'})
}
我已经尝试了一些变体,包括命名空间 getters,但还没有找到它不起作用的原因。
按照本教程的代码,除了商店的实现方式外,一切看起来都一样。本教程使用略有不同的 JS。
https://www.youtube.com/watch?v=5lVQgZzLMHc&t=2686s
堆栈跟踪
TypeError: Cannot read property 'getters' of undefined
at VueComponent.mappedGetter (webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:930)
at Watcher.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4473)
at Watcher.evaluate (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4578)
at VueComponent.computedGetter [as authenitcated] (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4828)
at Object.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:2071)
at Proxy.render (eval at ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"64b49ba3-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vuetify-loader/lib/loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90& (app.js:1031), <anonymous>:16:16)
at VueComponent.Vue._render (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:3542)
at VueComponent.updateComponent (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4060)
at Watcher.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4473)
at new Watcher (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4462)
谢谢
几件事:
如果您像在 auth.js
中那样导出商店,您可能必须像这样导入它:
import * as auth from './auth';
我认为它会在此处自动为您的 Auth-Store 创建一个命名空间,因此通常您会像这样访问它:
...mapGetters({
whatever: 'auth/isAuthenticated',
}),
但是,如果您没有其他商店有 isAuthenticated
getter,那应该没问题。
为什么还要费心将它重新分配给 App.vue
中的 'fake-name' authenitcated
。
你可以简单地:
...mapGetters([
'auth/isAuthenticated',
// ...
])
并通过this.isAuthenticated
访问它。
出于某种原因,我无法访问商店 getter。
文件结构:
/store/index.js
/store/modules/auth.js
store/index.js
import Vuex from 'vuex';
import Vue from 'vue';
import auth from './modules/auth';
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
auth
}
});
auth.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
export default new Vuex.Store({
state: {
token: '',
status: ''
},
mutations: {},
actions: {
[AUTH_REQUEST]: ({ commit }, {username, password}) => {
return new Promise((resolve, reject) => {
commit(AUTH_REQUEST)
axios({ url: 'authenticate', data: {username, password}, method: 'POST' })
.then(resp => {
const token = resp.data.token
commit(AUTH_SUCCESS, token)
resolve(resp) // router.push in login vue
})
.catch(err => {
commit(AUTH_ERROR, err)
reject(err)
})
})
}
},
getters: {
isAuthenticated: state => !!state.token,
authStatus: state => state.status
}
})
App.vue
...
<v-app-bar-nav-icon @click="drawer = !drawer" v-if="this.authenitcated">
...
computed: {
...mapGetters({authenitcated: 'isAuthenticated'})
}
我已经尝试了一些变体,包括命名空间 getters,但还没有找到它不起作用的原因。 按照本教程的代码,除了商店的实现方式外,一切看起来都一样。本教程使用略有不同的 JS。 https://www.youtube.com/watch?v=5lVQgZzLMHc&t=2686s
堆栈跟踪
TypeError: Cannot read property 'getters' of undefined
at VueComponent.mappedGetter (webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:930)
at Watcher.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4473)
at Watcher.evaluate (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4578)
at VueComponent.computedGetter [as authenitcated] (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4828)
at Object.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:2071)
at Proxy.render (eval at ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"64b49ba3-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vuetify-loader/lib/loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=template&id=7ba5bd90& (app.js:1031), <anonymous>:16:16)
at VueComponent.Vue._render (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:3542)
at VueComponent.updateComponent (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4060)
at Watcher.get (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4473)
at new Watcher (webpack-internal:///./node_modules/vue/dist/vue.runtime.esm.js:4462)
谢谢
几件事:
如果您像在 auth.js
中那样导出商店,您可能必须像这样导入它:
import * as auth from './auth';
我认为它会在此处自动为您的 Auth-Store 创建一个命名空间,因此通常您会像这样访问它:
...mapGetters({
whatever: 'auth/isAuthenticated',
}),
但是,如果您没有其他商店有 isAuthenticated
getter,那应该没问题。
为什么还要费心将它重新分配给 App.vue
中的 'fake-name' authenitcated
。
你可以简单地:
...mapGetters([
'auth/isAuthenticated',
// ...
])
并通过this.isAuthenticated
访问它。