Vue.js 访问存储或获取程序的状态_网页包\u导入的\u模块\u 3\u存储\uuuuuuuuuuuu.a.分派不是一个函数

Vue.js 访问存储或获取程序的状态_网页包\u导入的\u模块\u 3\u存储\uuuuuuuuuuuu.a.分派不是一个函数,vue.js,vue-router,vuex,Vue.js,Vue Router,Vuex,我试图验证用户是否经过身份验证,能够访问定向的路由,否则将重定向到登录路由,问题是我不知道如何在每次之前从我的执行fetchUser操作。换句话说,我无法从路由器脚本访问我的getter store.js import mutations from './mutations'; import actions from './actions'; import getters from './getters'; export default { state: { isLog

我试图验证用户是否经过身份验证,能够访问定向的路由,否则将重定向到登录路由,问题是我不知道如何在每次之前从我的
执行
fetchUser
操作。换句话说,我无法从路由器脚本访问我的getter

store.js

import mutations from './mutations';
import actions from './actions';
import getters from './getters';

export default {
    state: {
        isLoggedIn: !!localStorage.getItem("token"),
        user_data : localStorage.getItem("user_data"),
    },
    getters ,
    mutations,
    actions
}
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import routes from './rutas';
import store from '../store/';
const router = new VueRouter({
  mode : 'history',
  routes 
})

router.beforeEach((to, from, next) => {
   if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!store.getters.isLoggedIn)  {
            next({path: '/login'})
        }
        else {
            store.dispatch('fetchUser') // Line error
            next()
        }
    } 
    else {
        next() // make sure to always call next()!
    }
})
export default {
    isLoggedIn: state => {
        return state.isLoggedIn
    },
    user_name  : state =>{
        if(! _.isEmpty(this.user_data))
            return JSON.parse(state.user_data).name
        return '';
    },
    isEmptyUser : state =>{
        return  _.isEmpty(this.user_data);
    },
    isAdmin: state => {
        if(! _.isEmpty(this.user_data)) return state.user_data.nivel===1
        return false;
    }
}
 export default {
 /* more methods*/

 , async fetchUser({ commit }) {
    return await axios.post('/api/auth/me')
        .then(res => {   
            setTimeout(() => {
                localStorage.setItem("user_data", JSON.stringify(res.data)); 
                Promise.resolve(res.data); 
            }, 1000);             
        },
        error => {                  
            Promise.reject(error);          
        });
}
routes/index.js

import mutations from './mutations';
import actions from './actions';
import getters from './getters';

export default {
    state: {
        isLoggedIn: !!localStorage.getItem("token"),
        user_data : localStorage.getItem("user_data"),
    },
    getters ,
    mutations,
    actions
}
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import routes from './rutas';
import store from '../store/';
const router = new VueRouter({
  mode : 'history',
  routes 
})

router.beforeEach((to, from, next) => {
   if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!store.getters.isLoggedIn)  {
            next({path: '/login'})
        }
        else {
            store.dispatch('fetchUser') // Line error
            next()
        }
    } 
    else {
        next() // make sure to always call next()!
    }
})
export default {
    isLoggedIn: state => {
        return state.isLoggedIn
    },
    user_name  : state =>{
        if(! _.isEmpty(this.user_data))
            return JSON.parse(state.user_data).name
        return '';
    },
    isEmptyUser : state =>{
        return  _.isEmpty(this.user_data);
    },
    isAdmin: state => {
        if(! _.isEmpty(this.user_data)) return state.user_data.nivel===1
        return false;
    }
}
 export default {
 /* more methods*/

 , async fetchUser({ commit }) {
    return await axios.post('/api/auth/me')
        .then(res => {   
            setTimeout(() => {
                localStorage.setItem("user_data", JSON.stringify(res.data)); 
                Promise.resolve(res.data); 
            }, 1000);             
        },
        error => {                  
            Promise.reject(error);          
        });
}
getters.js

import mutations from './mutations';
import actions from './actions';
import getters from './getters';

export default {
    state: {
        isLoggedIn: !!localStorage.getItem("token"),
        user_data : localStorage.getItem("user_data"),
    },
    getters ,
    mutations,
    actions
}
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import routes from './rutas';
import store from '../store/';
const router = new VueRouter({
  mode : 'history',
  routes 
})

router.beforeEach((to, from, next) => {
   if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!store.getters.isLoggedIn)  {
            next({path: '/login'})
        }
        else {
            store.dispatch('fetchUser') // Line error
            next()
        }
    } 
    else {
        next() // make sure to always call next()!
    }
})
export default {
    isLoggedIn: state => {
        return state.isLoggedIn
    },
    user_name  : state =>{
        if(! _.isEmpty(this.user_data))
            return JSON.parse(state.user_data).name
        return '';
    },
    isEmptyUser : state =>{
        return  _.isEmpty(this.user_data);
    },
    isAdmin: state => {
        if(! _.isEmpty(this.user_data)) return state.user_data.nivel===1
        return false;
    }
}
 export default {
 /* more methods*/

 , async fetchUser({ commit }) {
    return await axios.post('/api/auth/me')
        .then(res => {   
            setTimeout(() => {
                localStorage.setItem("user_data", JSON.stringify(res.data)); 
                Promise.resolve(res.data); 
            }, 1000);             
        },
        error => {                  
            Promise.reject(error);          
        });
}
actions.js

import mutations from './mutations';
import actions from './actions';
import getters from './getters';

export default {
    state: {
        isLoggedIn: !!localStorage.getItem("token"),
        user_data : localStorage.getItem("user_data"),
    },
    getters ,
    mutations,
    actions
}
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import routes from './rutas';
import store from '../store/';
const router = new VueRouter({
  mode : 'history',
  routes 
})

router.beforeEach((to, from, next) => {
   if (to.matched.some(record => record.meta.requiresAuth)) {
        if (!store.getters.isLoggedIn)  {
            next({path: '/login'})
        }
        else {
            store.dispatch('fetchUser') // Line error
            next()
        }
    } 
    else {
        next() // make sure to always call next()!
    }
})
export default {
    isLoggedIn: state => {
        return state.isLoggedIn
    },
    user_name  : state =>{
        if(! _.isEmpty(this.user_data))
            return JSON.parse(state.user_data).name
        return '';
    },
    isEmptyUser : state =>{
        return  _.isEmpty(this.user_data);
    },
    isAdmin: state => {
        if(! _.isEmpty(this.user_data)) return state.user_data.nivel===1
        return false;
    }
}
 export default {
 /* more methods*/

 , async fetchUser({ commit }) {
    return await axios.post('/api/auth/me')
        .then(res => {   
            setTimeout(() => {
                localStorage.setItem("user_data", JSON.stringify(res.data)); 
                Promise.resolve(res.data); 
            }, 1000);             
        },
        error => {                  
            Promise.reject(error);          
        });
}
这将在控制台中返回错误:

_网页包\u导入的\u模块\u 3\u存储\uuuuuuuuuuuu.a.分派不是一个函数


我该怎么做,或者方法是错误的,我不应该直接访问操作?

问题是您的
存储区
不是实际的存储区对象,它只是用于生成它的对象

解决方案是将文件导出到实际存储:

从“Vue”导入Vue;
从“Vuex”导入Vuex;
从“./突变”导入突变;
从“/actions”导入操作;
从“/getter”导入getter;
Vue.use(Vuex);//加在这里
导出默认的新Vuex.Store({//此处已更改
声明:{
isLoggedIn:!!localStorage.getItem(“令牌”),
用户数据:localStorage.getItem(“用户数据”),
},
获得者,
突变,
行动
})//这里变了
现在你的路由器代码可以工作了

您还必须注意的是,可能在main.js中的某个地方,您已经像上面那样初始化了存储。例如:

从“../store/”导入存储;
新Vue({
门店:新Vuex.门店(门店),
// ...
})
现在,您必须删除该初始化并直接使用存储:

从“../store/”导入存储;
新Vue({
store:store,//或干脆store
// ...
})

所有这些都应该是好的。

在Vue实例中,我有
存储:new Vuex.store(store)
,如前所述,但在创建存储实例之前,我会收到错误调用Vue.use(Vuex)。如果我执行典型的
Vue.use(Vuex)
操作,我得到的错误是getters应该是函数,但“getters.isLoggedIn”是真的。您可以将getters声明粘贴到问题中吗?在更改之前,您是否收到该错误?一切都很好,但是路由器,以前?现在很好,只是一个简短的问题,是否可以在mapState中添加getter?我现在在数据中添加了一个新字段,并抓取
username:this.$store.getters.user\u name,
我假设您使用
mapState
从状态创建计算属性。类似地,您可以使用
mapGetters
从getter创建计算属性。是这样吗?