ETC -

Nextjs device-check useContext

  • -

안녕하세요 tripexlab(트리플랩)입니다.

오늘은 Nextjs App Router환경에서 사용자 device-check를 체크헤서 useContext로 컴포넌트 전역으로 사용하는 방법에대해서
이야기를 해보겠습니다.

Nextjs App Router

참고:
App Router 는 v13.4 버전부터 안정화가 되었습니다.

// src/context/DeviceType.tsx
'use client';
import React, { createContext, useState, useEffect, useContext, ReactNode } from 'react';

// DeviceType를 생성합니다.
const DeviceTypeContext = createContext<string | undefined>(undefined);

// DeviceType 컴포넌트를 생성합니다.
interface DeviceTypeProps {
  children: ReactNode;
}

// DeviceType 컴포넌트를 생성합니다.
export const DeviceType = ({ children }: DeviceTypeProps) => {
  const [deviceType, setDeviceType] = useState<string>("desktop");

  useEffect(() => {
    const userAgent = navigator.userAgent;
    if (/Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/.test(userAgent)) {
      setDeviceType("mobile");
    } else {
      setDeviceType("desktop");
    }
  }, []);
  
  return (
    <DeviceTypeContext.Provider value={deviceType}>
      {children}
    </DeviceTypeContext.Provider>
  );
};

export function useDeviceTypeContext () {
  return useContext(DeviceTypeContext);
};
// src/components/Counter.tsx

'use client';
import { useDeviceTypeContext } from "../context/DeviceType";

export default function Counter() {
  const deviceType = useDeviceTypeContext(); // 👈🏻여기서 useContext를 사용해서 deviceType변수를 꺼내올수 있습니다.

  return (
    <>
      <p>{deviceType}</p>
    </>
  );
}
// src/app/page.tsx
import Counter from '@/components/Counter';

export default function HomePage() {
  return (
    <div>
      <Counter />
    </div>
  )
}
// src/app/layout.tsx
import { DeviceType } from '@/context/DeviceType'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="ko">
      <body className={inter.className}>
        <header></header>
        <DeviceType> // 👈🏻 context에 정의된 DeviceType를 Provider로 감싸주는것 입니다.
          {children}
        </DeviceType>
        <footer></footer>
      </body>
    </html>
  )
};

정리

여기까지 전체적인 Nextjs App Router 환경에서 사용자 device-check를 체크하는 방법에 대해서 살펴봤습니다.
주석으로 설명글 적어놓은 부분 보시면 이해하는데 도움이 될것 같습니다.😃✅👏

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.