Nuxt 3 在移动设备上更改布局

问题描述 投票:0回答:2

所以我刚刚启动了 Nuxt 3 应用程序(关闭了 ssr),并且尝试在移动设备上更改布局。我正在关注本教程:https://www.youtube.com/watch?v=xh_OrVwgh4M

问题是我使用的是 nuxt 3,所以有点不同。我不知道我做错了什么。

在教程中,我在配置中定义了他的中间件,但我是这样做的;我在我的

middleware
文件夹中创建了
mobile.global.ts
,代码如下:

export default function(context: { isMobile: boolean; }){
    let userAgent = navigator.userAgent;
    context.isMobile = /mobile/i.test(userAgent)
}

这就是我的

index.vue

<script setup lang="ts">

definePageMeta({
    layout: ({isMobile}) =>  isMobile ? "mobile" : "default",
})

</script>

这是我收到的警告:

valid layout `({ isMobile }) => isMobile ? "mobile" : "default"` selected.
vue.js nuxt.js vuejs3 nuxtjs3
2个回答
0
投票

如果您有能力,我建议使用设备模块,它可以自动执行您想要执行的中间件操作。

关于你的问题。这不是你在 nuxt 3 中定义 middleware 的方式。 您可以使用

defineNuxtRouteMiddleware((to, from) => {...})
来实现此目的。

我首先会定义一个这样的中间件。

export default defineNuxtRouteMiddleware((to, from) => {
let userAgent = process.server
    ? useRequestHeaders()["user-agent"]
    : navigator.userAgent
to.params.isMobile = String(/mobile/i.test(userAgent))
})

然后像这样访问页面文件中的 isMobile 参数。

<script setup lang="ts">
const layout = useRoute().params.isMobile == "true" ? "mobile" : "desktop"
</script>

<template>
  <NuxtLayout :name="layout">
    whatever
  </NuxtLayout>
</template>

现在,我不推荐第二种选择。 + 我会使用反应值而不是无类型 isMobile 参数。 + 我不会把这个逻辑放在每个页面中,而是放在 布局本身


0
投票

我通过 https://developer.mozilla.org/en-US/docs/Web/API/window/innerWidth 做了一个简单的 Javascript 条件来查看它是否是类似移动设备的视口宽度。

onMounted(() => {
  const isMobileViewport = window.innerWidth >= 1024 ? true : false
...
}

如果您正在执行 SSR,请仅在

onMounted
内执行此操作或检查
window
属性。如果调整视口,此示例不会动态更新 true/false,但我通常不喜欢观察视口、滚动、鼠标更改。

© www.soinside.com 2019 - 2024. All rights reserved.