Vue3 关于router引起的[Vue warn]: inject() can only be used inside setup() or functional

本文介绍了一个Vue项目中遇到的问题:在非setup环境下使用useRouter导致的警告,并提供了正确的解决方案,即通过直接导入创建的router实例来避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原代码部分模块示例:有一个封装请求地址的模块api.ts:

import { useRouter } from "vue-router";
const router = useRouter();

let token = localStorage.getItem("token");
if (!token) {
    router.push("/login");
}

该router的使用会报警告inject() can only be used inside setup() or functional;原因在于useRouter只能在setup中使用,因此在模块中调用会出现警告,参考文档API Vue Router

解决办法:引入创建router的文件替换useRouter()!!!

解决办法:引入创建router的文件替换useRouter()!!!

解决办法:引入创建router的文件替换useRouter()!!!

引入示例:import router from "@/router/index.ts"。router使用方式不变,只是引入router的方式变了。

其中router/index.ts部分代码示例:

import { createRouter, createWebHashHistory} from "vue-router"
import type { RouteRecordRaw } from "vue-router"
import login from "@/views/login/index.vue"

const routes: Array<RouteRecordRaw> = [
    {
        path: "/login",
        name: "login",
        component: login,
    }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

使用useStore同理。

### 解决 Vue Router 中出现的 &#39;window is not defined&#39; 错误 在使用 Vue Router 时,如果遇到 `&#39;window is not defined&#39;` 的错误,通常是因为代码在服务器端渲染(SSR)环境中运行,而 `window` 对象仅在浏览器环境中存在。以下是一些解决方案[^4]。 #### 确保 Vue Router 不在 SSR 中执行 可以通过检测 `process.client` 或类似的标志来确保 Vue Router 的某些逻辑仅在客户端执行。例如: ```javascript if (process.client) { const VueRouter = require(&#39;vue-router&#39;).default; Vue.use(VueRouter); } ``` #### 使用动态导入避免全局依赖 将与 `window` 相关的代码或库动态导入,可以避免在 SSR 环境中加载这些依赖。例如: ```javascript const routes = [ { path: &#39;/home&#39;, component: () => import(&#39;@/views/Home.vue&#39;), }, ]; ``` 这种方式确保了组件仅在需要时才被加载,从而避免了在 SSR 环境中提前加载的问题。 #### 在 Nuxt.js 中正确配置 Vue Router 如果使用的是 Nuxt.js 框架,可以通过插件或中间件的方式处理与 `window` 相关的逻辑。例如,创建一个插件文件 `plugins/router.js`,并在其中添加逻辑: ```javascript export default ({ app }, inject) => { if (process.client) { // 客户端特定逻辑 } }; ``` 然后在 `nuxt.config.js` 中注册该插件: ```javascript export default { plugins: [ &#39;~/plugins/router.js&#39;, ], }; ``` #### 修改 Vue Router 的安装方式 在 SSR 环境中,可以通过条件判断来避免直接调用 `Vue.use(VueRouter)`。例如: ```javascript if (typeof window !== &#39;undefined&#39;) { Vue.use(VueRouter); const router = new VueRouter({ mode: &#39;history&#39;, routes, }); export default router; } else { // 处理 SSR 环境 } ``` #### 使用虚拟 DOM 替代直接操作 `window` 如果必须在路由切换时操作 `window` 对象,可以考虑使用虚拟 DOM 或其他替代方案。例如,通过 Vuex 或事件总线传递数据,而不是直接操作 `window`。 ```javascript // 替代直接操作 window.location router.push({ path: &#39;/new-path&#39; }); ``` ### 示例代码 以下是一个完整的示例,展示如何在 SSR 环境中安全地使用 Vue Router: ```javascript let VueRouter; if (typeof window !== &#39;undefined&#39;) { VueRouter = require(&#39;vue-router&#39;).default; Vue.use(VueRouter); const routes = [ { path: &#39;/&#39;, component: () => import(&#39;@/views/Home.vue&#39;) }, { path: &#39;/about&#39;, component: () => import(&#39;@/views/About.vue&#39;) }, ]; const router = new VueRouter({ mode: &#39;history&#39;, routes, }); export default router; } else { console.warn(&#39;Vue Router is not initialized in SSR environment.&#39;); } ``` ### 注意事项 - 确保所有与 `window` 相关的逻辑都在客户端执行。 - 动态导入和条件判断是解决 SSR 问题的有效方法。 - 如果使用框架(如 Nuxt.js),遵循其推荐的实践以避免常见问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值