React 虛擬Dom 轉成 真實Dom 實現原理

React 和 React-Dom 是核心模塊

React:是核心庫,當使用JSX語法時,必須讓React 存在當前做用域下

React元素:是經過JSX語法建立的在JS中存在的HTML的標籤

JSX語法:是一種JS和Html組合1的一種混合語法

ReactDOM.render:

1> 把虛擬的DOM轉換成真實的DOMhtml

2> 把真實的DOM插入到根元素中數組

3> ReactDOM 當render渲染時,會把根元素中的全部DOM結構進行替換bash

4> 第三個參數是個回調函數,當把真實DOM渲染到頁面時,執行這個地方的回調函數app

class Element{
    constructor(type,attr,children){
        this.type=type;
        this.attr=attr;
        this.children=children;
        /*this.props={...attr,children:children}*/
    }
    render(){
        // 這個方法將虛擬的DOM轉成真實的DOM;
        let ele = document.createElement(this.type);
        // 2. 設置行間屬性
        for(let key in this.attr){
            let _key = key;
            if(key==="className"){
                _key="class"
            }
            if(key==="htmlFor"){
                _key="for"
            }
            ele.setAttribute(_key,this.attr[key]);
        }
        // 3.children
        this.children.forEach(item=>{
            // 若是數組中的成員是Element的實例,須要繼續調用render方法;將虛擬的DOM轉成真實的DOM;
            // 循環子節點,都放入ele中;
            let curEle = item instanceof Element?item.render():document.createTextNode(item);
            ele.appendChild(curEle);
        });
        return ele;// 將建立的元素轉成DOM返回;
    }
}
let obj = {
    createElement(type,attr,...children){
        // type: 元素類型
        // attr:行間屬性
        // children : 子節點 ... 把多餘的參數放進一個數組中;
        return new Element(type,attr,children)
    }
}
let objDOM ={
    render(element,container){
        // container : 容器,根元素;
        // element: 虛擬的DOM對象;當render執行時,讓這個虛擬的DOM轉成真實的DOM;
        container.appendChild(element.render())
    }
}
let y = obj.createElement("div",{a:1,className:12},"中國北京")
objDOM.render(y,document.getElementById("root"))
複製代碼

來吧函數

相關文章
相關標籤/搜索