Vuex getter는 항상 null을 반환합니다.
vue.js 구성 요소에서 vuexgetter를 사용하면 null을 반환합니다.
여기 제 코드가 있습니다.
기본 레이아웃.가치관
<script>
import NavBar from '@/components/NavBar.vue'
import ToolBar from "@/components/ToolBar"
import { mapActions, mapGetters } from 'vuex'
export default {
name: "MainLayout",
components : {
ToolBar, NavBar
},
data: () => ({
drawer: null,
}),
computed: {
...mapGetters([
'error',
]),
},
methods: {
close() {
this.$store.commit('SET_ERROR', null)
},
}
}
</script>
<template>
<div id="main">
<v-navigation-drawer clipped v-model="drawer" app>
<nav-bar></nav-bar>
</v-navigation-drawer>
<tool-bar @toggleDrawer="drawer = !drawer"/>
<v-content>
<v-container class="fill-height" fluid>
<router-view></router-view>
</v-container>
</v-content>
<v-snackbar :timeout="0" :value="error">
{{ error }}
<v-btn color="red" text @click="close">
Close
</v-btn>
</v-snackbar>
</div>
</template>
<style scoped>
</style>
여기는 NavBar입니다.가치관
<script>
import { mapGetters } from 'vuex'
export default {
data: () => ({
}),
computed: {
...mapGetters([
'authUser'
]),
isAdmin() {
return this.authUser.role.name == 'admin'
},
}
}
</script>
Vuex 모듈 auth.js
import api from '@/api'
import {clearAccessToken, setAccessToken} from '@/auth'
import router from '@/router'
const state = {
loading: null,
user: null
}
const mutations = {
SET_LOADING: (state, loading) => {
state.loading = loading
},
SET_USER: (state, user) => {
state.user = user
}
}
const getters = {
loading: state => {
return state.loading
},
loggedIn: (state) => {
return !!state.user
},
authUser: (state) => {
return state.user
},
}
const actions = {
async login({commit, dispatch }, user) {
commit('SET_LOADING', true)
try {
const data = await api.post('/api/auth/login', { user })
setAccessToken(data.token)
await dispatch('getUser')
commit('SET_LOADING', false)
router.push('/')
} catch (e) {
commit('SET_LOADING', false)
dispatch('handleError', e)
}
},
async getUser({commit, dispatch}) {
try {
const user = await api.get('/api/auth/user')
commit('SET_USER', user.data)
return user
} catch (e) {
clearAccessToken()
dispatch('handleError', e)
}
},
async logout({commit, dispatch}) {
try {
await api.post('/api/auth/logout')
clearAccessToken()
router.push('/login')
} catch(e) {
dispatch('handleError', e)
}
}
}
export default {
namespaced: false,
state,
getters,
actions,
mutations,
}
이 코드를 실행하면 다음 오류가 발생합니다.
[Vue warn]: Error in render: "TypeError: Cannot read property 'role' of null"
하지만 코드를 추가하면,
isAdmin() {
return this.authUser.role.name == 'admin'
},
ToolBar 구성 요소(및 NavBar에서 제거)에서
<script>
import { mapGetters } from 'vuex'
export default {
methods: {
toggleDrawer () {
this.$emit('toggleDrawer')
},
logout() {
this.$store.dispatch('logout')
}
},
computed: {
...mapGetters([
'loggedIn',
'authUser'
]),
fullName() {
return this.authUser.first_name + ' ' + this.authUser.last_name
},
isAdmin() {
return this.authUser.role.name == 'admin'
}
},
}
</script>
그러면 오류 없이 정상적으로 작동하므로 여기서 무엇이 문제인지 알 수 없습니다. 한 구성 요소에서는 코드가 정상적으로 작동하고 다른 구성 요소에서는 정상적으로 작동하지 않습니다. 또한 메인 레이아웃 구성 요소에 추가하여 전달해도 마찬가지입니다.isAdmin
소품으로도 사용할 수 있습니다.이걸 고치는 걸 도와주세요.
또한 라우터 후크에 사용자를 배치합니다.
router.beforeEach(async(to, from, next) => {
const needAuth = to.matched.some(record => record.meta.auth)
function redirectToLogin() {
next({
path: '/login',
query: { redirect: to.fullPath },
})
}
if (!hasToken() && needAuth) {
return redirectToLogin()
}
if (hasToken() && !store.getters.loggedIn) {
try {
const user = await store.dispatch('getUser')
if (!user) {
return redirectToLogin()
}
} catch(e) {}
}
next()
})
당신은 당신의 접근을 보호해야 합니다.authUser
와 함께loggedIn
.예를들면
isAdmin() {
return this.loggedIn && this.authUser.role.name == 'admin'
}
언급URL : https://stackoverflow.com/questions/58105680/vuex-getter-always-return-null
'programing' 카테고리의 다른 글
레일 4: 사용 가능한 데이터 유형 목록 (0) | 2023.06.09 |
---|---|
python/matplotlib을 사용하여 3D 플롯에 대한 "카메라 위치"를 설정하는 방법은 무엇입니까? (0) | 2023.06.09 |
텍스트 상자가 활성화되면 내용을 선택하는 방법은 무엇입니까? (0) | 2023.06.09 |
인덱스 변수 없이 N번 무언가를 하는 파이썬적인 방법? (0) | 2023.06.04 |
소스에서 R 패키지를 설치하려면 어떻게 해야 합니까? (0) | 2023.06.04 |