React

Fragments

지성현 2023. 3. 23. 14:56

 

 

  React에서 컴포넌트가 여러 엘리먼트를 반환하는 것은 흔한 패턴이다. Fragments를 통해 DOM에 별도의 노드를 추가하지 않고 여러 자식 컴포넌트를 그룹화할 수 있다.

return (
	<React.Fragment>
    	<ChildA />
        <ChildB />
        <ChildC />
    </React.Fragment>
)

 

  아래와 같은 예시가 있다고 하자.

function Table() {
	...
    
    return (
    	<table>
        	<tr>
            	<Column />
            </tr>
        </table>
    )
}

function Column() {
	return (
    	<div>
        	<td>Hello</td>
            <td>World</td>
        </div>
    )
}

이 Table 컴포넌트가 렌더링 된 HTML이 유효하려면 Column 컴포넌트는 td 엘리먼트만 반환해야 한다. 만약 div 엘리먼트로 여러 td 엘리먼트를 감싼다면 렌더링 된 HTML이 유효하지 않다. 출력결과 아래와 같을 것이다.

<table>
	<tr>
    	<div>
        	<td>Hello</td>
            <td>World</td>
        </div>
    </tr>
</table>

  Fragments는 이 문제를 해결해 준다. Column을 Fragments를 사용해 이렇게 작성하면 된다.

function Column() {
	return (
    	<React.Fragment>
        	<td>Hello</td>
            <td>World</td>
        <React.Fragment>
    )
}

이 경우 Table 컴포넌트가 렌더링된 HTML은 이럴 것이다.

<table>
	<tr>
    	<td>Hello</td>
        <td>World</td>
    </tr>
</table>

 

  Fragments를 선언하는 더 짧고 간단한 문법이 있다. 빈 태그와 같이 작성하면 된다.

function Column() {
	return (
    	<>
        	<td>Hello</td>
            <td>World</td>
        </>
    )
}

이 단축 문법의 경우 key 또는 어트리뷰트를 지원받지 못한다는 단점이 있다.

 

  Fragments에 key가 있으면 <React.Fragment> 문법으로 명시적으로 선언해야 한다.

function Glossary(props) {
	return (
    	<dl>
        	{props.items.map(item => (
            	<React.Fragment key={item.id}>
                	<dt>{item.term}</dt>
                    <dd>{item.description}</dd>
                </React.Fragment>
            ))}
        </dl>
    )
}

key는 Fragment에 전달할 수 있는 유일한 어트리뷰트이다. 

 

참조: React 공식문서 고급 안내서 Fragment