1. const React = {
    2. createElement
    3. };
    4. const ReactDOM = {
    5. render
    6. };
    7. function createElement(tag, attrs, ...children) {
    8. return {
    9. tag,
    10. attrs,
    11. children
    12. };
    13. }
    14. function render(element, root) {
    15. let node;
    16. if (typeof element === 'string') {
    17. node = document.createTextNode(element);
    18. }
    19. if (typeof element === 'object') {
    20. node = document.createElement(element.tag);
    21. setAttrs(node, element.attrs);
    22. element.children.forEach(el => {
    23. render(el, node);
    24. });
    25. }
    26. root.appendChild(node);
    27. }
    28. function setAttrs(node, attrs) {
    29. console.log(node, attrs);
    30. Object.keys(attrs).forEach(key => {
    31. if (key === 'style') {
    32. Object.assign(node.style, attrs[key]);
    33. } else if (key.startsWith('on')) {
    34. node[key.toLowerCase()] = attrs[key];
    35. } else {
    36. node[key] = attrs[key];
    37. }
    38. });
    39. }
    40. const onBtn = () => {
    41. console.log('click');
    42. };
    43. const element = React.createElement(
    44. 'div',
    45. { class: 'container' },
    46. React.createElement(
    47. 'span',
    48. { style: { color: 'red', 'font-size': '34px' }, className: 'span1' },
    49. 'span1'
    50. ),
    51. React.createElement(
    52. 'span',
    53. { className: 'span2', onClick: onBtn },
    54. 'span2'
    55. )
    56. );
    57. ReactDOM.render(element, document.body);