React 有狀態元件生成真實DOM結點

2022-07-06 18:42:10 字數 2648 閱讀 6148

上次我們分析了無狀態元件生成 dom 的過程,無狀態元件其實就是純函式,它不維護內部的狀態,只是根據外部輸入,輸出乙份檢視資料。而今天我們介紹的有狀態元件,它有內部的狀態,因此在元件的內部,可以自行對狀態進行更改,進而渲染出新的檢視。下面我們就來分析有狀態元件生成真實 dom 結點的過程。

我們先來寫的乙個 greeting 元件,每次點選問候按鈕,文字部分會更新問候的次數:

class greeting extends react.component ;

} componentdidmount()

greet = () => = this.state;

this.setstate();

};render() = this.props;

return (

hello times

greet

)}}

編譯之後的**如下:

// 自執行函式變數 _createclass實際上是用來定義props的

var _createclass = function () ]

function defineproperties(target, props)

object.defineproperty(target, descriptor.key, descriptor);

}} return function (constructor, protoprops, staticprops)

// 定義靜態props

if (staticprops)

return constructor;

};}();

function _possibleconstructorreturn(self, call)

// 繼承

function _inherits(subclass, superclass) )來實現繼承

subclass.prototype = object.create(superclass && superclass.prototype,

});if (superclass)

}// 自執行函式變數 表示使用者自定義元件

var greeting = function (_react$component) ;

// 元件內部greet方法

_this.greet = function () );

};return _this;

} // 繼承reactcomponent

_inherits(greeting, _react$component);

// 給greeting定義生命週期方法

_createclass(greeting, [},,

react.createelement(

"div",

null,

"hello ",

name,

" ",

this.state.count,

" times"

),react.createelement(

"button",

,"greet"));

}}

]);return greeting;

}(react.component);

模擬元件渲染:

const react = 

// 結點

let vnode =

};// 掛載元件函式體的虛擬dom

if (typeof type === 'function') ;

// 有狀態元件

if (type.prototype && type.prototype.render)

// 無狀態元件

else

}return vnode;

}};// reactcomponent基類

function reactcomponent(props) {}

// 實現setstate方法

reactcomponent.prototype.setstate = function (partialsate)

// 模擬react.component基類

react.component = reactcomponent;

const reactdom = ,

// 獲取真實dom結點

generatedom(vnode)

let elem = document.createelement(vnode.type);

vnode.dom = elem;

// 特殊key值對映

let specialkeymap = ;

let = vnode;

// 設定dom屬性

props && object.keys(props).foreach(key => else

});} else if (key === 'style') :$`);

});elem.setattribute('style', styleitems.join(';'));

} else if (['onclick'].includes(key)) );

} else

});return elem;

}};

React 無狀態元件生成真實DOM結點

先以下面一段簡單的 舉例 const greeting function 可以看出,greeting 是乙個無狀態元件,我們來看看編譯過後的可執行 var greeting function greeting ref 我們看到,呼叫 greeting 元件時傳入的 name 屬性,出現在 react...

react無狀態元件

乙個普通元件只有render函式的時候,我們完全可以通過乙個無狀態元件來替換掉這個普通元件。無狀態元件相對於這個普通函式的優勢如下 無狀態元件的效能比較高。因為無狀態元件就是乙個函式。而普通元件是js裡面的乙個類,而這個類生成的物件裡還有生命週期函式,他執行起來既要執行生命週期函式,還要執行rend...

react自動生成React元件命令

好久沒有用vscode了,可以說越來越強大了。但是偶然也要用用,react新建了乙個元件,輸入import,沒有自動補全,還要自動手工輸入,比較麻煩。網上也找了文章處理,發現還是不起作用。解決 rcc 現在來講講,這個命令是哪來的,為什麼我輸入rcc,就自動幫我寫上了以上的 其實是react sni...