面试题答案
一键面试实现主应用与子应用之间的路由协同及避免冲突方案
- 路由前缀区分
- 在主应用和子应用的路由配置中,为子应用设置唯一的路由前缀。例如,主应用的路由为
/main
开头,子应用A的路由以/sub - a
开头,子应用B的路由以/sub - b
开头。在Vue Router配置中,可以这样设置:
// 主应用 const router = new VueRouter({ routes: [ { path: '/main', component: MainApp } ] }); // 子应用A const subARouter = new VueRouter({ routes: [ { path: '/sub - a', component: SubAppA } ] });
- 在主应用和子应用的路由配置中,为子应用设置唯一的路由前缀。例如,主应用的路由为
- 动态挂载子应用路由
- 在主应用中,根据子应用的加载情况,动态挂载子应用的路由。可以使用
router.addRoutes
方法来实现。例如,在主应用加载子应用A时:
import subARouter from './sub - a - router'; router.addRoutes(subARouter.routes);
- 在主应用中,根据子应用的加载情况,动态挂载子应用的路由。可以使用
- 命名路由
- 为每个路由设置唯一的名称,在主应用和子应用中,确保命名路由的名称不会冲突。这样在进行路由跳转时,可以通过名称来精准定位路由,避免因路径相似而产生冲突。例如:
// 主应用 const router = new VueRouter({ routes: [ { path: '/main/home', name:'main - home', component: MainHome } ] }); // 子应用A const subARouter = new VueRouter({ routes: [ { path: '/sub - a/home', name:'sub - a - home', component: SubAppAHome } ] });
主应用跳转到子应用特定路由时的数据共享方案
- 通过路由参数传递
- 在主应用跳转到子应用特定路由时,可以将数据作为路由参数传递。例如:
// 主应用跳转 this.$router.push({ path: '/sub - a/detail', query: { data: '要共享的数据' } }); // 子应用接收 export default { created() { const data = this.$route.query.data; } };
- 使用Vuex或Pinia
- 主应用和子应用共享一个状态管理库,如Vuex或Pinia。在主应用中,将需要共享的数据存入状态管理库,子应用在合适的时机从状态管理库中获取数据。例如,使用Vuex:
// 主应用存入数据 this.$store.commit('SET_SHARED_DATA', '要共享的数据'); // 子应用获取数据 export default { created() { const data = this.$store.state.sharedData; } };
- 使用事件总线
- 创建一个全局的事件总线,主应用在跳转到子应用时,通过事件总线发布数据,子应用监听相应事件来获取数据。例如:
// 创建事件总线 const eventBus = new Vue(); // 主应用发布数据 eventBus.$emit('shared - data - event', '要共享的数据'); // 子应用监听数据 export default { created() { eventBus.$on('shared - data - event', (data) => { // 处理数据 }); } };
技术要点总结
- 路由配置规范:合理规划路由前缀和命名路由,确保主应用和子应用的路由具有清晰的区分和唯一标识。
- 动态路由加载:掌握
router.addRoutes
方法,实现子应用路由的动态挂载,使得应用在运行时能够灵活管理路由。 - 数据传递与共享机制:根据不同场景选择合适的数据共享方式,如路由参数适合简单数据传递,状态管理库适合复杂的数据共享和状态管理,事件总线则更侧重于解耦的事件驱动的数据共享。