Итак, чат, я тут намедни сходил на on-site в Facebook. Среди задач была одна довольно стандартная (вроде бы): написать DOMRenderer. То есть на вход подается объект вида
const app = {
type: "div",
props: {
id: "app",
children: [
{
type: "h1",
props: {
class: "header",
children: "Hello, World!"
}
},
],
},
};
вот так он должен вызываться:
const renderer = new DOMRenderer();
renderer.render(app, document.body);
вот такой должен быть результат:
<div id="app">
<h1 class="header">Hello, World!</h1>
</div>
Я был уверен, что как раз с этой задачей справился норм, но есть информация, что там целая куча багов.
Можете попробовать решить сами, но если хотите сразу помочь с баг-хантингом, то
Решение под катом
class DOMRenderer {
render(data, rootNode) { // transform data into DOM and render it inside the rootNode
rootNode.appendChild(this.createDomNode(data));
}
createDomNode(rootDataElement, rootNode) {
const node = document.createElement(rootDataElement.type);
Object.keys(rootDataElement.props).forEach(propName => {
if (propName === 'children') return;
node.addAttr(propName, rootDataElement[propName]);
});
if (!rootDataElement.props.children]) {
return node;
}
if (typeof rootDataElement.props.children === 'string') {
node.textContent(rootDataElement.children);
}
rootDataElement.props.children.forEach(child => {
const childNode = this.createDomNode(child);
node.appendChild(childNode);
});
return node;
}
}
Disclaimer: решение не вылизанное, а прям копипаста с live-coding, так что там наверняка куча проблем из-за того, что я забыл DOM API. Но меня интересуют, в первую очередь, более глобальные баги и пропущенные эдж-кейсы