You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NuxtJS V3中如何获取window.location.href完整绝对URL

Nuxt 动态获取完整访问URL生成扫码加入地址

需求场景

开发玩家扫码加入游戏功能时,由于游戏会部署在多个不同IP地址的环境中,需要动态生成带协议、IP/域名、端口的完整访问URL,不能硬编码地址。

之前尝试的方案问题

  • 临时方案是增加输入框,让用户手动复制浏览器地址到输入框后触发生成二维码,操作繁琐体验差
  • 直接在<script setup>顶层调用window.location.href会报错,代码无法正常运行
  • 调用useRouter()/useRoute()的.fullPath属性,只能拿到/这类相对路径,无法得到类似http://10.16.1.173:3000/格式的完整绝对URL

实现方案

方案1:客户端挂载后获取(最稳妥,适配所有部署场景)

所有依赖浏览器window对象的逻辑,放到仅客户端执行的onMounted生命周期中即可,SSR阶段不会执行该钩子,不会出现window未定义的报错:

<template>
  <img v-if="qrCodeData" :src="qrCodeData" alt="游戏加入二维码" />
</template>

<script setup>
const qrCodeData = ref(null)
// 替换成你实际需要拼接的加入路径,无额外路径可留空
const joinPath = ''

onMounted(() => {
  // window.location.origin 会直接返回当前访问地址的协议+域名/IP+端口部分
  const fullUrl = window.location.origin + joinPath
  // 沿用你之前的二维码生成逻辑即可
  QRCode.toDataURL(fullUrl, (err, dataUrl) => {
    if (err) throw err
    qrCodeData.value = dataUrl
  })
})
</script>

方案2:使用Nuxt内置API,支持SSR阶段获取

如果需要在服务端渲染阶段就拿到完整URL,不需要等客户端挂载,可以直接用Nuxt内置的useRequestURL()方法,服务端、客户端环境下都能正确返回当前请求的完整URL对象:

// 无需放在生命周期内,可直接在<script setup>顶层调用
const currentUrl = useRequestURL()
// 拼接得到完整访问地址
const fullUrl = currentUrl.origin + joinPath

问题原因说明

  • 直接在顶层写window相关逻辑报错:Nuxt默认开启服务端渲染,服务端执行代码时不存在浏览器的window对象,会直接抛出引用错误
  • useRoute()拿不到完整地址:路由实例仅维护路径、参数等路由相关信息,不包含请求域名、端口、协议这类主机信息,因此只能返回相对路径。

内容的提问来源于stack exchange,提问作者Dominik Zi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:06:20