JooTC
react-logo-red

[React] Adjacent JSX elements must be wrapped in an enclosing tag

리액트(React)를 사용하면서 처음에 가장 많이 하는 실수들이 있는데, 그 중 하나는 다음과 같은 에러 메시지입니다.

SyntaxError: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>? (25:4)

사실 이 문제의 원인해결 방법은 매우 간단하며 영문을 해석하면 답이 쉽게 나옵니다. 먼저 문제가 되는 Main 컴포넌트의 코드를 살펴보겠습니다.

const Main = () => {
  return (
    <div className="panelA">
      <h1>Hello, react!</h1>
    </div>
    <div className="panelB">
      Bye, React!
    </div>
  );
};

export default Main;

문제의 원인은 React에서 부모 태그(컴포넌트의 최상위 태그)는 오직 한개여야 하는데, 위 예시처럼 div 태그 두개가 동시에 부모 태그로 존재하기 때문에 발생했었습니다. 이는 JSX의 문법이기 때문에 부모 태그는 하나만 있어야 한다는 것을 반드시 기억하셔야 합니다.

따라서 해결 방법은 부모 태그를 하나로 만들 수 있는 감싸는 태그를 하나 더 만들어주는 것입니다. 아래 예시는 div 태그로 감싸주었지만 꼭 div 태그가 아니여도 좋습니다.

const Main = () => {
  return (
    <div>
      <div className="panelA">
        <h1>Hello, react!</h1>
      </div>
      <div className="panelB">
        Bye, React!
      </div>
    </div>
  );
};

export default Main;

이렇게 하면 더 이상 에러 메시지가 나타나지 않습니다.

여기에서 더 나아가서, 최상위 태그를 div로 표현하지 않고, 하위 컴포넌트를 감싸는 래퍼임을 명확하게 알리기 위해 <div> 대신 <React.Fragment>로 표현할 수 있습니다. div에 특별한 속성이 없었다면 결과는 같을 것입니다.

좀 더 최근의 React에서는 React.Fragment 태그를 더 단축시켜 아예 이름이 없는 빈 태그 (<></>)로 바꿀 수도 있습니다. 이렇게하면 무언가 하위 컴포넌트를 감싸고 있다는 구분을 조금 더 확실하게 표현할 수 있습니다.

const Main = () => {
  return (
    <>
      <div className="panelA">
        <h1>Hello, react!</h1>
      </div>
      <div className="panelB">
        Bye, React!
      </div>
    </>
  );
};

export default Main;

이렇게 표현하면 조금 더 최상위 태그의 느낌이 날 것입니다. 하지만 주의사항이 있습니다. 빈 태그를 사용할 때는 빈 태그의 HTML 속성이나 컴포넌트 속성(Props)을 넣을 수 없습니다. 따라서 속성을 사용해야 한다면 React.Fragment나 다른 태그를 사용해주어야 합니다.

이 포스트가 도움이 되었나요?

guest
0 Comments
Inline Feedbacks
모든 댓글 보기
0
이 포스트에 대한 의견을 남겨주세요!x
()
x
error: 무단 콘텐츠 도용 방지를 위해 복사하실 수 없습니다. 양해해주셔서 감사합니다. (소스코드는 복사 가능)