首先介绍jsx语法 , 其实jsx= javascript + xml,看上去是html其实不是.javascript
let element = <h1 id='myid'>hello world</h1>
经过bable 转义后变成html
let element= React.createElement('h1',{id:'myid'},'hello world') //这里咱们称React元素,这是React最小单位
写完React元素,就能够render渲染,就能够在页面中呈现了.java
ReactDom.render(element,document.getELementById('root'))
如图这个就是咱们要的react元素react
function createElement(type,config={},children){ let props={}; for(let propsName in config){ props[propsName]=config[propsName] }; let childrenLength = arguments.length-2; if(childrenLength==1){ props.children=children }else if( childrenLength >1){ props.children=Array.from(arguments).slice(2) } let element={type,props} return element }
思路:数组
render函数是把React元素(虚拟dom)渲染成htmlapp
function render(element,parentNode){ if(typeof element == 'string' || typeof element =='number'){ return parentNode.appendChild(document.createTextNode(element)) } let {type,props}=element; let domElement = document.createElement(type); for(let propsName in props){ switch(propsName){ case propsName=='className': return domElement.className=props[propsName]; case propsName=='style': let styobj= props[propsName] for(let attr in styobj){ domElement.style[attr]=styobj[attr] } return case propsName=='children': let children = Array.isArray(props.children)?props.children:[props.children] children.forEach(element=>{ render(element,domElement) }) return default: domElement.setAttribute(propsName,props[propsName]) } } parentNode.appendChild(domElement) }
思路:dom
render函数2个参数分别为react元素,根组件,咱们先判断react元素是否是string和number由于能够直接渲染好比像这样函数
ReactDom.render('abc',document.getElementById('root'))
function Welcome(props){ return React.createElement('h1',{id:'zhufeng'},props.name,props.age) } ReactDOM.render(element, document.getElementById('root'));
咱们得在render里面去添加逻辑,只须要把这个函数执行后就可,由于它的返回值仍是咱们的react元素.this
function render(element,parentNode){ if(typeof element == 'string' || typeof element =='number'){ return parentNode.appendChild(document.createTextNode(element)) } let {type,props}=element + if(typeof type == 'function'){ + let newElemet=type(props) + type=newElemet.type; + props=newElemet.props; } //如下逻辑相同 }
class Welcome1 extends React.Components{ render(){ return React.createElement('h1',{id:'classwelcome'},this.props.name,this.props.age) } }
一样的思路,咱们先去建立一个Components组件让它去继承.spa
class Components{ static isReactComponents=true constructor(props){ this.props=props } }
这个组件咱们只须要去传递props让子组件去继承就能够,另外isReactComponents这个静态属性是用来标识是不是类组件.
接下来咱们继续改render函数
function render(element,parentNode){ if(typeof element == 'string' || typeof element =='number'){ return parentNode.appendChild(document.createTextNode(element)) } let {type,props}=element + if(type.isReactComponents){ + let newElemet=new type(props).render() + type=newElemet.type; + props=newElemet.props; + }else if(typeof type == 'function'){ + let newElemet=type(props) + type=newElemet.type; + props=newElemet.props; + } } //如下逻辑相同 }
那么咱们就能够顺利跑通啦.