사용자 지정 useDeviceDetect() 반응 후크를 만드는 방법
나는 오늘 사용자 지정 후크를 만드는 데 필요한 문제를 하나 발견했습니다.
내 과정에 대한 새 랜딩 페이지를 구축하는 중이며 모바일 장치에서 매우 이상한 오류가 발생했습니다. 데스크톱 컴퓨터에서는 스타일이 멋져 보였습니다.
그런데 모바일로 보니 모든게 어긋나고 깨져버렸습니다.
사용자가 모바일 장치를 가지고 있는지 여부를 감지하는 데 사용했던
react-device-detect
라는 하나의 라이브러리까지 문제를 추적했습니다. 그렇다면 헤더를 제거하겠습니다.// templates/course.js
import React from "react";
import { isMobile } from "react-device-detect";
function Course() {
return (
<>
<SEO />
{!isMobile && <StickyHeader {...courseData} />}
{/* more components... */}
</>
);
}
문제는 이 라이브러리가 Gatsby가 기본적으로 사용하는 서버 측 렌더링을 지원하지 않는다는 것입니다. 그래서 사용자가 모바일 장치를 사용하는지 확인할 수 있는 자체 솔루션을 만들어야 했습니다. 그리고 이를 위해
useDeviceDetect
라는 이름의 커스텀 훅을 만들기로 했습니다.후크 만들기
useDeviceDetect.js라는 동일한 이름으로 내 utils 폴더에 이 후크를 위한 별도의 파일을 만들었습니다. 후크는 반응 후크를 활용하는 공유 가능한 JavaScript 함수이므로
useDeviceDetect
라는 함수를 만들고 React를 가져왔습니다.// utils/useDeviceDetect.js
import React from "react";
export default function useDeviceDetect() {}
창에서 사용자 에이전트 가져오기
사용자의 장치에 대한 정보를 얻을 수 있는지 여부를 확인할 수 있는 방법은 userAgent 속성(window의 navigator 속성에 있음)을 통하는 것입니다.
그리고 API/외부 리소스로서 창 API와 상호 작용하는 것은 부작용으로 분류되므로
useEffect
후크 내에서 사용자 에이전트에 액세스해야 합니다.// utils/useDeviceDetect.js
import React from "react";
export default function useDeviceDetect() {
React.useEffect(() => {
console.log(`user's device is: ${window.navigator.userAgent}`);
// can also be written as 'navigator.userAgent'
}, []);
}
구성 요소가 마운트되면
typeof navigator
를 사용하여 클라이언트 또는 서버에 있는지 확인할 수 있습니다. 서버에 있으면 창에 액세스할 수 없습니다. typeof navigator
는 문자열undefined
이 없기 때문에 문자열과 같습니다. 그렇지 않으면 클라이언트에 있는 경우 사용자 에이전트 속성을 얻을 수 있습니다.userAgent 데이터를 얻기 위해 삼항을 사용하여 이 모든 것을 표현할 수 있습니다.
// utils/useDeviceDetect.js
import React from "react";
export default function useDeviceDetect() {
React.useEffect(() => {
const userAgent =
typeof navigator === "undefined" ? "" : navigator.userAgent;
}, []);
}
userAgent가 모바일 장치인지 확인
userAgent
는 모바일 장치를 사용하는 경우 다음 장치 이름 중 하나로 설정되는 문자열 값입니다.Android, BlackBerry, iPhone, iPad, iPod, Opera Mini, IEMobile 또는 WPDesktop.
우리가 해야 할 일은 문자열을 가져오는 것입니다. 이 문자열 중 하나인지 확인하기 위해 정규식과 함께 .match() 메서드를 가져와 사용합니다.
mobile
라는 로컬 변수에 저장합니다.useState 후크를 사용하여 상태에 결과를 저장하고 초기 값을 false로 지정합니다. 이를 위해 해당 상태 변수
isMobile
를 생성하고 세터는 setMobile
입니다.// utils/useDeviceDetect.js
import React from "react";
export default function useDeviceDetect() {
const [isMobile, setMobile] = React.useState(false);
React.useEffect(() => {
const userAgent =
typeof window.navigator === "undefined" ? "" : navigator.userAgent;
const mobile = Boolean(
userAgent.match(
/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i
)
);
setMobile(mobile);
}, []);
}
따라서
mobile
값을 얻으면 상태로 설정한 다음 마지막으로 후크에서 개체를 반환하여 이 후크에 더 많은 기능을 추가하도록 선택하려는 경우 나중에 더 많은 값을 추가할 수 있습니다.개체 내에서 속성 및 값으로
isMobile
를 추가합니다.// utils/useDeviceDetect.js
import React from "react";
export default function useDeviceDetect() {
const [isMobile, setMobile] = React.useState(false);
React.useEffect(() => {
const userAgent =
typeof window.navigator === "undefined" ? "" : navigator.userAgent;
const mobile = Boolean(
userAgent.match(
/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i
)
);
setMobile(mobile);
}, []);
return { isMobile };
}
랜딩 페이지로 돌아가서 후크를 실행하고 구조 해제된 개체에서 해당 속성을 가져와 필요한 곳에 사용할 수 있습니다.
// templates/course.js
import React from "react";
import useDeviceDetect from "../utils/useDeviceDetect";
function Course() {
const { isMobile } = useDeviceDetect();
return (
<>
<SEO />
{!isMobile && <StickyHeader {...courseData} />}
{/* more components... */}
</>
);
}
그래서 다음은 타사 라이브러리가 부족할 때 후크가 우리 자신의 문제를 해결할 수 있는 도구를 제공하는 방법에 대한 명확한 예입니다.
Gatsby 또는 Next.js와 같은 서버 측 렌더링 React 프레임워크를 사용하여 사용자가 모바일 장치에 있는지 여부를 감지해야 하는 경우 자신의 코드에서 이 후크를 자유롭게 사용하세요. 이 기능을 확장하고 다른 상태 변수를 만들어 사용자가 데스크톱에 있는지 확인하는 것은 어렵지 않습니다.
이 게시물을 즐기십니까? 리액트 부트캠프에 참여하세요
The React Bootcamp은 React 학습에 대해 알아야 할 모든 것을 비디오, 치트 시트 및 특별 보너스를 포함하여 하나의 포괄적인 패키지로 묶습니다.
수백 명의 개발자가 이미 React를 마스터하고 꿈의 직업을 찾고 미래를 통제하는 데 사용한 내부 정보를 얻으십시오.
열릴 때 알림을 받으려면 여기를 클릭하십시오.
Reference
이 문제에 관하여(사용자 지정 useDeviceDetect() 반응 후크를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/reedbarger/how-to-create-a-custom-usedevicedetect-react-hook-56l1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)