이태홍
홍'story
이태홍
전체 방문자
오늘
어제
  • 분류 전체보기 (171)
    • TW (39)
    • AI (47)
      • 자연어 처리 (10)
      • Kaggle (2)
      • Machine Learning (26)
      • Computer Vision (0)
      • Deep Learning (0)
      • ROS2 (7)
    • Computer Science (29)
      • Data Structure (0)
      • Algorithm (18)
      • Computer Architecture (5)
      • SOLID (0)
      • System Programing (6)
    • LOLPAGO (10)
      • 프론트엔드 (10)
      • 백엔드 (0)
    • BAEKJOON (2)
    • React (5)
    • 언어 (8)
      • C++ (8)
    • GIT (0)
    • MOGAKCO (19)
    • 미국 여행기 (3)
    • etc. (7)
      • Blog (2)
      • 콜라톤 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • kaggle
  • tw
  • 딥러닝
  • 알고리즘
  • computerscience
  • 머신러닝
  • C++
  • algorithm
  • react
  • NLP
  • ROS2
  • baekjoon
  • LOLPAGO
  • 경사하강법
  • 기계학습
  • pytorch
  • 백준
  • ML
  • Ai
  • computer architecture

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이태홍

홍'story

[LOLPAGO] React 설치 및 Header 구성 완료(6)
LOLPAGO/프론트엔드

[LOLPAGO] React 설치 및 Header 구성 완료(6)

2024. 2. 27. 20:36

🚗 배열을 이용한 동적 구성

리액트는 항상 동적인 구성을 통해 콛으의 재사용성과 유지 보수성을 향상시킬 수 있도록 노력한다.

 

우리는 Header에 들어갈 contents내용인 '메인', '챔피언 분석',. '경기력 비교', 'AI챔피언 추천'을 정적으로 구성했는데,

 

이를 동적으로 구성하도록 해보자.

 

각 헤더 항목의 이름 'name', 경로 'path'를 객체로 가지고 배열의 각 요소를 매핑하여 HeaderItem 컴포넌트를 생성하도록 작성해보겠다.

 

이렇게 하면 헤더 항목을 쉽게 추가, 삭제, 수정할 수 있게 된다.

 

우선 constants의 contents.js에 HEADER_CONTENTS라는 배열을 생성해야한다.

 

 

다음과 같이 HEADER_CONTENTS를 생성한 뒤 export 해주었다.

 

이를 가지고 오기 위해서는 map함수를 사용하면 되는데 map 함수의 사용 방법은 아래를 참고하기 바란다.

 

https://2t-hong.tistory.com/179

 

[React] map함수 사용법

🚗 map 만약 아래와 같은 배열이 있다고 했을 때 map함수를 이용하면 값과 인덱스를 인자로 받아 자동으로 for문을 돌려서 값을 뺴준다. const arr = [ 10, 20, 30, 40, 50 ]; arr.map((item, index) => { console.log(ind

2t-hong.tistory.com

 

기존의 코드에서 FlexDiv안의 내용들을 배열을 이용하여 가져올것이기 때문에 다음과 같이 작성하면 된다.

 

 

{HEADER_CONTENTS.map((header, i) => (
    <HeaderItem
        key={i}
        onClick={() => {
            setSelected(header.name);
            navigate(header.path);
        }}
    >
        {header.name}
    </HeaderItem>
))}

 

 

 

이전과 동일하게 잘 작동하는 것을 알 수 있다.

 

하지만 각각의 메뉴를 구분해야하기 때문에 style을 적용해야 하는데 다음과 같이 작성하였다.

 

color또한 컴포넌트화 하여 작성했다.

 

 

import { LOGO } from 'assets/images';
import { FlexDiv } from 'components/div/Div';
import { Image } from 'components/img';
import { BACK_COLOR2, Q_COLOR } from 'constants/color';
import { HEADER_CONTENTS } from 'constants/contents';
import { useEffect, useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import styled from 'styled-components';

const HeaderDiv = styled.div`
	width: 100%;
	box-sizing: border-box;
	padding: 20px 80px 0;
`;

const HeaderItem = styled.div`
	height: 28px;
	padding: 0 16px;
	text-align: center;
	font-size: 14px;
	font-family: 'MediumFont';
	cursor: pointer;
`;

const Header = () => {
	const [selected, setSelected] = useState('메인');
	const navigate = useNavigate();
	const location = useLocation();

	useEffect(() => {
		const path = location.pathname;
		const match = path.match(/\/([^/]+)\//);
		if (path === '/') {
			setSelected('메인');
		} else if (path === '/champAnalyze' || (match !== null && match[1] === 'champAnalyze')) {
			setSelected('챔피언 분석');
		} else if (path === '/matchCompare') {
			setSelected('경기력 비교');
		} else if (path === '/AISuggestion') {
			setSelected('AI챔피언 추천');
		} else {
			setSelected('');
		}
	}, [location]);

	return (
		<HeaderDiv>
			<Image src={LOGO} />
			<FlexDiv
				style={{
					width: '100%',
					borderBottom: `1px solid ${BACK_COLOR2}`,
					marginTop: '20px',
				}}
			>
				{HEADER_CONTENTS.map((header, i) => (
					<HeaderItem
						key={i}
						onClick={() => {
							setSelected(header.name);
							navigate(header.path);
						}}
						style={
							selected === header.name
								? { color: Q_COLOR, borderBottom: `3px solid ${Q_COLOR}`, fontFamily: 'BoldFont' }
								: {}
						}
					>
						{header.name}
					</HeaderItem>
				))}
			</FlexDiv>
		</HeaderDiv>
	);
};

export default Header;



 

다음과 같이 색이 입혀진 것을 알 수 있다.

 

더하여 로고 이미지의 크기를 조절하고 뒷 배경과 상호작용 할 수 있도록 변경하였다.

 

 

이제 Header를 구성해본 경험을 바탕으로 각각에 들어갈 내용들을 모두 작성하여 보도록 하자.

 

 

 

'LOLPAGO > 프론트엔드' 카테고리의 다른 글

[LOLPAGO] 검색 창 구성(2)  (0) 2024.03.06
[LOLPAGO] 검색 창 구성(1)  (0) 2024.02.29
[LOLPAGO] React 설치 및 Header 구성(5)  (0) 2024.02.27
[LOLPAGO] React 설치 및 Header 구성(4)  (0) 2024.02.26
[React] 리액트 훅스(2) - useEffect  (0) 2024.02.23
    'LOLPAGO/프론트엔드' 카테고리의 다른 글
    • [LOLPAGO] 검색 창 구성(2)
    • [LOLPAGO] 검색 창 구성(1)
    • [LOLPAGO] React 설치 및 Header 구성(5)
    • [LOLPAGO] React 설치 및 Header 구성(4)
    이태홍
    이태홍
    공부하자 태홍아

    티스토리툴바