const getPath = () => {
let path = window.location.pathname;
if (!!BASE_URL && path.startsWith(BASE_URL)) path = path.slice(BASE_URL.length - 1);
if (path.length > 1 && path.endsWith("/")) path = path.slice(0, -1);
return path;
}; createVNode에서 평탄화가 왜 필요할까?
2중, 3중으로 배열을 엮는 경우가 있을까?
결국 React.Fragment <></> 에 감싸지는 것은 아닌가?
하는 의문이 들었었습니다.
const some = [
{ name: "Parent 1", sub: [{ name: "Child 1-1" }, { name: "Child 1-2" }] },
{ name: "Parent 2", sub: [{ name: "Child 2-1" }] },
];
const other = [{ name: "Other 1" }, { name: "Other 2" }];
/** @jsx createVNode */
import { createVNode } from "./lib";
const NestedList = ({ some = [], other = [] }) => {
return (
<ul>
{some.map((so, idx) => (
<>
<li key={idx} data-indent={1}>
{so.name}
</li>
<>
{so.sub?.map((su, jdx) => (
<li key={`${idx}-${jdx}`} data-indent={2}>
{su.name}
</li>
))}
</>
</>
))}
{other.map((item, idx) => (
<li key={`other-${idx}`} data-indent={1}>
{item.name}
</li>
))}
</ul>
);
};
createVNode로 표기해보자면 다음과 같을 것입니다.
createVNode(
"ul",
null,
[
// 이게 some.map(...) 결과
[
createVNode(Fragment, null, // 첫 번째 Fragment
createVNode("li", null, so.name),
createVNode(Fragment, null, // 두 번째 Fragment
createVNode("li", null, su.name),
createVNode("li", null, su.name)
)
)
],
[ ... ]
]
)
type 만 표기해보자면 다음과 같이 최종적으로 ul에 담기게 되다보니(중간에 flat이 없다면..) children = [[[vNode]]] 구조가 되어 예외가 발생하게 됩니다.
createVNode("ul", null, [ [ [ li, [li, li] ] ], ... ])
다만, 이러한 상황이 발생한다는 것은 개발자가 코드를 잘 분리하지 못하는 상황이 된 것으로 예상이 됩니다.
다중 depth 트리 구조의 상품 카테고리를 seqno, parantSeqno로 연결하고, indent로 한번에 보여줘야 하는 상황에서 사용했던 경험이 있는데, 하위 카테고리들을 더 작은 단위의 컴포넌트로 한번 감싸서 관리하는 것이 코드상으로도 좋았을 것 같다는 생각이 들었습니다.

참고글
https://junilhwang.github.io/TIL/Javascript/Design/Vanilla-JS-Virtual-DOM