matchMedia를 사용하여 js 버전 미디어 조회 실현
11556 단어 Reacthooksmatchmediatech
오늘, 나는 js판 미디어 조회 훅스를 소개하고 싶다.
나는 CSS의 미디어 조회가 덮어쓸 수 없는 필수 조건의 화면이 있다고 생각한다. 예를 들어 React에 플로피 사이트를 설치할 때 PC 버전과 SP 버전에서 표시하고자 하는 요소가 변화할 수 있다.
CSS의 미디어 쿼리
display: none;
에서도 가능하지만, DOM 요소로 남아있어 인기 있는 구현 방식도 아니다.이 경우 jsx에 공식을 삽입하는 형식으로 디스플레이 제어를 할 수 있습니다.
윈도 함수를 사용했기 때문에 다른 전방 라이브러리를 사용해도 사용할 수 있습니다.그래서 Anglar와 Vue를 사용하는 분들도 참고해주세요.
window.matchMedia
이번에 소개한 훅스는 window.matchMedia를 사용했다.
matchMedia는 CSS의 미디어 쿼리 문자열을 전달하여 분석 결과를 반환하는 창 함수입니다.
현재 어느 브라우저든지 사용할 수 있다.
ref) https://caniuse.com/matchmedia
예전에 화면 사이즈를 조정할 때 달리기 처리를 하려면 다음과 같이 사건 청중을 설정해야 한다고 생각합니다.
window.addEventListener('resize', () => {
if (window.innerWidth <= SOME_WINDOW_WIDTH) {
// 何らかの処理
}
})
상술한 단점은 1px화면 사이즈의 변화에 따라 사건에 불이 나기 때문에 비교적 무거운 처리를 할 때 비용이 쉽게 나온다는 것이다.특히 IE 같은 브라우저에서는 동작이 느리다.
matchMedia는 픽셀 수를 초과한 경우에만 이벤트가 발생할 수 있다는 장점이 있다.
화면 크기에 따라 요소를 구분하고자 하는 경우
addEventListener('resize', () => {})
처럼 1px의 변화마다 사건이 발생하지 않고 특정 픽셀 수를 초과한 상태에서 디스플레이 판정만 하면 되기 때문에 적합한 시행방식이라고 할 수 있다.useMediaQuery
실제 소스 코드는 다음과 같다.
import {useCallback, useEffect, useState} from 'react'
type WidthPrefix = 'min' | 'max'
const createQuery = (width: number, prefix: WidthPrefix) =>
`(${prefix}-width: ${width}px)`
export const useMediaQuery = (width: number, prefix: WidthPrefix = 'min') => {
const query = createQuery(width, prefix)
const [matchQuery, setMatchQuery] = useState(matchMedia(query))
const handleQueryListener = useCallback(() => setMatchQuery(matchMedia(query)), [query])
useEffect(
() => {
matchQuery?.addEventListener('change', handleQueryListener)
return () => matchQuery?.removeEventListener('change', handleQueryListener)
},
[handleQueryListener, query]
)
return matchQuery.matches
}
코드 해설
useMedia Query에 대한 매개변수는 두 개입니다.
첫 번째는 한도값 width입니다.
두 번째 지정한 한도값 이상(min) 또는 한도값 이하(max).
두 번째 매개변수의 고정 값도 사용할 수 있습니다.용례에 따라 최적화해 주십시오.
matchMedia에 전달되는 매개 변수는 CSS의 미디어 조회와 마찬가지로 문자열
min-width: 966px
을 전달합니다.matchQuery 유형은 MediaQueryList입니다.
matchQuery.matches
미디어 조회 목록과 일치할 때 실제 값을 되돌려줍니다.useEffect의 처리는 호출을 설정하여 미디어 조회의 일치 상황이 변할 때 사건 청중들이 불을 낼 수 있도록 하는 것이다.
검색 문자열이 변하지 않으면, 호출은 같은 결과를 되돌려주기 때문에useCallback 캐시를 사용합니다.
또한useEffect의 정리 함수
removeEventListener
도 미리 설정했다.사용법
import React, {FC} from 'react'
import {useMediaQuery} from '../useMediaQuery'
const LAPTOP_WIDTH = 966
export const HogeComponent: FC = () => {
const isLaptop = useMediaQuery(LAPTOP_WIDTH, 'min')
return <>
{isLaptop && <>966px以上で表示されるよ</>}
{!isLaptop && <>965px以下で表示されるよ</>}
</>
}
위에서 말한 바와 같이 매개 변수로 한도값과 한도값 이상 또는 이하를 교부할 때boolean 값은 반환된다고 선언한다.그리고 jsx에서 디스플레이 제어를 하면 완벽합니다.
임계값의 수치는 상수화할 수 있고 CSS와 공통적이면 된다.
최후
대충 설명해 드렸는데 어때요?
각 제품에서 사용 장소의 규칙을 결정하고 활용할 수 있다면 응답 사이트에서 상당히 유익한 훅스라고 생각합니다.
(CSS가 무시할 수 있는 범위는 CSS에서 미디어 쿼리 작성 등)
여기까지가 그거예요. 가능하면 이 hooks가 사용하지 않는 디자인이 좋을 것 같아요. 디자이너가 읽어줄 수 있다면 디자인을 다시 생각해 보세요.)
Reference
이 문제에 관하여(matchMedia를 사용하여 js 버전 미디어 조회 실현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sakottishfold/articles/2e68f9755bf4ca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)