Vue3中Composition API Hook的useRouter与ES6导入router实例有什么区别?
Vue3中
useRouter()与直接导入router实例的区别 结合你给出的代码示例,两种写法在单页面客户端应用、仅存在一个Vue实例+一个Router实例的常规场景下,拿到的是同一个路由实例,运行效果没有差异,核心区别体现在以下边界场景:
- 上下文适配能力不同
useRouter是基于Vue的依赖注入体系实现的,会自动读取当前组件所属的Vue应用实例上挂载的Router对象。如果项目存在多个独立Vue应用实例(比如微前端场景、同一页面挂载多个独立Vue子应用,每个应用对应不同路由规则),useRouter会自动匹配当前组件所属应用的Router实例,不会出现串实例的问题。而直接ES6导入的是固定路径导出的单例Router对象,只能拿到唯一一个实例,多应用场景下会直接出现逻辑错误。 - SSR(服务端渲染)兼容性不同
SSR场景下每收到一个用户请求,都会生成独立的Vue应用实例和Router实例,避免多个请求共享单例造成的数据污染。useRouter会从当前请求对应的应用上下文取实例,完全适配SSR逻辑。而直接导入的是全局单例Router,会被所有请求共享,出现路由状态串扰、数据错乱的问题。 - 可复用性、可测试性不同
如果要封装可跨项目复用的公共组件/组件库,使用useRouter的组件不需要绑定特定项目的Router路径,只要宿主应用正确注册了vue-router就可以正常运行。做单元测试时也只需要给组件注入模拟的Router实例即可,不需要做模块导入的mock处理。而直接导入Router的写法和当前项目的路由文件强耦合,组件无法复用,测试时也需要额外mock导入路径,成本更高。
内容的提问来源于stack exchange,提问作者zahrin
相关产品推荐
相关产品推荐

