Nuxt3 嵌套路由用法 日常记录

我现在有一个页面需要使用嵌套路由 我需要先在pages下面新建一个 主页面的vue文件
暂时起名 about.vue

使用嵌套路由 他有两个子路由 分别是 join connect

需要在pages 下新建 about同名文件夹 nuxt会自动扫描并注册到路由中
在about文件夹下 还需要一个index.vue文件作为默认子路由
那么基本文件如下

需要在⭐about.vue中放置路由出口组件 这里直接使用nuxt提供的组件

<NuxtPage :page-key="route => route.fullPath" />

访问路由/about/join 即可查看到主页面和join组件中的内容了

### Nuxt3 路由缓存解决方案 在 Nuxt 3 中,可以通过 `keep-alive` 实现页面路由的缓存功能。以下是详细的配置方法以及注意事项: #### 配置步骤 1. **修改 `App.vue` 文件** 在项目的根组件文件 `App.vue` 中,通过 `<NuxtPage>` 组件启用 `keepalive` 属性。这一步是为了全局支持页面级别的缓存[^2]。 ```vue <template> <NuxtLayout> <NuxtPage keepalive /> </NuxtLayout> </template> ``` 2. **定义页面元信息** 对于需要缓存的具体页面,在其 `<script setup>` 块中调用 `definePageMeta` 方法,并设置 `keepalive: true`。这样可以指定哪些页面会被缓存[^2]。 ```vue <script setup lang="ts"> definePageMeta({ keepalive: true, }); </script> <template> <!-- 页面内容 --> </template> ``` 3. **高级选项:自定义缓存策略** 如果希望更精细地控制哪些页面被缓存或者排除某些页面,则可以在 `keep-alive-props` 上进行扩展配置[^5]。例如: ```vue <NuxtPage :keep-alive-props="{ max: 10, include: [&#39;page-a&#39;, &#39;page-b&#39;] }" /> ``` - `max`: 设置最大缓存数量。 - `include/exclude`: 显式声明需要或不需要缓存的页面名称。 4. **处理动态参数更新场景** 当涉及动态路由参数变化时(如 `/item/:id`),默认情况下即使 URL 参数改变也不会触发页面刷新。此时可通过监听 `$route.query` 或者 `$route.params` 的变化来手动执行逻辑[^4]。 ```javascript import { watch } from &#39;vue&#39;; import { useRoute } from &#39;vue-router&#39;; const route = useRoute(); watch( () => route.params.id, (newId, oldId) => { console.log(`ID changed from ${oldId} to ${newId}`); fetchData(newId); // 手动加载新数据 } ); ``` --- ### 注意事项 - 确保使用的 Nuxt 版本不低于 3.8.2,因为早期版本可能存在一些关于 `keep-alive` 的 bug[^1]。 - 若遇到缓存未生效的情况,请检查是否有其他插件干扰了 Vue 生命周期行为;另外确认是否正确设置了 `definePageMeta` 和 `keep-alive-props`[^5]。 - 使用多层嵌套动态路径设计时需注意匹配规则可能影响最终效果。 --- ### 示例代码 以下是一个完整的例子展示如何在一个列表页和详情页之间切换并保留状态: ```vue <!-- App.vue --> <template> <NuxtLayout> <NuxtPage keepalive /> </NuxtLayout> </template> ``` ```vue <!-- pages/list.vue --> <script setup lang="ts"> definePageMeta({ keepalive: true, }); </script> <template> <div>这里是列表页</div> </template> ``` ```vue <!-- pages/detail/[id].vue --> <script setup lang="ts"> import { onMounted, ref, watch } from &#39;vue&#39;; import { useRoute } from &#39;vue-router&#39;; const route = useRoute(); const data = ref(null); onMounted(() => fetch(route.params.id)); watch( () => route.params.id, async newId => await fetch(newId), ); async function fetch(id) { data.value = await apiCallForData(id); } </script> <template> <div>{{ data }}</div> </template> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值