我正在使用mobile-detect库和本教程:
link
/src/utiles/isMobile.tsx:
import MobileDetect from "mobile-detect";
import { GetServerSidePropsContext } from "next";
export const getIsSsrMobile = (context: GetServerSidePropsContext) => {
const md = new MobileDetect(context.req.headers["user-agent"] as string);
return Boolean(md.mobile());
};
/src/hooks/useIsMobile.js:
import { useContext } from "react";
import { IsSsrMobileContext } from "../contexts/isSsrMobileContext";
export const useIsMobile = () => {
const isSsrMobile = useContext(IsSsrMobileContext);
return isSsrMobile;
};
/src/contexts/isSsrMobileContext.js:
import { createContext } from "react";
export const IsSsrMobileContext = createContext(false);
my `_app.tsx`:
import { IsSsrMobileContext } from "./../src/contexts/isSsrMobileContext";
function MyApp({ Component, pageProps }: AppProps <{ isSsrMobile: boolean }>): JSX.Element {
return (
<IsSsrMobileContext.Provider value={pageProps.isSsrMobile}>
<Provider store={store}>
<Component {...pageProps} />
</Provider>
</IsSsrMobileContext.Provider>
);
}
export default MyApp;
在我的pages/index.tsx
里面:
console.log(“useIsMobile”,useIsMobile())
显示为null
。
1条答案
按热度按时间pzfprimi1#
这里有另一种方法,你可以尝试不使用任何外部库。这不是最好的解决方案,但效果很好。我假设你的应用中有一个全局商店,我将在这个例子中使用
effector
,但这可以与你使用的任何商店提供商一起使用,只要确保在存储库上下文提供程序中执行此代码即可。但是你可以很容易地使用任何其他库,比如'styled-components'或者只是普通的CSS。我更喜欢@emotion
,因为它可以在outb中工作。这种方法背后的思想是首先呈现一个组件,该组件将依次呈现具有
content
属性的DOM元素,该属性的值将为desktop
或mobile
,具体取决于媒体查询的结果。然后,您可以通过附加的ref
访问content
的值,最后,设置isMobile
的值。无论你在哪里有你的入口点,创建一个
isMobile
商店:你的
IsMobileDeterminator
看起来像这样:现在,您可以在应用中的任何位置使用以下命令访问
isMobile
的值:如果你想让
IsMobileDeterminator
像钩子一样工作,你可以像这样改变它,改变你的切入点:
我在这里使用
767px
作为唯一的断点,但我相信如果需要的话,您可以找出如何让它与其他断点一起工作。