리액트에서 배열의 데이터가 문자열과 ReactElement 두 가지 유형이 들어올 때, 해당 배열을 map을 사용하여 렌더링하려면 각 항목의 유형을 확인하고 적절히 처리해야 합니다.
렌더링 해야하는 데이터
const items = [
"20180326-2",
{
$$typeof: Symbol(react.element)
key: null
props: {}
ref: null
type: "br"
_owner: FiberNode {tag: 11, key: null, elementType: {…}, type: {…}, stateNode: null, …}
_store: {validated: false}
_self: null
_source: null
},
"dddd"
]
예시 코드
배열 items의 각 항목을 검사하고, 문자열인 경우 <div>로 래핑하여 표시하며, ReactElement인 경우 해당 엘리먼트를 그대로 반환합니다.
React.cloneElement를 사용하여 ReactElement에 key prop을 추가합니다.
이 경우, 문자열 항목은 <React.Fragment>로 감싸져 반환되며, ReactElement 항목은 이전과 동일하게 처리됩니다.
<React.Fragment>는 브라우저의 DOM에 추가적인 노드를 생성하지 않기 때문에 결과적으로 출력되는 HTML 구조에는 영향을 미치지 않습니다.
import React from 'react';
function App() {
const items = [
"20180326-2",
<br />,
"dddd"
];
return (
<div>
{items.map((item, index) => {
// 항목이 문자열인 경우
if (typeof item === 'string') {
return <React.Fragment key={index}>{item}</React.Fragment>;
}
// 항목이 ReactElement인 경우 (예: JSX 엘리먼트)
else if (React.isValidElement(item)) {
return React.cloneElement(item, { key: index });
}
return null;
})}
</div>
);
}
export default App;
'리액트' 카테고리의 다른 글
리액트 useImperativeHandle, forwardRef로 부모 컴포넌트가 자식 컴포넌트의 메서드나 변수에 직접 접근 (0) | 2024.01.17 |
---|---|
리액트에서 dangerouslySetInnerHTML 렌더링하기 (0) | 2023.10.11 |
FileReader로 파일 읽고 업로드한 파일 미리보기 구현 (0) | 2023.09.18 |
리액트에서 조건부 클래스 이름줄 때 classNames 라이브러리 사용 (0) | 2023.08.27 |
리액트 컴포넌트에서 axios API 요청하기 (0) | 2023.08.24 |
리액트에서 string 데이터와 ReactElement가 혼합된 데이터 렌더링 하기