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

一文帶你徹底搞定Diff算法

云計算 虛擬化 算法
Diff算法實現的是最小量更新虛擬DOM。這句話雖然簡短,但是涉及到了兩個核心要素:虛擬DOM、最小量更新。虛擬DOM指的就是將真實的DOM樹構造為js對象的形式,從而解決瀏覽器操作真實DOM的性能問題。

[[420540]]

一、基礎

Diff算法實現的是最小量更新虛擬DOM。這句話雖然簡短,但是涉及到了兩個核心要素:虛擬DOM、最小量更新。

1.虛擬DOM

虛擬DOM指的就是將真實的DOM樹構造為js對象的形式,從而解決瀏覽器操作真實DOM的性能問題。

例如:如下DOM與虛擬DOM之間的映射關系

2.最小量更新

Diff的用途就是在新老虛擬DOM之間找到最小更新的部分,從而將該部分對應的DOM進行更新。

二、整個流程

Diff算法真的很美,整個流程如下圖所示:

  1. 首先比較一下新舊節點是不是同一個節點(可通過比較sel(選擇器)和key(唯一標識)值是不是相同),不是同一個節點則進行暴力刪除(注:先以舊節點為基準插入新節點,然后再刪除舊節點)。
  2. 若是同一個節點則需要進一步比較

完全相同,不做處理

新節點內容為文本,直接替換完事

新節點有子節點,這個時候就要仔細考慮一下了:若老節點沒有子元素,則直接清空老節點,將新節點的子元素插入即可;若老節點有子元素則就需要按照上述的更新策略老搞定了(記住更新策略,又可以吹好幾年了,666666)。

三、實戰

光說不練假把式,下面直接輸出diff算法的核心內容。

3.1 patch函數

