亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

React 組件渲染和更新的實現代碼示例

2024-05-06 16:48:16
字體:
來源:轉載
供稿:網友

最近一直寫React,慢慢就對里面的一些實現很好奇。最好奇的就是自定義標簽的實現和this.setState的實現。這里不分析JSX是如何解析的,所有組件都用ES5方式編寫。

組件渲染

渲染時候,我們會調用render方法。類似下面這樣:

var SayHi = React.createClass({ getInitialState: function() {  return {verb: 'say:'}; }, componentWillMount: function() {  console.log('I will mount'); }, componentDidMount: function() {  console.log('I have mounted'); }, render: function() {  return React.createElement("div", null,this.state.verb, "Hello ", this.props.name); }});React.render(React.createElement(SayHi, {name: "Cynthia"}), document.getElementById("container"));

結果: 

頁面打?。?nbsp;
say: Hello Cynthia 
控制臺打?。?nbsp;
I will mount 
I have mounted

React,組件,渲染,更新,代碼

這是我畫的React對象上的一些屬性和方法。 

當調用render方法時,render會去調用一個map方法,根據傳入參數的不同,把被render的對象分為以下三類: 
* 文本 
* 原生 
* 自定義標簽

文本

對于文本,React會實例化一個文本節點的對象,并且調用該對象的mount方法。在這個mount方法中,把文本放到一個span中,調用容器組件的innerHTML,進行渲染。

原生標簽

對于原生標簽,React會實例化一個處理原生標簽的對象,并且調用該對象的mount方法。在這個mount方法中,拼接一個字符串,并且不斷遞歸上面的map方法,最后把拼接好的字符串放到容器組件的innerHTML中,進行渲染。

自定義標簽

這個應該是大家最好奇的。自定義標簽雖然叫標簽,其實就是一個類。實例化一個處理自定義標簽的對象后,首先React會處理自定義標簽的生命周期方法,然后再次遞歸調用子組件的render方法進而調用map方法,直至把自定義標簽分解為前兩種標簽。

更新

首先,我們統一一下認識。在React里調用this.setState()會使得組件更新,調用this.state = {}只會更改本組件的狀態,但是不會使得組件更新。 

如果我要更新一個組件,我會這樣寫。

var SayHi = React.createClass({ getInitialState: function() {  return {verb: 'say:'}; }, componentWillMount: function() {  console.log('I will mount'); }, componentDidMount: function() {  console.log('I have mounted'); }, changeVerb: function(){  this.setState({verb: 'write:'}); } render: function() {  return React.createElement("div", this.changeVerb.bind(this),this.state.verb, "Hello ", this.props.name); }});React.render(React.createElement(SayHi, {name: "Cynthia"}), document.getElementById("container"));

執行結果: 

頁面打?。?nbsp;
say: Hello Cynthia 
點擊文本,頁面內容更新成: 
write: Hello Cynthia

與更新相關的屬性和方法如下: 

React,組件,渲染,更新,代碼

在調用this.setState()以后,也是調用了一個map方法,根據傳入參數不同,依然把要更新的標簽分為文本、原生標簽、自定義標簽三類。具體處理過程如下。

文本

文本節點處理很簡單,判斷要更新后的文本與當前文本是否===,不是全等就刪除原來文本,插入新文本。

自定義標簽

對于自定義標簽,首先根據對象的引用、key是否相同,判斷是否需要更新。如果需要更新,就繼續調用上述map方法進行子組件的更新。又是一個遞歸。但是注意,這里的map方法和渲染部分的map方法不是一個方法喲。

原生標簽

對于原生標簽,首先更新組件的屬性,然后update子樹,用diff算法來比較新的子樹與目前標簽的子樹的不同,形成一個差異樹,然后用patch方法,把這個差異樹更新到真正的DOM樹上。

總結

