const React = {
createElement
};
const ReactDOM = {
render
};
function createElement(tag, attrs, ...children) {
return {
tag,
attrs,
children
};
}
function render(element, root) {
let node;
if (typeof element === 'string') {
node = document.createTextNode(element);
}
if (typeof element === 'object') {
node = document.createElement(element.tag);
setAttrs(node, element.attrs);
element.children.forEach(el => {
render(el, node);
});
}
root.appendChild(node);
}
function setAttrs(node, attrs) {
console.log(node, attrs);
Object.keys(attrs).forEach(key => {
if (key === 'style') {
Object.assign(node.style, attrs[key]);
} else if (key.startsWith('on')) {
node[key.toLowerCase()] = attrs[key];
} else {
node[key] = attrs[key];
}
});
}
const onBtn = () => {
console.log('click');
};
const element = React.createElement(
'div',
{ class: 'container' },
React.createElement(
'span',
{ style: { color: 'red', 'font-size': '34px' }, className: 'span1' },
'span1'
),
React.createElement(
'span',
{ className: 'span2', onClick: onBtn },
'span2'
)
);
ReactDOM.render(element, document.body);