Diff算法的入口函數,主要判斷新舊節點是不是同一個節點,然后交由不同的邏輯進行處理。

  1. export default function patch(oldVnode, newVnode) { 
  2.     // 判斷傳入的第一個參數,是DOM節點還是虛擬節點 
  3.     if (oldVnode.sel === '' || oldVnode.sel === undefined) { 
  4.         // 傳入的第一個參數是DOM節點,此時要包裝成虛擬節點 
  5.         oldVnode = vnode(oldVnode.tagName.toLowerCase(), {}, [], undefined, oldVnode); 
  6.     } 
  7.  
  8.     // 判斷oldVnode和newVnode是不是同一個節點 
  9.     if (oldVnode.key === newVnode.key && oldVnode.sel === newVnode.sel) { 
  10.         //是同一個節點,則進行精細化比較 
  11.         patchVnode(oldVnode, newVnode); 
  12.     } 
  13.     else { 
  14.         // 不是同一個節點,暴力插入新的,刪除舊的 
  15.         let newVnodeElm = createElement(newVnode); 
  16.  
  17.         // 將新節點插入到老節點之前 
  18.         if (oldVnode.elm.parentNode && newVnodeElm) { 
  19.             oldVnode.elm.parentNode.insertBefore(newVnodeElm, oldVnode.elm); 
  20.         } 
  21.         // 刪除老節點 
  22.         oldVnode.elm.parentNode.removeChild(oldVnode.elm); 
  23.     } 

3.2 patchVnode函數

該函數主要負責精細化比較,通過按照上述流程圖中的邏輯依次判斷屬于哪一個分支,從而采取不同的處理邏輯。(思路清晰,算法太牛了)

  1. export default function patchVnode(oldVnode, newVnode) { 
  2.     // 判斷新舊vnode是否是同一個對象 
  3.     if (oldVnode === newVnode) { 
  4.         return
  5.     } 
  6.     // 判斷vnode有沒有text屬性 
  7.     if (newVnode.text !== undefined && (newVnode.children === undefined || newVnode.children.length === 0)) { 
  8.         console.log('新vnode有text屬性'); 
  9.         if (newVnode.text !== oldVnode.text) { 
  10.             oldVnode.elm.innerText = newVnode.text; 
  11.         } 
  12.     } 
  13.     else { 
  14.         // 新vnode沒有text屬性,有children 
  15.         console.log('新vnode沒有text屬性'); 
  16.         // 判斷老的有沒有children 
  17.         if (oldVnode.children !== undefined && oldVnode.children.length > 0) { 
  18.             // 老的有children,新的也有children 
  19.             updateChildren(oldVnode.elm, oldVnode.children, newVnode.children); 
  20.         } 
  21.         else { 
  22.             // 老的沒有children,新的有children 
  23.             // 清空老的節點的內容 
  24.             oldVnode.elm.innerHTML = ''
  25.             // 遍歷新的vnode的子節點,創建DOM,上樹 
  26.             for (let i = 0; i < newVnode.children.length; i++) { 
  27.                 let dom = createElement(newVnode.children[i]); 
  28.                 oldVnode.elm.appendChild(dom); 
  29.             } 
  30.         } 
  31.     } 

3.3 updateChildren函數

核心函數,主要負責舊虛擬節點和新虛擬節點均存在子元素的情況,按照比較策略依次進行比較,最終找出子元素中變化的部分,實現最小更新。對于該部分,涉及到一些指針,如下所示:

  1. 舊前指的就是更新前虛擬DOM中的頭部指針
  2. 舊后指的就是更新前虛擬DOM中的尾部指針
  3. 新前指的就是更新后虛擬DOM中的頭部指針
  4. 新后指的就是更新后虛擬DOM中的尾部指針

按照上述的更新策略,上述舊虛擬DOM更新為新虛擬DOM的流程為:

  1. 命中“新后舊前”策略,然后將信后對應的DOM節點(也就是節點1)移動到舊后節點(節點3)后面,然后舊前節點指針下移,新后節點指針上移。
  2. 仍然命中“新后舊前”策略,做相同的操作,將節點2移動到舊后節點(節點3)后面,下移舊前節點,上移新后節點。
  3. 命中“新前舊前”策略,DOM節點不變,舊前和新前節點均下移。
  4. 跳出循環,移動結束。
  1. export default function updateChildren(parentElm, oldCh, newCh) { 
  2.     // 舊前 
  3.     let oldStartIdx = 0; 
  4.     // 新前 
  5.     let newStartIdx = 0; 
  6.     // 舊后 
  7.     let oldEndIdx = oldCh.length - 1; 
  8.     // 新后 
  9.     let newEndIdx = newCh.length - 1; 
  10.     // 舊前節點 
  11.     let oldStartVnode = oldCh[0]; 
  12.     // 舊后節點 
  13.     let oldEndVnode = oldCh[oldEndIdx]; 
  14.     // 新前節點 
  15.     let newStartVnode = newCh[0]; 
  16.     // 新后節點 
  17.     let newEndVnode = newCh[newEndIdx]; 
  18.  
  19.     let keyMap = null
  20.  
  21.     while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) { 
  22.         // 略過已經加undefined標記的內容 
  23.         if (oldStartVnode == null || oldCh[oldStartIdx] === undefined) { 
  24.             oldStartVnode = oldCh[++oldStartIdx]; 
  25.         } 
  26.         else if (oldEndVnode == null || oldCh[oldEndIdx] === undefined) { 
  27.             oldEndVnode = oldCh[--oldEndIdx]; 
  28.         } 
  29.         else if (newStartVnode == null || newCh[newStartIdx] === undefined) { 
  30.             newStartVnode = newCh[++newStartIdx]; 
  31.         } 
  32.         else if (newEndVnode == null || newCh[newEndIdx] === undefined) { 
  33.             newEndVnode = newCh[--newEndIdx]; 
  34.         } 
  35.         else if (checkSameVnode(oldStartVnode, newStartVnode)) { 
  36.             // 新前與舊前 
  37.             console.log('新前與舊前命中'); 
  38.             patchVnode(oldStartVnode, newStartVnode); 
  39.             oldStartVnode = oldCh[++oldStartIdx]; 
  40.             newStartVnode = newCh[++newStartIdx]; 
  41.         } 
  42.         else if (checkSameVnode(oldEndVnode, newEndVnode)) { 
  43.             // 新后和舊后 
  44.             console.log('新后和舊后命中'); 
  45.             patchVnode(oldEndVnode, newEndVnode); 
  46.             oldEndVnode = oldCh[--oldEndIdx]; 
  47.             newEndVnode = newCh[--newEndVnode]; 
  48.         } 
  49.         else if (checkSameVnode(oldStartVnode, newEndVnode)) { 
  50.             console.log('新后和舊前命中'); 
  51.             patchVnode(oldStartVnode, newEndVnode); 
  52.             // 當新后與舊前命中的時候,此時要移動節點,移動新后指向的這個節點到老節點舊后的后面 
  53.             parentElm.insertBefore(oldStartVnode.elm, oldEndVnode.elm.nextSibling); 
  54.             oldStartVnode = oldCh[++oldStartIdx]; 
  55.             newEndVnode = newCh[--newEndIdx]; 
  56.         } 
  57.         else if (checkSameVnode(oldEndVnode, newStartVnode)) { 
  58.             // 新前和舊后 
  59.             console.log('新前和舊后命中'); 
  60.             patchVnode(oldEndVnode, newStartVnode); 
  61.             // 當新前和舊后命中的時候,此時要移動節點,移動新前指向的這個節點到老節點舊前的前面 
  62.             parentElm.insertBefore(oldEndVnode.elm, oldStartVnode.elm); 
  63.             oldEndVnode = oldCh[--oldEndIdx]; 
  64.             newStartVnode = newCh[++newStartIdx]; 
  65.         } 
  66.         else { 
  67.             // 四種都沒有命中 
  68.             // 制作keyMap一個映射對象,這樣就不用每次都遍歷老對象了 
  69.             if (!keyMap) { 
  70.                 keyMap = {}; 
  71.                 for (let i = oldStartIdx; i <= oldEndIdx; i++) { 
  72.                     const key = oldCh[i].key
  73.                     if (key !== undefined) { 
  74.                         keyMap[key] = i; 
  75.                     } 
  76.                 } 
  77.             } 
  78.             // 尋找當前這項(newStartIdx)在keyMap中的映射的位置序號 
  79.             const idxInOld = keyMap[newStartVnode.key]; 
  80.             if (idxInOld === undefined) { 
  81.                 // 如果idxInOld是undefined表示踏實全新的項,此時會將該項創建為DOM節點并插入到舊前之前 
  82.                 parentElm.insertBefore(createElement(newStartVnode), oldStartVnode.elm); 
  83.             } 
  84.             else { 
  85.                 // 如果不是undefined,則不是全新的項,則需要移動 
  86.                 const elmToMove = oldCh[idxInOld]; 
  87.                 patchVnode(elmToMove, newStartVnode); 
  88.                 // 把這項設置為undefined,表示已經處理完這項了 
  89.                 oldCh[idxInOld] = undefined; 
  90.                 // 移動 
  91.                 parentElm.insertBefore(elmToMove.elm, oldStartVnode.elm); 
  92.             } 
  93.             // 指針下移,只移動新的頭 
  94.             newStartVnode = newCh[++newStartIdx]; 
  95.         } 
  96.     } 
  97.  
  98.     // 循環結束后,處理未處理的項 
  99.     if (newStartIdx <= newEndIdx) { 
  100.         console.log('new還有剩余節點沒有處理,要加項,把所有剩余的節點插入到oldStartIdx之前'); 
  101.         // 遍歷新的newCh,添加到老的沒有處理的之前 
  102.         for (let i = newStartIdx; i <= newEndIdx; i++) { 
  103.             // insertBefore方法可以自動識別null,如果是null就會自動排到隊尾去 
  104.             // newCh[i]現在還沒有真正的DOM,所以要調用createElement函數變為DOM 
  105.             parentElm.insertBefore(createElement(newCh[i]), oldCh[oldStartIdx].elm); 
  106.         } 
  107.     } 
  108.     else if (oldStartIdx <= oldEndIdx) { 
  109.         console.log('old還有剩余節點沒有處理,要刪除項'); 
  110.         // 批量刪除oldStart和oldEnd指針之間的項 
  111.         for (let i = oldStartIdx; i <= oldEndIdx; i++) { 
  112.             if (oldCh[i]) { 
  113.                 parentElm.removeChild(oldCh[i].elm); 
  114.             } 
  115.         } 
  116.     } 

【編輯推薦】

責任編輯:姜華 來源: 前端點線面
相關推薦

2023-10-27 08:15:45

2023-12-15 09:45:21

阻塞接口

2023-12-12 07:31:51

Executors工具開發者

2021-04-19 17:32:34

Java內存模型

2021-04-02 06:17:10

大數加減乘除數據結構算法

2018-10-22 08:14:04

2021-08-05 06:54:05

觀察者訂閱設計

2024-10-16 10:11:52

2022-05-11 07:38:45

SpringWebFlux

2022-03-14 08:01:06

LRU算法線程池

2020-06-03 08:19:00

Kubernetes

2020-05-11 14:35:11

微服務架構代碼

2023-11-20 08:18:49

Netty服務器

2023-12-21 17:11:21

Containerd管理工具命令行

2022-12-20 07:39:46

2023-07-31 08:18:50

Docker參數容器

2023-11-06 08:16:19

APM系統運維

2021-05-29 10:11:00

Kafa數據業務

2022-11-11 19:09:13

架構

2020-05-13 09:14:16

哈希表數據結構
點贊
收藏

51CTO技術棧公眾號

亚洲色图第三页| 黄色91在线观看| 国产在线播放不卡| 久久久久成人片免费观看蜜芽| 亚洲国产一区二区三区网站| 精品久久久久久久久久国产| 亚洲精品一区二区三区樱花| av免费在线不卡| 国产精品久久久久久久久久妞妞 | 日韩中文在线| 欧美视频二区36p| 伊人av成人| 女人18毛片一区二区三区| 久久成人亚洲| 欧美疯狂做受xxxx高潮| b站大片免费直播| 欧美精品三级在线| 欧美性三三影院| 欧美日韩不卡在线视频| www日韩tube| 高清日韩电视剧大全免费| 国产精品91在线| 欧美丰满艳妇bbwbbw| 九色精品国产蝌蚪| 欧美videofree性高清杂交| 情侣黄网站免费看| gratisvideos另类灌满| 国产精品久久久久久妇女6080 | 中文字幕无线精品亚洲乱码一区 | 美女av一区| 91精选在线观看| 免费观看成人在线视频| 黄页网站在线| 夜夜夜精品看看| 一本一道久久久a久久久精品91 | av在线免费观看国产| 亚洲成人三级| 国产拍揄自揄精品视频麻豆| 国产在线一区二区三区欧美| www.xxx国产| 国内精品写真在线观看| 国产精品视频区| 极品国产91在线网站| 99在线热播精品免费99热| 欧美人在线视频| 日本在线一级片| 99re6这里只有精品| 国产亚洲成av人片在线观看桃| 黄色免费看视频| 久久香蕉精品香蕉| 亚洲成人aaa| av天堂一区二区| 日本免费精品| 欧美一区二区三区免费在线看| 五月婷婷丁香综合网| 国产精品高清乱码在线观看 | 国产精品久久久久久久久久久久久久久久久 | 18视频在线观看网站| 国产精品精品国产色婷婷| 青青草原成人| 韩国三级在线观看久| 久久久三级国产网站| 欧美日韩一区二区三区在线观看免| 日本黄色大片视频| k8久久久一区二区三区| 国产乱码精品一区二区三区日韩精品 | lutube成人福利在线观看| 国产亚洲精品久| 天天综合色天天综合色hd| 3d成人动漫在线| 日韩毛片高清在线播放| 免费观看黄色的网站| 麻豆传媒免费在线观看| 一区二区三区精品在线| 免费视频爱爱太爽了| av最新在线| 91久久一区二区| 最新天堂在线视频| 欧美午夜在线播放| 亚洲国产成人一区| www.色天使| 欧美电影免费| 欧美大片第1页| 中文字幕亚洲精品一区| 日韩影院在线观看| 91精品久久久久久久久青青| 国产偷拍一区二区| 26uuu亚洲| 日韩中文字幕av在线| 国产在线看片| 精品av在线播放| 成年网站在线播放| 91精品导航| 在线观看国产精品91| 日本aⅴ在线观看| 亚洲综合激情| 91啪国产在线| 欧美女v视频| ...xxx性欧美| 国产成人精品视频免费看| 粉嫩av一区二区三区四区五区 | 一路向西2在线观看| 亚洲视频国产| 中文字幕9999| 国产69精品久久久久久久久久| 美洲天堂一区二卡三卡四卡视频| 丁香婷婷久久久综合精品国产 | 26uuu欧美| 二级片在线观看| 中文字幕成在线观看| 7777精品伊人久久久大香线蕉的 | 国产女主播一区| 日b视频免费观看| 国产一区影院| 亚洲欧美国内爽妇网| 免费中文字幕日韩| 日韩不卡免费视频| 国模精品一区二区三区| 米奇777四色精品人人爽| 午夜精品久久久久久久99水蜜桃| 奇米影视四色在线| 亚洲三级性片| 久久久久久亚洲精品不卡| 亚洲无码久久久久| wwwwxxxxx欧美| 国产精品入口芒果| 精品久久免费| 中文字幕日韩欧美精品在线观看| 久久久久久少妇| 成熟亚洲日本毛茸茸凸凹| 中文视频一区视频二区视频三区| 深夜成人影院| 日韩久久免费视频| 色播视频在线播放| 国产aⅴ综合色| 最新av在线免费观看| 99久久伊人| 国产一区二区三区视频免费| 99热在线观看免费精品| 不卡av在线网| 久草视频这里只有精品| 日本一区二区三区视频在线看| 中文字幕亚洲欧美日韩高清| 无码人妻av免费一区二区三区| 99在线热播精品免费| 97久久国产亚洲精品超碰热| 国产精品久久久久久久久久辛辛| 少妇久久久久久| 亚洲男人天堂网址| 国产欧美一区二区精品性色| 六月丁香婷婷在线| 亚洲人成精品久久久 | 国产午夜久久久| 丰满岳乱妇一区二区三区| 成人短视频在线观看免费| 日本青青草视频| 成人在线免费小视频| 国产成人精品视| 国产精品一二三区视频| 欧洲精品在线观看| 青青青视频在线播放| 日本不卡视频在线| 亚洲一区3d动漫同人无遮挡| 欧美特黄色片| 欧美精品免费在线观看| 超碰在线观看av| 天天色天天操综合| 中文字幕人妻一区二区| 日本中文字幕一区二区视频| 亚洲精品影院| 亚洲国产中文在线| 97av在线影院| 第一福利在线| 在线播放/欧美激情| 久久精品99国产精| 99久久精品国产精品久久| 免费欧美一级视频| 日韩av在线播放网址| 91亚洲精品久久久久久久久久久久| a视频在线免费看| 亚洲国产精品福利| 日韩精选在线观看| 亚洲综合男人的天堂| 波多野结衣先锋影音| 日韩精品乱码av一区二区| 宅男噜噜99国产精品观看免费| 日韩在线亚洲| 国产成人精品综合久久久| 欧美日韩xx| 亚洲国产精彩中文乱码av| 国产女主播喷水视频在线观看| 国产精品美女一区二区在线观看| 精品国产aⅴ一区二区三区东京热| 夜夜嗨网站十八久久| 色999日韩自偷自拍美女| 国内不卡的一区二区三区中文字幕| 久久久免费精品| 99青草视频在线播放视| 亚洲电影免费观看高清完整版在线观看| 亚洲欧美综合另类| 亚洲精品乱码久久久久久| 疯狂揉花蒂控制高潮h| 久久99久国产精品黄毛片色诱| 免费人成自慰网站| 日韩欧美中字| 久久人人97超碰人人澡爱香蕉| 豆花视频一区| 国产成人综合亚洲| bbw在线视频| 播播国产欧美激情| 九色在线观看视频| 欧美精品一区二区三| 亚洲专区在线播放| 日韩欧美在线视频免费观看| 全网免费在线播放视频入口| 久久久国产精华| 黄色av网址在线观看| 国精品**一区二区三区在线蜜桃| 精品视频一区二区在线| 极品av少妇一区二区| 在线看成人av电影| 激情五月综合| 精选一区二区三区四区五区| 日韩区欧美区| 国产日韩欧美在线观看| 日韩久久一区二区三区| 97成人超碰免| av电影在线免费| 久久99久久99精品中文字幕| 欧美videos极品另类| 在线精品播放av| 激情小说 在线视频| 日韩成人中文字幕在线观看| 亚洲精品字幕在线观看| 91麻豆精品国产91久久久资源速度 | 亚洲精品国久久99热| 日本视频在线免费| 欧美韩日一区二区三区四区| 欧美狂猛xxxxx乱大交3| 99re66热这里只有精品3直播 | 亚洲精品一区二区二区| 色婷婷亚洲精品| 国产精品一区二区三区四| 亚洲国产精品影院| 国产一级做a爱免费视频| 亚洲免费电影在线| 日韩黄色免费观看| 一区二区在线电影| 久草视频免费播放| 亚洲国产精品人人做人人爽| 国产一级片视频| 亚洲国产视频一区| 丰满少妇乱子伦精品看片| 亚洲成a人v欧美综合天堂| 久久视频免费看| 亚洲国产中文字幕在线视频综合| 久久久www成人免费毛片| 亚洲尤物在线视频观看| www.youjizz.com亚洲| 亚洲r级在线视频| 五月婷婷中文字幕| 日本高清不卡aⅴ免费网站| 中文字幕欧美色图| 欧美精品在欧美一区二区少妇| 91丨porny丨在线中文| 欧美一区二区二区| 十八禁一区二区三区| 亚洲第一精品自拍| 黄色片在线免费看| 久久精品视频免费播放| 三级福利片在线观看| 午夜精品蜜臀一区二区三区免费 | 亚洲成人资源在线| 欧美videossex极品| 欧美亚洲尤物久久| 国产毛片毛片毛片毛片| 欧美xxx久久| 青青操在线视频| 日韩小视频在线| 美女精品导航| 国产福利视频一区二区| 日韩大陆av| 国产欧美一区二区视频| 欧美男gay| 精品少妇人妻av一区二区| 亚洲夜间福利| 一区二区三区入口| 国产成人午夜精品影院观看视频| avtt香蕉久久| 亚洲欧洲成人精品av97| 国产无遮无挡120秒| 欧美亚洲国产一卡| 隣の若妻さん波多野结衣| 国产一区二区三区在线| 影音先锋在线播放| 日本最新高清不卡中文字幕| 国产精品久久乐| 国产伦精品一区二区三区在线 | 一区二区日本伦理| 极品中文字幕一区| 亚洲欧美偷拍另类| 久久综合九色欧美综合狠狠| 日韩精品123区| 欧美日韩亚洲精品一区二区三区| 国产精品国产三级国产aⅴ| 亚洲国产天堂久久国产91 | 九九热最新视频//这里只有精品| 性爽视频在线| 99re热精品| 欧美一站二站| 2022亚洲天堂| 高潮精品一区videoshd| 91大神福利视频| 色综合一区二区| 刘亦菲久久免费一区二区| 久久黄色av网站| 欧美色片在线观看| 麻豆av一区二区三区| 一区福利视频| 波多野结衣电影免费观看| 日本一区二区三级电影在线观看| 日韩久久久久久久久| 91精品国产综合久久久久久漫画 | 久久亚洲影音av资源网| 最新日韩一区| 六月婷婷久久| 亚洲精品影院在线观看| 国产又粗又猛又爽又黄| 国产精品大尺度| 在线播放国产一区| 一区三区二区视频| 欧美大胆成人| 欧美日韩国产综合视频在线| 亚洲精品1234| 日韩黄色一区二区| 亚洲综合一二区| 精品久久在线观看| 欧美成人免费全部| 久久久91麻豆精品国产一区| 自拍亚洲欧美老师丝袜| 麻豆精品在线看| 中国美女黄色一级片| 欧美午夜影院一区| av一区在线观看| 国产狼人综合免费视频| 精品日韩欧美一区| 超碰在线97免费| 国产精品久久久久影院亚瑟| 中文字幕第31页| 日韩一区av在线| 91丨精品丨国产| 国产一级片91| 盗摄精品av一区二区三区| 久久久精品视频免费| 亚洲国产精品免费| 在线天堂资源| 女女同性女同一区二区三区91| 亚洲欧美卡通另类91av| 好吊视频在线观看| 欧美午夜寂寞影院| 毛片网站在线免费观看| 亚洲最大福利视频| 狠狠干成人综合网| 亚洲成人日韩在线| 欧美又粗又大又爽| av大片在线| 国模一区二区三区私拍视频| 亚洲欧美清纯在线制服| 日韩一级片在线免费观看| 欧美浪妇xxxx高跟鞋交| 在线观看三级视频| 精品一区二区国产| 日韩电影在线观看一区| www深夜成人a√在线| 精品国产乱码久久久久久图片| 在线成人av观看| 亚洲精品无人区| 国产999精品久久久久久绿帽| 日本一级片免费看| 夜夜嗨av色综合久久久综合网| 啪啪av大全导航福利综合导航| 国内精品国产三级国产99| 91小视频在线观看| ,一级淫片a看免费| 午夜精品福利电影| 成人久久电影| 国产情侣久久久久aⅴ免费| 91国偷自产一区二区开放时间| 美女国产在线| 久久久久久99| 国产一区二区三区国产| 天天干天天干天天| 九九久久久久99精品| 免费看av成人| 国产伦理在线观看| 91国产视频在线观看| 伊人影院在线视频| 神马影院一区二区三区| 国产99久久久精品| 中文字幕人妻精品一区|