🛣️
Nuxt 3 でnested routesにactive-classが適用されないのを解決しました
やりたかったこと
サイドメニューがあって、選んだメニューに遷移した時に、選択部分の色を変えるということがやりたかったです。
Vue Routerの機能でactive-class
を指定すると簡単に実現できるのですが、そこから1つ下の階層ページに遷移するとなぜかactive-class
が外れてしまいました。
/tasks
ページでは色が変わるけれど、/tasks/1
ページでは変わらないという状態です。
また、パスパラメータの値(上の例では1
)を取得することもできませんでした。
const route = useRoute()
const { id } = route.params
直接/tasks/1
のURLを表示すると、取得できるのですが、/tasks
からnavigateTo
で遷移すると取得できませんでした。
結論
このstackoverflowの記事が役に立ちました。
ドキュメントのNested Routes
にある様に、親階層のvueファイルが必要になります。
いままで
-| pages/
---| tasks/
------| [id].vue
------| index.vue
としていたのですが、
正しくはこうでした。
-| pages/
---| tasks/
------| [id].vue
------| index.vue
---| tasks.vue <--- これが必要!
tasks.vue
は何をしているかというと、
<template>
<NuxtPage />
</template>
こんな感じで、単純にNuxtPage
をラップしているだけです。
あくまで表示しているのはpages/tasks.vue
で、その中にpages/tasks/[id].vue
を埋め込んで表示しているということみたいです。
そう考えると理解できなくもないのですが、pages/tasks.vue
がない状態で、pages/tasks/[id].vue
だけでも表示できてしまうので混乱しました。
この対応をすることで、active-class
の表示と、パスパラメータのID取得ができる様になりました。
よくわからずハマってしまったので誰かの助けになれば幸いです。
Discussion