React源碼解析之ReactDOM.render()

function render(element,container){
    if(typeof element == 'string' || typeof element == 'number'){   //如果element是一個普通的字符串或者數(shù)字,就創(chuàng)建文本節(jié)點并添加進去
        container.appendChild(document.createTextNode(element));
    }
    //這里是因為在執(zhí)行React.createElement()方法之后返回的element元素包含了type、props屬性
    let type = element.type;   // 獲取react元素的類型
    let props = element.props;   //獲取react元素的屬性
    if(typeof type === 'function'){
        let renderedElement;
        if(type.isReactComponent){  //說明是一個類組件
            let inst = new type(props);
            renderedElement = inst.render();  //調(diào)用class的render方法返回react元素
        }else{  //函數(shù)組件
            renderedElement = type(props);
        }
        type = renderedElement.type;
        props = renderedElement.props;
    }

    //創(chuàng)建react元素
    let domElement = document.createElement(type);
    for(let propName in props){
        if(propName == 'className'){
            domElement.className = props[propName];
        }else if(propName == 'style'){
            let styleObj = props[propName];
            for(let attr in styleObj){
                domElement.style[attr] = styleObj[attr];
            }
        }else if(/^on[A-Z]/.test(propName)){  //處理react事件
            domElement[propName.toLowerCase()] = props[propName];
        }else if(propName == 'children'){
            let children = Array.isArray(props.children) ? props.children : [props.children];
            children.forEach(child => render(child,domElement));
        }
    }
    container.appendChild(domElement);
}

export default {
    render
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容