컴포넌트에서 삼항 연산자를 이용하여 JSX 를 반환할 때 궁금한 점
97
작성한 질문수 8
function HeartIconBtn({ isFavorite = false }) {
return (
<button
style={{
backgroundColor: 'white',
border: 'none',
}}
>
{isFavorite ? (
<img
style={{ width: '32px', color: 'red' }}
src="/images/heart-fill-icon.svg"
alt=""
/>
) : (
<img
style={{ width: '32px', color: 'red' }}
src="/images/heart-icon.svg"
alt=""
/>
)}
</button>
);
}
function LinkIconBtn({ link }) {
return (
<>
{link ? (
<a href={link} target="_blank">
<img
style={{ width: '36px' }}
src="/images/link-icon.svg"
alt="lecture link"
/>
</a>
) : null}
</>
);
}
export default function CourseItem({
image,
title,
description,
isFavorite,
link,
}) {
return (
<>
<div
style={{
display: 'flex',
gap: '30px',
justifyContent: 'center',
alignItems: 'center',
}}
>
<img
style={{ width: '20%', borderRadius: '10px' }}
src={image}
alt={description}
/>
<div
style={{
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
width: '80%',
gap: '10px',
}}
>
<p style={{ fontSize: '16px', fontWeight: 'bold', color: 'black' }}>
{title}
</p>
<p style={{ fontSize: '16px', fontWeight: 'bold', color: 'gray' }}>
{description}
</p>
</div>
<div style={{ display: 'flex', gap: '10px' }}>
<LinkIconBtn link={link} />
<HeartIconBtn isFavorite={isFavorite} />
</div>
</div>
</>
);
}CourseItem 컴포넌트에서 LinkIconBtn 을 포함하고 있습니다.
LinkIconBtn 컴포넌트에서
function LinkIconBtn({ link }) {
return (
<>
{link ? (
<a href={link} target="_blank">
<img
style={{ width: '36px' }}
src="/images/link-icon.svg"
alt="lecture link"
/>
</a>
) : null}
</>
);
}위 처럼 Fragment 를 사용하거나 <div></div> 를 사용해서 wrapping 을 하지 않으니깐 아래 처럼 오류가 발생하는데 이유를 정확하게 모르겠습니다...

답변 1
0
이 오류는 JSX와 삼항 연산자, Fragment를 사용할 때의 규칙과 관련이 있습니다.
JSX에서 삼항 연산자를 사용할 때는 반드시 양쪽 모두 유효한 JSX 표현식이어야 합니다
link ? (...) : null에서 괄호 없이 직접 반환하려고 할 때 TypeScript/JSX 파서가 혼란을 겪을 수 있습니다.
function LinkIconBtn({ link }) {
return link ? (
<a href={link} target="_blank">
<img
style={{ width: '36px' }}
src="/images/link-icon.svg"
alt="lecture link"
/>
</a>
) : null;
}
function LinkIconBtn({ link }) {
if (!link) return null;
return (
<a href={link} target="_blank">
<img
style={{ width: '36px' }}
src="/images/link-icon.svg"
alt="lecture link"
/>
</a>
);
}Fragment(<>...</>)를 사용할 때는 내부에서 조건부 렌더링을 할 경우, 전체 표현식이 명확한 JSX 구조를 가져야 합니다.
추가 팁 >,<
target="_blank"를 사용할 때는 보안을 위해rel="noopener noreferrer"도 함께 추가하는 것이 좋습니다:
<a href={link} target="_blank" rel="noopener noreferrer">
오타?
0
28
1
뭐하나 여쭤봐도 될까요?
0
70
1
안녕하세요 질문이 있습니다.
0
55
2
질문 : 삭제 버튼 아규먼트 (id)
0
50
1
Tailwind 버전 확인
0
62
1
align-items 정렬
0
50
2
vite 명령어로 프로젝트를 만들었습니다. (vscode)
0
79
1
31. 객체 업데이트 하기 - 10:15 질문
1
55
2
강의교안, 내용 인용해서 블로그 글 작성
1
80
2
이미지가 출력되지 않아요
1
74
2
강의와 만들어진 코드가 달라요
0
76
3
AI와 CSS 라이브러리의 궁합
0
95
1
onClick 이벤트에 함수 넘길 때
0
65
1
린캔버스 기능 구현은 왜 못하나요.... 구현하고 싶습니다...
0
101
1
notes 없음 읽기 오류
0
72
1
Object.assign 문법
0
64
1
react-router 전혀 기능 안함
0
53
1
react-router-dom@6.25.1
0
47
1
React Router 최신 스펙
0
207
1
Immer 에서 filter, map 사용
0
54
1
vite 설치에 대해 질문있습니다.
0
76
2
라이브러리 버전 일치 이슈
0
76
1
"Enter 키 발생 시 항목 추가" 부분에서 공백이 포함되면 한 줄이 더 입력됩니다
0
49
2
TotalCounter을 작성할때
0
65
2





