效果演示
html代码
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"></div> </body> <script src="./react.js"></script> <script> let ele = React.createElement( 'div', { id: 'app', className: 'box', style: { color: 'red', fontSize: '23px' }, }, '哈哈哈', React.createElement('i', null, '呵呵'), React.createElement( 'p', null, 'hello', React.createElement('b', null, '666') ) ); ReactDOM.render(ele, document.getElementById('app')); </script></html>
javascript代码
let ReactModule = (function () { function Element(type, props, children) { this.type = type; this.props = props; this.children = children let _this = this; this.fn = function (str) { return str.replace(/[A-Z]/g, function (a) { return '-' + a.toLowerCase() }) } this.render = function () { let ele = document.createElement(_this.type) _this.props && Object.keys(_this.props).forEach(key => { switch (key) { case 'className': ele.setAttribute('class', _this.props[key]) break; case 'style': let str = ''; Object.keys(_this.props[key]).forEach(item => { str += `${_this.fn(item)}: ${_this.props[key][item]};` }) console.log(str, 'str++++') ele.setAttribute('style', str) break; case 'htmlFor': ele.setAttribute('for', _this.props[key]) break; default: ele.setAttribute(key, _this.props[key]) break; } }) this.children.forEach(item => { item instanceof Element ? ele.appendChild(item.render()) : ele.appendChild(document.createTextNode(item)); }) return ele; } } let React = { createElement(type, props, ...children) { return new Element(type, props, children) } } let ReactDOM = { render: function (ele, container) { container.appendChild(ele.render()) } } return { init: function () { window.ReactDOM = ReactDOM window.React = React; } }})()ReactModule.init()