iT邦幫忙

1

【已解決】在vue router裡要如何抓store的資料,給路由守衛去判斷?

  • 分享至 

  • xImage

大家好,
想請教各位大大,
我想做會員系統權限判別的功能。
(1)在進入頁面之前,先判別有無登入會員(token)。
(2)沒有,就轉址到login
(3)然後再判別,有無此頁的觀看權限,沒有,就轉址

我會將token跟權限,暫存在store裡,
問題是要如何在router/index.js裡抓到store/index.js裡的資料?

//store/index.js裡的資料
export default createStore({
    state(){
        return{
            resData:{
               //使用者資料
                permit:'',//是"1,2,3"的字串
                token: ''
            }
        }
    }
})
//router/index.js
import { createRouter,createWebHashHistory  } from 'vue-router'
import store from '../store/index'

const routes = [......]
const router = createRouter({
  history: createWebHashHistory(),
  routes
})
router.beforeEach((to)=>{
  let token = store.state //有token跟permit的資料
  let token2 = store.state.resData.token //沒資料,是空白
  let permit = store.state.resData.permit//沒資料,是空白
  console.log(token)
  console.log(token2)
  console.log(permit)
})
export default router

我遇到的問題是let token = store.state,然後console.log(token)會有資料,
但是console.log(token2)console.log(permit)卻沒有資料。
該怎麼辦呢?
--------已解決-------------
是生命週期的關係。router的生命週期比store還前面,所以抓不到值。
這是我測試的結果,可以參考。雖然很亂..
/images/emoticon/emoticon16.gif

解決方法,就是在store/index.js裡面去動態抓domain

//store/index.js
import { createStore } from "vuex";
//這裡
var hostDomain = window.location.protocol + "//" + window.location.host;

export default createStore({
    state(){
        return{
            testGetIP:{
                //這裡
                domain:hostDomain
            }
        }
    },
    .....
})

然後就能在其他元件裡使用了。

//App.vue
<script setup>
    import axios from 'axios';
    import { computed } from 'vue';
    import { useStore } from "vuex";
    const store = useStore();
    //這裡
    const domain = computed(()=>store.state.testGetIP.domain)
     //這裡
  axios.post(`${domain}/aaa/test.php`)
  .then((res)=>{
      console.log('我是APP axios的then',res.data);
  }).catch((error)=>console.log('error'))
</script>

---更新---
如果router/index.js裡有import store/index.js

//router/index.js
import { createRouter,createWebHashHistory  } from 'vue-router'
import store from '../store/index'
....

那生命週期就會變成 store->router->main.js->App.vue setup!!!!

---再更新---
如果在main.js裡使用router.isReady(),那生命週期又會變!!!!!
/images/emoticon/emoticon06.gif

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
//原本的
// createApp(App).use(store).use(router).mount('#app')
//改成下面
const app = createApp(App)
app.use(router)
router.isReady().then(()=>app.use(store).mount('#app'))

生命週期會變成router->store->main.js->router.beforeEach()->router.afterEach()->App.vue setup!!!!!!

請問 console.log(token) 輸出結果是什麼呢?
console.log(token2) 沒資料是報錯還是空值呢
greenriver iT邦研究生 4 級 ‧ 2022-02-25 14:30:14 檢舉
是空值XD
greenriver iT邦研究生 4 級 ‧ 2022-02-25 14:32:53 檢舉
阿,我這個空值的問題,不是生命週期的問題。應該是兩個JS檔,"import"的問題。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
s3622170
iT邦新手 5 級 ‧ 2022-03-01 23:31:47

/images/emoticon/emoticon01.gif

我要發表回答

立即登入回答