如何在Quasar应用中当groupId变更时重新执行preFetch?
解决Quasar preFetch在路由参数变化时不重新执行的问题
Quasar的preFetch默认仅在组件首次挂载时执行,当你在同一个GroupLayout组件下切换不同的:groupId参数时,组件会被复用而非重新创建,因此preFetch不会自动触发。要实现参数变化时重新获取群组数据,你可以通过以下方式处理:
方法:使用beforeRouteUpdate路由守卫
beforeRouteUpdate是Vue Router提供的守卫,会在路由参数更新但组件复用时触发。你可以在这个守卫里执行与preFetch相同的数据获取逻辑,覆盖参数变化的场景。
代码修改示例
首先抽离公共的群组数据获取逻辑,避免重复代码:
import { defineComponent, h, resolveComponent } from 'vue'; import { preFetch } from 'quasar/wrappers'; import useGroupStore from '@/stores/groups'; import { isError } from '@/boot/axios'; import { StatusCodes } from 'http-status-codes'; // 抽离公共逻辑,复用preFetch和beforeRouteUpdate中的代码 const fetchGroupData = async (store, route, callback) => { const groupStore = useGroupStore(store); const groupId = route.params.groupId ? route.params.groupId as string : route.params.groupSlug as string; try { await groupStore.getActiveGroup(groupId); callback(); } catch (e) { if (isError(e, StatusCodes.NOT_FOUND)) { callback({ path: '/not-found' }); } else { callback(); // 其他错误情况正常跳转 } } }; export default defineComponent({ name: 'GroupNavigationLayout', preFetch: preFetch(async ({ store, currentRoute, redirect }) => { await fetchGroupData(store, currentRoute, redirect); }), // 添加路由守卫处理参数变化 async beforeRouteUpdate(to, from, next) { await fetchGroupData(this.$store, to, next); }, setup() { return h(resolveComponent('router-view')); }, });
原理说明
preFetch负责组件首次挂载前的预取逻辑,处理初始进入路由的场景;beforeRouteUpdate负责路由参数更新时的逻辑,处理同一个组件下切换:groupId的场景;- 通过抽离公共函数
fetchGroupData,避免两处逻辑重复,提升代码可维护性。
这样修改后,无论是首次进入群组路由,还是在不同群组间切换(:groupId变化),都会重新获取对应群组的数据。
内容的提问来源于stack exchange,提问作者Bruno Francisco
相关产品推荐
相关产品推荐