很復雜的過程,讓我用流水賬寫了一遍。沒能道出其中精華。以后繼續探索,寫的詳細一些。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕在线日韩| 亚洲v日韩v综合v精品v| 日韩人在线观看| 国产噜噜噜噜久久久久久久久| 欧美成人精品不卡视频在线观看| 亚洲欧美另类国产| 日本精品久久中文字幕佐佐木| 另类天堂视频在线观看| 在线免费观看羞羞视频一区二区| 亚洲成人av中文字幕| 亚洲国产精品热久久| 日韩在线视频中文字幕| 欧美最猛性xxxxx亚洲精品| 欧美精品免费播放| 中文字幕日本欧美| 国产不卡精品视男人的天堂| 日韩av在线资源| 久久精品成人欧美大片| 欧美中文在线视频| 欧美理论在线观看| 欧美日韩激情网| 日本三级韩国三级久久| 国产欧美精品日韩精品| 国产一区二区三区在线观看视频| 中文字幕日韩精品在线| 国产欧美精品日韩| 欧美日本精品在线| 91精品久久久久久久久不口人| 国产91网红主播在线观看| 91久久久久久久久久久| 91香蕉嫩草神马影院在线观看| 欧美视频在线观看免费网址| 国模视频一区二区三区| 国产精品久久久久不卡| 精品国产依人香蕉在线精品| 久久久久久一区二区三区| 亚洲精品永久免费精品| 成人免费自拍视频| 在线观看精品国产视频| 欧洲美女免费图片一区| 亚洲日韩欧美视频| 国产日韩在线精品av| 欧美性做爰毛片| 法国裸体一区二区| 国产精品极品美女在线观看免费| 国产a级全部精品| 欧美做爰性生交视频| 久久综合网hezyo| 91人人爽人人爽人人精88v| 日韩在线www| 亚洲第一视频网| 国产精品视频免费在线观看| 国产精品免费看久久久香蕉| 日韩av电影手机在线| 国产自产女人91一区在线观看| 亚洲国产免费av| 欧美日韩另类字幕中文| 久久精品国产一区二区三区| 91欧美精品成人综合在线观看| 成人网在线免费看| 日本高清+成人网在线观看| 亚洲二区在线播放视频| 欧美日韩中文字幕日韩欧美| 亚洲第一男人天堂| 久久97精品久久久久久久不卡| 亚洲国产91精品在线观看| 亚洲第一页中文字幕| 国产精品com| 一本大道亚洲视频| 日韩久久精品成人| 日韩中文字幕在线| 日本精品va在线观看| 亚洲精品国产精品久久清纯直播| 日本精品一区二区三区在线| 91网站在线免费观看| 亚洲区中文字幕| 亚洲男人的天堂在线播放| 97久久精品在线| 国产亚洲xxx| 九九热在线精品视频| 国产精品美女网站| 亚洲老板91色精品久久| 精品久久中文字幕久久av| 欧美日韩第一视频| 亚洲 日韩 国产第一| 91久久国产婷婷一区二区| 国产亚洲免费的视频看| 人体精品一二三区| 亚洲福利视频网| 久久久久女教师免费一区| 日韩中文字幕第一页| 91免费看片在线| www亚洲精品| 欧美在线中文字幕| 国产精品欧美一区二区| 国产精品av在线播放| 国产午夜精品全部视频播放| 亚洲天堂精品在线| 精品无人国产偷自产在线| 久久精品国产亚洲一区二区| 亚洲а∨天堂久久精品喷水| 欧美亚洲另类在线| 亚洲a一级视频| 欧美性视频在线| 久久深夜福利免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 91麻豆桃色免费看| 最近的2019中文字幕免费一页| 亚洲成av人片在线观看香蕉| 91久久久久久久一区二区| 国产精品久久久久久久久久新婚| 亚洲激情免费观看| 亚洲高清福利视频| 国产日韩欧美在线视频观看| 免费91麻豆精品国产自产在线观看| 影音先锋日韩有码| 精品成人久久av| 97国产精品久久| 中文字幕视频在线免费欧美日韩综合在线看| 8090理伦午夜在线电影| 国产欧美一区二区三区久久人妖| 国产97在线视频| 欧美一区二区.| 91久久精品国产| 俺去啦;欧美日韩| 日本老师69xxx| 久久久久久噜噜噜久久久精品| 日本中文字幕不卡免费| 懂色aⅴ精品一区二区三区蜜月| 欧美大片在线影院| 亚洲欧美激情四射在线日| 久久精品视频网站| 美女精品久久久| 日本91av在线播放| 久久久久免费精品国产| 亚洲免费一在线| 九九九热精品免费视频观看网站| 伊人精品在线观看| 亚洲一区二区三区xxx视频| 中文字幕亚洲一区二区三区五十路| 欧美国产亚洲精品久久久8v| 2021久久精品国产99国产精品| 黄色成人av在线| 久久伊人91精品综合网站| 亚洲免费av网址| 欧美另类第一页| 国产91色在线免费| 国产精品视频一区国模私拍| 国产成人精品最新| 日韩高清电影好看的电视剧电影| 91精品国产99| 日韩视频免费在线观看| 亚洲专区中文字幕| 亚洲欧洲一区二区三区久久| 欧美日韩色婷婷| 97久久超碰福利国产精品…| 亚洲国产精品推荐| 永久免费看mv网站入口亚洲| 精品久久久久久久久久ntr影视| 日本a级片电影一区二区| 97av在线视频免费播放| 国产日韩中文字幕| 国产精品福利网| 亚洲aaa激情|