早日退休! 2023-07-18 10:10 采纳率: 25%
浏览 214
已结题

nuxt3怎么在服务端获取到window.innerWidth?

现在数据是用useAsyncData()获取的,在服务端渲染,为方便SEO,我没有放在onMounted()里请求数据。
现在是根据window.innerWidth来判断屏幕一行可以排几个列表数据,但是因为是服务端渲染的,所以我获取到的window.innerWidth为0。

const num = computed(() => {
  if (typeof window !== "undefined") {
    screenWidth.value = window.innerWidth;
  }
  console.log("屏幕可视宽度:" + screenWidth.value);
  if (screenWidth.value <= 1280) {
    total.value = 6;
    return 3; // 屏幕宽度小于等于 1280px,一列只能显示3张图片
  } else if (screenWidth.value <= 1850) {
    total.value = 8;
    return 4; // 屏幕宽度小于等于 1850px,一列可以显示4张图片
  } else {
    total.value = 10;
    return 5; // 屏幕宽度大于 1850px,一列可以显示5张图片
  }
});
console.log("一排个数:" + num.value);

img


所以现在就是:无论我屏幕可视宽度多大,它一排永远都是显示3个。
但是在浏览器控制台打印出来,显示是对的:(但是因为数据不是在浏览器渲染的所以也不能正确显示一排对应的个数)

img

img

想问一下,有什么办法,可以在服务器端获取到屏幕的可视宽度吗??

  • 写回答

1条回答 默认 最新

  • supervillain2 2023-07-18 11:24
    关注

    在服务器端渲染 (SSR) 的过程中,window 对象是不存在的,因为它是浏览器环境中的全局对象。在 SSR 中,我们通常需要使用一种“渐进增强”或“优雅降级”的方法来处理这种情况。

    在你的情况中,你可以考虑以下几种方法来解决问题:

    1. 默认值:在服务器端,你可以设置一个默认的 innerWidth 值,可能基于你的网站的平均或最常见的屏幕宽度。然后,在客户端,你可以使用实际的 innerWidth 来更新这个值。

    2. 客户端更新:你可以在服务器端渲染的基础上,在客户端再次计算或更新这个值。你可以在 onMountedbeforeMount 生命周期钩子中,获取实际的 window.innerWidth,然后根据这个值来更新你的列表布局。这种方法可能会导致布局的短暂闪烁,因为初始的服务器端渲染和客户端的更新可能会有不同的布局。

    3. 使用 CSS 媒体查询:如果可能,你可以尽量避免在 JavaScript 中使用 window.innerWidth,而是使用 CSS 的媒体查询来控制布局的变化。这种方法可以完全避免上述问题,因为 CSS 的媒体查询会在客户端自动应用正确的样式,而无需在 JavaScript 中进行任何操作。
      你可以把屏幕宽度或设备类型放在 cookies 或 headers

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 修改了问题 7月18日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型
  • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)
  • ¥15 matlab代码 关于微分方程和嵌套的分段函数。