inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

React 완벽 마스터: 기초 개념부터 린캔버스 프로젝트까지

조건부 렌더링

컴포넌트에서 삼항 연산자를 이용하여 JSX 를 반환할 때 궁금한 점

97

Droid

작성한 질문수 8

0

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 을 하지 않으니깐 아래 처럼 오류가 발생하는데 이유를 정확하게 모르겠습니다...

image.png


react React-Context react-router tailwindcss react-query

답변 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