일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 커스텀훅
- react
- classList remove
- resize
- react-router
- 클래스 토글
- chart.js
- 퍼블리싱
- 내배위의고양이
- 방심은금물
- 언젠간가겠지
- 2020
- ROUTER 버전6
- chart responsive
- react-router-dom
- 리엑트할수있는퍼블리셔라규
- 포트폴리오
- 안짤렸다
- 냥빨이다가온다
- 간식금지다!
- windowwidth
- classList
- classList add
- className
- 를
- 대표님물리기없기
- classList toggle
- 접근성
Archives
- Today
- Total
틈
[REACT] 실시간 화면 너비 구하기(with useEffect) 본문
import React, { useState, useEffect, useRef } from 'react';
// 브라우저 넓이에 따른 앱 다운로드 링크 변경
const [browserWidth, setBrowserWidth] = useState<number>(0);
const resizeTimer = useRef<any>(null);
useEffect(() => {
const handleResize = () => {
if (resizeTimer.current !== null) return;
resizeTimer.current = setTimeout(() => {
resizeTimer.current = null;
setBrowserWidth(window.innerWidth);
}, 200);
};
window.addEventListener('resize', handleResize);
console.log(browserWidth);
return () => {
window.addEventListener('resize', handleResize);
};
}, [browserWidth]);
앞으로 화면 구현에서 굉장히 많이 사용될 듯한 코드입니다.
browser로 너비를 받아서 별도의 코드를 구현하면 됩니다.
시행착오
1. handleResize를 useEffect 바깥에서 구현
: useEffect의 deps로 설정한 browserWidth 부분 에러가 남
=> useEffect 안에서 사용된 것만 deps로 인정하기 때문에 문제가 됨.
handleResize를 useEffect 안으로 이동
비슷한 경우 :
import React, { useState, useRef, useEffect } from 'react';
const Area = () => {
const [scrollY, setScrollY] = useState(0);
const scrollTimer = useRef<any>(null);
const floatingBtn = useRef<any>();
useEffect(() => {
const handlerScrollY = () => {
if (scrollTimer.current !== null) return;
scrollTimer.current = setTimeout(() => {
scrollTimer.current = null;
setScrollY(window.pageYOffset);
}, 500);
};
const handlerScrollAction = () => {
window.addEventListener('scroll', handlerScrollY);
if (floatingBtn.current !== undefined) {
if (!!scrollTimer && scrollY > 290) {
floatingBtn.current.classList.add('active');
} else {
floatingBtn.current.classList.remove('active');
}
}
};
handlerScrollAction();
return () => handlerScrollAction();
}, [scrollY, scrollTimer]);
return (
<div className="floating-btn" ref={floatingBtn}>
<a href="" className="new-btn type1">
서비스 신청하기
</a>
</div>
);
};
export default Area;
.floating-btn {
position: fixed;
z-index: 9999;
visibility: hidden;
opacity: 0;
bottom: 0;
left: 0;
width: 100%;
padding: 20px 20px;
will-change: visibility, opacity;
transition-property: visibility, opacity;
transition-duration: 0.3s;
transition-timing-function: cubic-bezier(0.07, 0.73, 0.71, 1.03);
&.active {
visibility: visible;
opacity: 1;
}
버튼이 스크롤 위치에 따라 나타났다 사라질 수 있도록 설정하는 코드이다.
'code > React.js' 카테고리의 다른 글
[REACT] input[type=file] 파일 이름 받아오기 (0) | 2022.05.07 |
---|---|
react+styled-components에서 overload Error가 날 때(with typescript) (0) | 2022.04.13 |
[React] 브라우저 대응(with.javascript) (0) | 2022.03.07 |
[REACT] router (0) | 2022.01.18 |
'react-app' 있을 때, eslint 설정 적용하기 (0) | 2022.01.13 |
Comments