티스토리 뷰
png, jpeg 등의 파일 외 svg파일을 사용하면 이미지가 깨지지않고 용량이 적으며 출력이 빠르다.
또한, 수정과 애니메이션이 가능하다는 장점이 있다.
0. 가장 베이직한 방법
기본적으로는 img의 src로 svg를 넣어줄 수 있다.
import Reservation from 'assets/icon-24-reservation.svg'
<img src={Reservation}>
1. svg 파일을 react component처럼 사용하는 방법
- svg 파일 주소를 복사한다.
- src 폴더(보통 src > assets > images)에 svg 확장자명의 파일(e.g. MySvg.svg)을 만들어 추가한다.
- something.svg 파일에 복사한 주소를 붙여넣는다.
- svg 파일을 component로 불러온다. (이때 { ReactComponent as OOO }의 이름으로 import 해와야 한다.)
import {ReactComponent as MySvg} from "../../assets/images/MySvg.svg";
이제 컴포넌트처럼 사용하면 된다.
1-2. svg 컴포넌트의 width, height 변경하기
.svg 파일을 열어 코드를 확인하면 width와 height가 설정된 부분이 있는데 가로와 너비를 변경하고 싶을 때 직접 하드코딩해도 되지만 width와 height값을 "current"로 변경한 뒤, 해당 svg컴포넌트에서 width와 height를 props로 전달해주는 방법도 있다.
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
style="pointer-events: none; display: block;
width: "current"; //"current"로 수정
height: "current"; //"current"로 수정
"
>
<g>
<path d="M21,6H3V5h18V6z M21,11H3v1h18V11z M21,17H3v1h18V17z" ></path>
</g>
</svg>
import {ReactComponent as MySvg} from "../../assets/images/MySvg.svg";
const Header = () => {
return (
<Container>
<MySvg width="24px" height="24px" /> //props로 내려준다
</Container>
);
};
const Container = styled.div``;
export default Header;
2. svg 파일을 함수처럼 사용하는 방법
1번처럼 component로 사용하는 방법 외에 svg를 호출하는 함수를 만들어 사용하는 방법도 있다.
함수를 만들어 그 안에 svg파일 주소를 붙여넣는다.
이때 svg파일에 기본적으로 설정된 style 부분은 모두 삭제해야 한다. svg 파일에 class가 설정되어 있는 경우, jsx에서는 className만 인식하므로 삭제하는 게 좋다.
아래의 코드처럼 중괄호 안에 icon함수를 ()로 호출해준다.
const Header = () => {
const icon = ()=>(
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
>
<g><path d="...">
</path>
</g>
</svg>
)
return (
<Icon>
{icon()}
</Icon>
);
};
const Icon = styled.div``
export default Header;
2-1 svg파일을 여러개 사용해야 하는 경우
수십개의 svg 파일을 불러와야 하는 경우를 생각해보자
그렇게되면 import를 30번 하거나 함수를 30번 만들어야 하는데, component 코드가 난잡해지게될 것이다.
이럴 경우엔 해당 데이터를 따로 만들어 사용하면 된다.
src >component > data 단계로 폴더를 생성하고 data폴더에 000.js파일을 만든다.
000.js파일은 작업하는 component에서 map함수를 돌려 불러올 데이터를 저장해놓는 곳이라고 생각하면 된다.
export const firstList = [
{
name: "홈",
icon: () => (
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
//style 속성 제거 필수
>
<g>
<path d="M4,10V21h6V15h4v6h6V10L12,3Z"></path>
</g>
</svg>
),
},
{
name: "탐색",
icon: () => (
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
>
<g>
<path d="..."></path>
</g>
</svg>
),
},
{
name: "Shorts",
icon: () => (
<svg
viewBox="0 0 24 24"
preserveAspectRatio="xMidYMid meet"
focusable="false"
>
<g height="24" viewBox="0 0 24 24" width="24">
<path d="..."></path>
</g>
</svg>
),
},
... //생략
]
이제 작업하고 있는 component에서 위의 데이터 파일을 불러온다.
import styled from "styled-components";
import {firstList} from "../../data/youtube/sidebar";
const SideBar = () => {
return (
<Container>
<List>
{firstList.map(({ name, icon }) => (
<Item>
<IconWrapper>{icon()}</IconWrapper> //icon 함수 호출
<Name>{name}</Name>
</Item>
))}
</List>
</Container>
);
};
const Container = styled.div``
const List = styled. div``
const Item = styled. div``
const IconWrapper = styled.div``
const Name = styled.span``
ref:
'Frontend > react.js' 카테고리의 다른 글
[React | Vite] CRA 대신 Vite(비트)? (0) | 2023.03.02 |
---|---|
[React | React hook form] 리액트 훅 폼 라이브러리 사용해보기 (0) | 2023.02.09 |
[React | beta doc] useState() 인자로 함수(Lazy initial state)가 들어가는 경우, useState (0) | 2023.01.17 |
[React | Issue] 로컬 스토리지가 동기처리라면 API호출 함수에서 문제가 없을까? (0) | 2023.01.15 |
[React | Issue] 리액트 컴포넌트의 DB 값 변동 시, 겪은 이슈(with json-server DELETE 메소드) (0) | 2022.12.08 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 틸드와 캐럿
- getStaticPaths
- nvm 설치순서
- ~ ^
- && 셸 명령어
- D 플래그
- 항해99추천비추천
- 타입스크립트 장점
- nvm경로 오류
- 프리온보딩 프론트엔드 챌린지 3월
- 항해99프론트
- 부트캠프항해
- is()
- float 레이아웃
- getServerSideProps
- 프리렌더링확인법
- 항해99프론트후기
- 원티드 프리온보딩 프론트엔드 챌린지 3일차
- text input pattern
- 원티드 프리온보딩 FE 챌린지
- reactAPI
- 형제 요소 선택자
- 원티드 FE 프리온보딩 챌린지
- aspect-ratio
- fs모듈 넥스트
- grid flex
- 타입스크립트 DT
- tilde caret
- Prittier
- 원티드 3월 프론트엔드 챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함