mini-react-dom
Version:
A lightweight React-like DOM renderer with JSX, hooks, context, SSR and lazy support
28 lines (22 loc) • 795 B
JavaScript
export function renderToString(element) {
if (typeof element === "string" || typeof element === "number") {
return String(element);
}
if (typeof element.type === "function") {
return renderToString(element.type(element.props));
}
if (element.type === Symbol("fragment")) {
return (element.props.children || []).map(renderToString).join("");
}
if (element.type === "TEXT_ELEMENT") {
return element.props.nodeValue;
}
const props = element.props || {};
const children = props.children || [];
const attrs = Object.entries(props)
.filter(([k]) => k !== "children")
.map(([k, v]) => ` ${k}="${v}"`)
.join("");
const childrenHTML = children.map(renderToString).join("");
return `<${element.type}${attrs}>${childrenHTML}</${element.type}>`;
}