iT邦幫忙

0

【Vue 】進入首頁時,抓不到route meta的問題

大家好,
我遇到一個麵包屑的問題。
麵包屑,我寫在router/indes.js裡

//router/indes.js
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
  {
    // index
    path: '/',
    name: 'Home',
    component: () => import(/* webpackChunkName: "Home" */ '../Home.vue'),
    meta: {
      breadcrumb: [{
        name: '首頁'
      }]
    }
 },
 {
    path: '/:pathMatch(.*)*',
    redirect: '/'
  }
]
const router = createRouter({
  // 根據指定架站位置的資料夾
  history: createWebHistory('/wifi/'),
  routes
})

export default router
//template(給予字體變色的判斷式)
<template>
  <div class="flex items-center w-full h-10 px-4 bg-gray-200 text-sm">
      <ul class="flex">
          <li class="m-auto text-blue-basic cursor-pointer">
            <router-link to="/">
              <svg class="stroke-current w-3.5 h-3.5 text-blue-basic" fill="#E5E7EB
" stroke-width="4" viewBox="0 0 41 44">
                <!-- glyph stroked home -->
                <path d="M42.723 23.448l-21-22-21 22"></path>
                <path d="M5.723 18.448v24h11v-16h10v16h11v-24"></path>
              </svg>
            </router-link>
          </li>
          //這裡是onClick跟v-for
          <li v-for="(breadcrumb, index) in breadcrumbList" :key="index" @click="routeTo(index)" :class="{'linked': !!breadcrumb.link}">
              <span class="mx-2 text-gray-300">/</span>
              <span class="text-gray-400  cursor-default" v-if="index == breadcrumbList.length-1">
                {{ breadcrumb.name }}
              </span>
              <span class="text-blue-basic cursor-pointer" v-else>
                <span>{{ breadcrumb.name }}</span>
              </span>
          </li>
      </ul>
  </div>
</template>

遇到一個問題,就是相同寫法,
在CompositionAPI裡,剛開啟首頁時,無法顯示麵包屑(進入分頁後都正常)。

//CompositionAPI
<script setup>
  import {ref,watch} from 'vue'
  import { useRouter, useRoute } from 'vue-router'
  const router = useRouter()
  const route = useRoute()
 
  //建立麵包屑Array
  const breadcrumbList= ref([])
  const updateList =function () { 
      breadcrumbList.value = route.meta.breadcrumb 
  }
  updateList() 
  console.log( route.meta.breadcrumb) //顯示undefined
  //改變route時
  watch(()=>route.fullPath,()=>{
    breadcrumbList.value = route.meta.breadcrumb
  })

  //onClick 麵包屑li
  const routeTo = function(pRouteTo){
    if (route.meta.breadcrumb[pRouteTo].link){ 
        router.push(route.meta.breadcrumb[pRouteTo].link)
    }
  }
</script>


用console.log(route.meta.breadcrumb),去抓取meta,顯示undefined
但是用Options API,剛開啟首頁時,卻可以顯示麵包屑。

//Options API
<script>
export default {
    name:'Breadcrumb',
    data(){
        return{
          breadcrumbList: [],
        }
    },
    mounted () {
      this.updateList() 
    },
    watch: { 
        '$route' () { 
          this.updateList()
        }
    },
    methods: {
        routeTo (pRouteTo) {
            if (this.breadcrumbList[pRouteTo].link) this.$router.push(this.breadcrumbList[pRouteTo].link)
        },
        updateList () { this.breadcrumbList = this.$route.meta.breadcrumb }
    }
}
</script>

-------------更新----------------
【已解決】

所以main.js裡面要修改成

//使用router.isReady()
const app = createApp(App)
app.use(router)
router.isReady().then(()=>app.mount(‘#app’))
froce iT邦大師 1 級 ‧ 2021-11-16 16:17:04 檢舉
我建議你可以實驗看看,直接用其他route試試看會不會有同樣狀況
我猜一開始進去,是由後端接管routing,等到vue實例都完成後,routing才由前端接管。

你該做的應該是在頁面初始化的時候,先判斷一次當前path,然後更新到麵包屑上。
greenriver iT邦研究生 5 級 ‧ 2021-11-17 10:42:27 檢舉
謝謝給我方向,終於找到為什麼了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2021-11-16 16:47:42
最佳解答

你可以試試先不要宣告為 const 試試。
雖然看你是用物件的方式,理論上因該不是這個問題才對。

不過你取值的部份我不確定是否是後端取值。
如果是後端取值的話。要很小心非同步應用的問題。

我當初也想做成後端推路由處理。但就是一直搞不定。
後來改成前端先規劃好路由表,再由後端送值過來判斷處理要不要用。
這樣就沒事。

當然,如果有人知道怎麼利用後端推路由值過來給前端用的話。希望借題發揮一下。
目前還在用上面的笨方式處理。

greenriver iT邦研究生 5 級 ‧ 2021-11-17 10:42:42 檢舉

感謝幫忙~

我要發表回答

立即登入回答