精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解react(源碼分析)

開發 前端
首先理解ReactElement和ReactClass的概念。想要更好的利用react的虛擬DOM,diff算法的優勢,我們需要正確的優化、組織react頁面。

理解ReactElement和ReactClass的概念

首先讓我們理解兩個概念:

ReactElement

一個描述DOM節點或component實例的字面級對象。它包含一些信息,包括組件類型type和屬性props。就像一個描述DOM節點的元素(虛擬節點)。它們可以被創建通過React.createElement方法或jsx寫法

分為DOM Element和Component Elements兩類:

  • DOM Elements

當節點的type屬性為字符串時,它代表是普通的節點,如div,span

  1.   type: 'button'
  2.   props: { 
  3.     className: 'button button-blue'
  4.     children: { 
  5.       type: 'b'
  6.       props: { 
  7.         children: 'OK!' 
  8.       } 
  9.     } 
  10.   } 
  11.  
  • Component Elements

當節點的type屬性為一個函數或一個類時,它代表自定義的節點

  1. class Button extends React.Component { 
  2.   render() { 
  3.     const { children, color } = this.props; 
  4.     return { 
  5.       type: 'button'
  6.       props: { 
  7.         className: 'button button-' + color, 
  8.         children: { 
  9.           type: 'b'
  10.           props: { 
  11.             children: children 
  12.           } 
  13.         } 
  14.       } 
  15.     }; 
  16.   } 
  17.  
  18. // Component Elements 
  19.   type: Button, 
  20.   props: { 
  21.     color: 'blue'
  22.     children: 'OK!' 
  23.   } 
  24.  

ReactClass

ReactClass是平時我們寫的Component組件(類或函數),例如上面的Button類。ReactClass實例化后調用render方法可返回DOM Element。

react渲染過程[[174578]] 

過程理解:

  1. // element是 Component Elements 
  2. ReactDOM.render({ 
  3.   type: Form, 
  4.   props: { 
  5.     isSubmitted: false
  6.     buttonText: 'OK!' 
  7.   } 
  8. }, document.getElementById('root')); 
  1. 調用React.render方法,將我們的element根虛擬節點渲染到container元素中。element可以是一個字符串文本元素,也可以是如上介紹的ReactElement(分為DOM Elements, Component Elements)。
  2. 根據element的類型不同,分別實例化ReactDOMTextComponent, ReactDOMComponent, ReactCompositeComponent類。這些類用來管理ReactElement,負責將不同的ReactElement轉化成DOM(mountComponent方法),負責更新DOM(receiveComponent方法,updateComponent方法, 如下會介紹)等。
  3. ReactCompositeComponent實例調用mountComponent方法后內部調用render方法,返回了DOM Elements。再對如圖的步驟2⃣遞歸。

react更新機制

每個類型的元素都要處理好自己的更新:

  1. 自定義元素的更新,主要是更新render出的節點,做甩手掌柜交給render出的節點的對應component去管理更新。
  2. text節點的更新很簡單,直接更新文案。
  3. 瀏覽器基本元素的更新,分為兩塊:
  • 先是更新屬性,對比出前后屬性的不同,局部更新。并且處理特殊屬性,比如事件綁定。
  • 然后是子節點的更新,子節點更新主要是找出差異對象,找差異對象的時候也會使用上面的shouldUpdateReactComponent來判斷,如果是可以直接更新的就會遞歸調用子節點的更新,這樣也會遞歸查找差異對象。不可直接更新的刪除之前的對象或添加新的對象。之后根據差異對象操作dom元素(位置變動,刪除,添加等)。

***步:調用this.setState

  1. ReactClass.prototype.setState = function(newState) { 
  2.     //this._reactInternalInstance是ReactCompositeComponent的實例 
  3.     this._reactInternalInstance.receiveComponent(null, newState); 
  4.  

第二步:調用內部receiveComponent方法

這里主要分三種情況,文本元素,基本元素,自定義元素。

自定義元素:

receiveComponent方法源碼 

  1. // receiveComponent方法 
  2. ReactCompositeComponent.prototype.receiveComponent = function(nextElement, transaction, nextContext) { 
  3.     var prevElement = this._currentElement; 
  4.     var prevContext = this._context; 
  5.  
  6.     this._pendingElement = null
  7.  
  8.     this.updateComponent( 
  9.       transaction
  10.       prevElement, 
  11.       nextElement, 
  12.       prevContext, 
  13.       nextContext 
  14.     ); 
  15.  
  16.  

updateComponent方法源碼

  1. // updateComponent方法 
  2. ReactCompositeComponent.prototype.updateComponent = function
  3.     transaction
  4.     prevParentElement, 
  5.     nextParentElement, 
  6.     prevUnmaskedContext, 
  7.     nextUnmaskedContext 
  8. ) { 
  9.    // 簡寫..... 
  10.     
  11.     // 不是state更新而是props更新 
  12.     if (prevParentElement !== nextParentElement) { 
  13.       willReceive = true
  14.     } 
  15.  
  16.     if (willReceive && inst.componentWillReceiveProps) { 
  17.         // 調用生命周期componentWillReceiveProps方法 
  18.     } 
  19.      
  20.     // 是否更新元素 
  21.     if (inst.shouldComponentUpdate) { 
  22.         // 如果提供shouldComponentUpdate方法 
  23.         shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext); 
  24.     } else { 
  25.         if (this._compositeType === CompositeTypes.PureClass) { 
  26.           // 如果是PureClass,淺層對比props和state 
  27.           shouldUpdate = 
  28.             !shallowEqual(prevProps, nextProps) || 
  29.             !shallowEqual(inst.state, nextState); 
  30.         } 
  31.     } 
  32.      
  33.     if (shouldUpdate) { 
  34.       // 更新元素 
  35.       this._performComponentUpdate( 
  36.         nextParentElement, 
  37.         nextProps, 
  38.         nextState, 
  39.         nextContext, 
  40.         transaction
  41.         nextUnmaskedContext 
  42.       ); 
  43.     } else { 
  44.       // 不更新元素,但仍然設置props和state 
  45.       this._currentElement = nextParentElement; 
  46.       this._context = nextUnmaskedContext; 
  47.       inst.props = nextProps; 
  48.       inst.state = nextState; 
  49.       inst.context = nextContext; 
  50.     } 
  51.         
  52.    // ....... 
  53.  
  54.  

內部_performComponentUpdate方法源碼

  1. function shouldUpdateReactComponent(prevElement, nextElement){ 
  2.   var prevEmpty = prevElement === null || prevElement === false
  3.   var nextEmpty = nextElement === null || nextElement === false
  4.   if (prevEmpty || nextEmpty) { 
  5.     return prevEmpty === nextEmpty; 
  6.   } 
  7.  
  8.   var prevType = typeof prevElement; 
  9.   var nextType = typeof nextElement; 
  10.    
  11.   if (prevType === 'string' || prevType === 'number') { 
  12.     // 如果先前的ReactElement對象類型是字符串或數字,新的ReactElement對象類型也是字符串或數字,則需要更新,新的ReactElement對象類型是對象,則不應該更新,直接替換。 
  13.     return (nextType === 'string' || nextType === 'number'); 
  14.   } else { 
  15.       // 如果先前的ReactElement對象類型是對象,新的ReactElement對象類型也是對象,并且標簽類型和key值相同,則需要更新 
  16.     return ( 
  17.       nextType === 'object' && 
  18.       prevElement.type === nextElement.type && 
  19.       prevElement.key === nextElement.key 
  20.     ); 
  21.   } 
  22.  

文本元素:

receiveComponent方法源碼

  1. ReactDOMTextComponent.prototype.receiveComponent(nextText, transaction) { 
  2.      //跟以前保存的字符串比較 
  3.     if (nextText !== this._currentElement) { 
  4.       this._currentElement = nextText; 
  5.       var nextStringText = '' + nextText; 
  6.       if (nextStringText !== this._stringText) { 
  7.         this._stringText = nextStringText; 
  8.         var commentNodes = this.getHostNode(); 
  9.         // 替換文本元素 
  10.         DOMChildrenOperations.replaceDelimitedText( 
  11.           commentNodes[0], 
  12.           commentNodes[1], 
  13.           nextStringText 
  14.         ); 
  15.       } 
  16.     } 
  17.   } 

基本元素:

receiveComponent方法源碼

  1. ReactDOMComponent.prototype.receiveComponent = function(nextElement, transaction, context) { 
  2.     var prevElement = this._currentElement; 
  3.     this._currentElement = nextElement; 
  4.     this.updateComponent(transaction, prevElement, nextElement, context); 
  5.  

updateComponent方法源碼

  1. ReactDOMComponent.prototype.updateComponent = function(transaction, prevElement, nextElement, context) { 
  2.     // 略..... 
  3.     //需要單獨的更新屬性 
  4.     this._updateDOMProperties(lastProps, nextProps, transaction, isCustomComponentTag); 
  5.     //再更新子節點 
  6.     this._updateDOMChildren( 
  7.       lastProps, 
  8.       nextProps, 
  9.       transaction
  10.       context 
  11.     ); 
  12.  
  13.     // ...... 
  14.  

this._updateDOMChildren方法內部調用diff算法,請看下一節........

react Diff算法

 diff算法源碼

  1. _updateChildren: function(nextNestedChildrenElements, transaction, context) { 
  2.     var prevChildren = this._renderedChildren; 
  3.     var removedNodes = {}; 
  4.     var mountImages = []; 
  5.      
  6.     // 獲取新的子元素數組 
  7.     var nextChildren = this._reconcilerUpdateChildren( 
  8.       prevChildren, 
  9.       nextNestedChildrenElements, 
  10.       mountImages, 
  11.       removedNodes, 
  12.       transaction
  13.       context 
  14.     ); 
  15.      
  16.     if (!nextChildren && !prevChildren) { 
  17.       return
  18.     } 
  19.      
  20.     var updates = null
  21.     var name
  22.     var nextIndex = 0; 
  23.     var lastIndex = 0; 
  24.     var nextMountIndex = 0; 
  25.     var lastPlacedNode = null
  26.  
  27.     for (name in nextChildren) { 
  28.       if (!nextChildren.hasOwnProperty(name)) { 
  29.         continue
  30.       } 
  31.       var prevChild = prevChildren && prevChildren[name]; 
  32.       var nextChild = nextChildren[name]; 
  33.       if (prevChild === nextChild) { 
  34.           // 同一個引用,說明是使用的同一個component,所以我們需要做移動的操作 
  35.           // 移動已有的子節點 
  36.           // NOTICE:這里根據nextIndex, lastIndex決定是否移動 
  37.         updates = enqueue( 
  38.           updates, 
  39.           this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex) 
  40.         ); 
  41.          
  42.         // 更新lastIndex 
  43.         lastIndex = Math.max(prevChild._mountIndex, lastIndex); 
  44.         // 更新component的.mountIndex屬性 
  45.         prevChild._mountIndex = nextIndex; 
  46.          
  47.       } else { 
  48.         if (prevChild) { 
  49.           // 更新lastIndex 
  50.           lastIndex = Math.max(prevChild._mountIndex, lastIndex); 
  51.         } 
  52.          
  53.         // 添加新的子節點在指定的位置上 
  54.         updates = enqueue( 
  55.           updates, 
  56.           this._mountChildAtIndex( 
  57.             nextChild, 
  58.             mountImages[nextMountIndex], 
  59.             lastPlacedNode, 
  60.             nextIndex, 
  61.             transaction
  62.             context 
  63.           ) 
  64.         ); 
  65.          
  66.          
  67.         nextMountIndex++; 
  68.       } 
  69.        
  70.       // 更新nextIndex 
  71.       nextIndex++; 
  72.       lastPlacedNode = ReactReconciler.getHostNode(nextChild); 
  73.     } 
  74.      
  75.     // 移除掉不存在的舊子節點,和舊子節點和新子節點不同的舊子節點 
  76.     for (name in removedNodes) { 
  77.       if (removedNodes.hasOwnProperty(name)) { 
  78.         updates = enqueue( 
  79.           updates, 
  80.           this._unmountChild(prevChildren[name], removedNodes[name]) 
  81.         ); 
  82.       } 
  83.     } 
  84.   }  

react的優點與總結

優點

  • 虛擬節點。在UI方面,不需要立刻更新視圖,而是生成虛擬DOM后統一渲染。
  • 組件機制。各個組件獨立管理,層層嵌套,互不影響,react內部實現的渲染功能。
  • 差異算法。根據基本元素的key值,判斷是否遞歸更新子節點,還是刪除舊節點,添加新節點。

總結

想要更好的利用react的虛擬DOM,diff算法的優勢,我們需要正確的優化、組織react頁面。例如將一個頁面render的ReactElement節點分解成多個組件。在需要優化的組件手動添加 shouldComponentUpdate 來避免不需要的 re-render。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2018-07-09 15:11:14

Java逃逸JVM

2015-03-17 09:44:08

2023-10-19 11:12:15

Netty代碼

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2021-02-17 11:25:33

前端JavaScriptthis

2019-06-25 10:32:19

UDP編程通信

2017-08-15 13:05:58

Serverless架構開發運維

2020-09-23 10:00:26

Redis數據庫命令

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2024-02-21 21:14:20

編程語言開發Golang

2025-06-05 05:51:33

2017-01-10 08:48:21

2021-09-08 06:51:52

AndroidRetrofit原理

2024-01-29 15:54:41

Java線程池公平鎖

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2022-11-04 09:43:05

Java線程
點贊
收藏

51CTO技術棧公眾號

美女免费视频一区二区| 色综合www| 亚洲综合成人网| 精品国产一区二区三| 天堂网一区二区| 天天操夜夜操国产精品| 亚洲国产精品999| 超碰av在线免费观看| 日本激情在线观看| 国产成人一区在线| 国产精品久久久久久av| 欧美精品一级片| 九九久久精品| 欧美xxxxx牲另类人与| 蜜臀视频一区二区三区| 免费网站在线观看人| 国产女人aaa级久久久级| 97久久人人超碰caoprom欧美| 天堂网中文字幕| 国产真实久久| 中文字幕一区二区精品| 特级西西人体4444xxxx| 国产一区二区三区黄网站| 欧美性开放视频| av动漫在线播放| 触手亚洲一区二区三区| 99精品国产热久久91蜜凸| 成人伊人精品色xxxx视频| 中文字幕精品无码一区二区| 欧美三级第一页| 色婷婷综合成人av| 亚洲一级中文字幕| 麻豆一区一区三区四区| 欧美一区二区视频在线观看2020 | 久久影院理伦片| 国产夫妻自拍av| 极品美女销魂一区二区三区| 国产精品v片在线观看不卡| 国产欧美日韩另类| 伊人久久婷婷| 欧美激情综合色综合啪啪五月| 黑人と日本人の交わりビデオ| 国产99久久| 精品视频一区在线视频| 欧亚乱熟女一区二区在线| 欧一区二区三区| 欧美一区二区三区白人| 国产欧美一区二| 一区二区三区| 正在播放亚洲一区| 免费成人黄色大片| av在线精品| 8x8x8国产精品| 1314成人网| 日韩一二三区| 亚洲精品一区二区三区福利| 无码人妻丰满熟妇啪啪网站| 亚洲视频国产精品| 日韩欧美久久久| 欧美久久久久久久久久久| 亚洲视频国产| 日韩极品精品视频免费观看| japanese中文字幕| 精品国内自产拍在线观看视频| 日韩不卡中文字幕| 午夜在线观看一区| 久久人体视频| 欧美另类在线观看| 日韩熟女精品一区二区三区| 亚洲欧美bt| 国产精品欧美久久久| 一本色道久久综合精品婷婷| 国产乱码精品一品二品| 国产精品美女久久久久av福利| 人妻少妇一区二区三区| 91蜜桃传媒精品久久久一区二区| 欧美精品一区二区三区在线四季 | 日韩欧美视频| 超碰97人人做人人爱少妇| 麻豆成人在线视频| 国产日韩亚洲| 国产精品嫩草视频| 性生交大片免费看女人按摩| 99视频精品全部免费在线| 日本不卡免费新一二三区| av黄色在线观看| 一区二区三区在线免费视频| 成人av一级片| 一区二区三区日本视频| 日韩av在线免费观看一区| 国产高潮呻吟久久| 欧美啪啪一区| 国产91色在线|免| 国产偷拍一区二区| 久久久久一区二区三区四区| 懂色av粉嫩av蜜臀av| 国产不卡123| 欧美老肥妇做.爰bbww| 91传媒理伦片在线观看| 精品国产一区一区二区三亚瑟| 九九精品在线播放| 免费在线不卡av| 福利电影一区二区| 亚洲一区二区三区精品在线观看| 国产精品186在线观看在线播放| 欧洲av一区二区嗯嗯嗯啊| 亚洲精品一区二区18漫画| 99精品视频播放| 成人精品一区二区| 亚洲一区二区三区国产| 99热手机在线| 美女一区二区在线观看| 久久久精品在线| 国产剧情在线视频| 国产ts人妖一区二区| 亚洲欧洲国产日韩精品| 碰碰在线视频| 欧美成人女星排名| 777777国产7777777| 米奇777在线欧美播放| 国产91视觉| 国产在线高清视频| 欧美日韩久久久久久| 双性尿奴穿贞c带憋尿| 韩国av一区| 亚洲自拍偷拍第一页| 丝袜美腿美女被狂躁在线观看| 精品国产乱码久久久久久婷婷| 中文字幕一二三区| 91精品二区| 91精品视频在线播放| h网站在线免费观看| 色悠久久久久综合欧美99| 亚洲视频在线播放免费| 欧美日韩四区| 96精品久久久久中文字幕| 色综合久久影院| 欧美三级蜜桃2在线观看| 成人h动漫精品一区| 中文一区在线| 久久av一区二区| 国产免费拔擦拔擦8x高清在线人| 精品国产电影一区二区| 欧美精品一区二区蜜桃| 丰满放荡岳乱妇91ww| 日韩视频一二三| 欧美视频精品全部免费观看| 精品国产依人香蕉在线精品| 91亚洲国产成人久久精品麻豆| 欧美激情一区二区三区在线| 99草草国产熟女视频在线| 国产探花一区| 国产精品自在线| 免费黄色网址在线观看| 色综合久久久久| av中文字幕免费观看| 久色成人在线| 婷婷久久伊人| 亚洲国产精选| 久久91亚洲人成电影网站| 午夜精品一二三区| 偷拍一区二区三区四区| 欧美高清性xxxx| 日韩和的一区二区| 最新精品视频| 亚洲超碰在线观看| 97精品视频在线观看| 青草久久伊人| 欧美日韩精品欧美日韩精品一 | 欧美激情一区在线| 欧美一级免费在线| 亚洲激情欧美| 日韩高清dvd| 免费一区二区三区在线视频| 国内精久久久久久久久久人| 你懂的视频在线播放| 欧美午夜精品久久久久久孕妇 | 一本一道久久a久久精品蜜桃 | 一色屋精品亚洲香蕉网站| 国产美女视频免费看| 激情综合视频| 天堂va久久久噜噜噜久久va| 国产精品亚洲欧美一级在线| 久久久亚洲精品视频| 欧美白人做受xxxx视频| 欧美日韩国产大片| 日本特黄特色aaa大片免费| 国产亚洲一区二区三区在线观看| 久久久久久久久久久久久久久国产 | 亚洲精品欧美精品| 超碰成人在线免费| 国产精品老女人视频| 欧洲在线视频| 一本色道久久综合亚洲精品小说 | 中文字幕高清在线免费播放| 中文字幕五月欧美| 国产精品久久久免费观看| 美国三级日本三级久久99| 成品人视频ww入口| 日韩在线观看一区 | 国产精品男女猛烈高潮激情| 96av在线| 久久久电影免费观看完整版| 免费看男男www网站入口在线 | 丰满少妇一区二区三区专区 | 97人人模人人爽人人澡| 午夜在线视频一区二区区别| 日本大胆人体视频| 四虎成人精品永久免费av九九| 精品一区二区三区日本| 精品麻豆剧传媒av国产九九九| 国产精品99导航| 国产第一页在线| 久久中文字幕国产| 69av在线| 亚洲一二在线观看| 香蕉国产在线视频| 日韩精品一区二区三区在线观看 | 少妇免费毛片久久久久久久久| 国产劲爆久久| 91久久爱成人| 国产精品视频一区二区三区| 国产精品永久在线| 亚洲天堂1区| 日产精品久久久一区二区福利| 国产极品人妖在线观看| 久久99热精品这里久久精品| 国产网友自拍视频导航网站在线观看 | 久久国产成人精品| 日本一区不卡| 久久99国产成人小视频| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲精品18| www国产亚洲精品| 精品视频一二| www 成人av com| 在线综合色站| 官网99热精品| 东京久久高清| 国内精品一区二区| 卡通动漫国产精品| 国产精选一区二区| 久久狠狠久久| 鲁丝一区鲁丝二区鲁丝三区| 女同久久另类99精品国产| 国产精品一区二区你懂得| 91嫩草精品| 国产伦精品一区二区三区免| 伦理一区二区| 日本高清久久一区二区三区| 免费观看不卡av| 欧美日韩精品免费观看| 精品成人影院| 一区二区日本伦理| 亚洲一区二区| 国产一区二区三区乱码| 亚洲免费精品| 亚洲乱码国产一区三区| 日本在线不卡一区| 天天操狠狠操夜夜操| 国产一区91精品张津瑜| 可以看的av网址| av在线不卡电影| 9.1成人看片免费版| 欧美激情一区二区三区不卡| 182在线观看视频| 亚洲综合丁香婷婷六月香| 国产污污视频在线观看| 一本大道久久a久久精品综合| 中文字幕第2页| 91精品国产高清一区二区三区| 不卡视频免费在线观看| 日韩成人av在线播放| 国产视频在线看| 另类美女黄大片| 国产伦理精品| 成人高清视频观看www| 超碰在线成人| 日产中文字幕在线精品一区| 自拍欧美日韩| 美女av免费在线观看| 蜜臀av一级做a爰片久久| 日韩成人av影院| 久久青草欧美一区二区三区| 国产高潮国产高潮久久久91| 精品国产成人av| 国产乱淫片视频| 日韩精品免费在线| 国产精品va在线观看视色| 韩剧1988在线观看免费完整版| 久久久人成影片一区二区三区在哪下载 | www.欧美色图| 91香蕉视频网| 岛国av一区二区三区| 91亚洲视频在线观看| 日韩高清免费在线| 免费黄网站在线| 日韩免费在线免费观看| 综合激情久久| 亚洲一区二区免费视频软件合集| 在线综合视频| 人妻激情偷乱视频一区二区三区| 久久婷婷一区二区三区| 久久高清无码视频| 欧美日本一道本在线视频| 亚洲三级黄色片| 久久国产精品久久久久久| gogo亚洲高清大胆美女人体 | 欧美女王vk| 日韩激情视频一区二区| 久久国产综合精品| 99久久久无码国产精品衣服| 午夜精品福利视频网站| 国产不卡av在线播放| 日韩有码在线观看| 视频二区不卡| 九色91国产| 极品av少妇一区二区| www.com久久久| 中文字幕精品一区| 日韩精品久久久久久免费| 亚洲大胆人体视频| 牛牛电影国产一区二区| 亚洲精品欧美一区二区三区| 成人网18免费网站| 日本一极黄色片| 久久综合久色欧美综合狠狠| 国产精选第一页| 精品国产乱子伦一区| 在线电影福利片| 91丨九色丨国产在线| 天天影视欧美综合在线观看| 久久综合伊人77777麻豆最新章节| 2024国产精品| 欧美国产成人精品一区二区三区| 亚洲国产高清高潮精品美女| 国产黄色大片在线观看| 国产高清一区视频| 亚洲特色特黄| 国产国语老龄妇女a片| 亚洲国产wwwccc36天堂| 亚洲狼人综合网| 午夜精品国产精品大乳美女| 久久久久97| 国产网站免费在线观看| 91视频在线看| 日日夜夜狠狠操| 在线视频中文亚洲| 不卡亚洲精品| 中文字幕在线中文字幕日亚韩一区| 美女网站视频久久| 神马午夜精品91| 欧美一级理论性理论a| 福利小视频在线| 精品国产_亚洲人成在线| 男女av一区三区二区色多| 成熟人妻av无码专区| 欧美日本一区二区在线观看| 亚洲性图自拍| 激情欧美一区二区三区中文字幕| 国产精品最新自拍| 五月激情四射婷婷| 欧美一区二区三区四区五区| 国产丝袜在线播放| 欧美视频观看一区| 久久国产成人午夜av影院| 欧美第一页在线观看| 亚洲成人在线视频播放| 国产欧美一区二区三区精品酒店| 日韩成人av电影在线| 国产麻豆91精品| 欧美另类一区二区| 一区二区三区国产视频| 久久在线观看| 青青草原成人网| 亚洲欧美在线aaa| 黄色美女一级片| 国产成人精品一区二区在线| 天天操综合网| 精品无码在线视频| 欧美日韩国产大片| 色资源二区在线视频| 新呦u视频一区二区| 成人少妇影院yyyy| 国产亚洲欧美日韩高清| 另类图片亚洲另类| 中文有码一区| 日本亚洲一区二区三区| 色综合天天综合网天天狠天天| 国产人成网在线播放va免费| 久久亚洲高清| 国产福利电影一区二区三区| 中文在线第一页| 欧美激情视频网| 久久性感美女视频| 人妻丰满熟妇aⅴ无码| 欧美一卡二卡三卡| 日本另类视频| 69sex久久精品国产麻豆| 国产精品二区一区二区aⅴ污介绍|