React.js

Typescript useRef 여러개 사용하기

★개발일기★ 2022. 12. 6. 09:57
반응형

 

반복문에 마다 ref 를 주고 싶을 때 어떻게 작업을 해야 할까?

( 오류코드 )

import { useRef } from 'react'
import classes from './TopNavigator.module.css'

const TopNavigator = () => {
	const menuRef = useRef(null)
	return (
		<>
			<div className={classes.mega}>
				<ul className={classes.megaLgContainer}>
					{[0, 0, 0].map((_, index) => (
						<li
							className={classes.megaLgItem}
							key={index}
							ref={e => (menuRef.current[index] = e)}
						>
							<a href="">대메뉴{index + 1}</a>
							<ul className={classes.megaMdContainer}>
								<li className={classes.megaMdItem}>
									<a href="">중메뉴1</a>
									<ul className={classes.megaSmContainer}>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴1</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴2</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴3</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴4</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴5</a>
										</li>
									</ul>
								</li>
								<li className={classes.megaMdItem}>
									<a href="">중메뉴2</a>
									<ul className={classes.megaSmContainer}>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴1</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴2</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴3</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴4</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴5</a>
										</li>
									</ul>
								</li>
								<li className={classes.megaMdItem}>
									<a href="">중메뉴3</a>
									<ul className={classes.megaSmContainer}>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴1</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴2</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴3</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴4</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴5</a>
										</li>
									</ul>
								</li>
								<li className={classes.megaMdItem}>
									<a href="">중메뉴4</a>
									<ul className={classes.megaSmContainer}>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴1</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴2</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴3</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴4</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴5</a>
										</li>
									</ul>
								</li>
								<li className={classes.megaMdItem}>
									<a href="">중메뉴5</a>
									<ul className={classes.megaSmContainer}>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴1</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴2</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴3</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴4</a>
										</li>
										<li className={classes.megaSmItem}>
											<a href="">소메뉴5</a>
										</li>
									</ul>
								</li>
							</ul>
						</li>
					))}
				</ul>
			</div>
		</>
	)
}

export default TopNavigator

먼저 가장 기초적인 방법으로 useRef 를 작성했다.
하지만 해당방법으로 작성하면 menuRef.current 에서 null 인것 같다는 에러가 발생한다.

해결방법1

const menuRef = useRef<any>([])

해당 방법으로 구현하면 에러없이 반복되는 useRef 를 모두 가져온다.
하지만 Typescript 에서 any 를 사용하면 쓰는 이유가 없다는 의견이 많으니 다른 방법은 없을까?

해결방법2

const menuRef = useRef<null[] | HTMLLIElement[]>([])

위와 같은 방법으로도 구현가능하다.

'HTMLLIElement | null' 형식은 'HTMLLIElement' 형식에 할당할 수 없습니다.
  'null' 형식은 'HTMLLIElement' 형식에 할당할 수 없습니다.ts(2322)

null[] 값을 빼먹으면 위와 같은 오류가 야기되니 주의하자.

반응형