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

給 Antd Table 組件編寫縮進指引線、子節點懶加載等功能,如何二次封裝開源組件?

開源
在業務需求中,有時候我們需要基于 antd 之類的組件庫定制很多功能,本文就以我自己遇到的業務需求為例,一步步實現和優化一個樹狀表格組件。

[[384776]]

在業務需求中,有時候我們需要基于 antd 之類的組件庫定制很多功能,本文就以我自己遇到的業務需求為例,一步步實現和優化一個樹狀表格組件,這個組件會支持:

  • 每個層級縮進指示線
  • 遠程懶加載子節點
  • 每個層級支持分頁

本系列分為兩篇文章,這篇只是講這些業務需求如何實現。

而下一篇,我會講解怎么給組件也設計一套簡單的插件機制,來解決代碼耦合,難以維護的問題。

功能實現

層級縮進線

antd 的 Table 組件默認是沒有提供這個功能的,它只是支持了樹狀結構:

  1. const treeData = [ 
  2.   { 
  3.     function_name: `React Tree Reconciliation`, 
  4.     count: 100, 
  5.     children: [ 
  6.       { 
  7.         function_name: `React Tree Reconciliation2`, 
  8.         count: 100 
  9.       } 
  10.     ] 
  11.   } 

展示效果如下:

antd-table

 

可以看出,在展示大量的函數堆棧的時候,沒有縮進線就會很難受了,業務方也確實和我提過這個需求,可惜之前太忙了,就暫時放一邊了。😁

參考 VSCode 中的縮進線效果,可以發現,縮進線是和節點的層級緊密相關的。

vscode

 

比如 src 目錄對應的是第一級,那么它的子級 client 和 node 就只需要在 td 前面繪制一條垂直線,而 node 下的三個目錄則繪制兩條垂直線。

  1. 第 1 層: | text 
  2. 第 2 層: | | text 
  3. 第 3 層: | | | text 

只需要在自定義渲染單元格元素的時候,得到以下兩個信息。

  1. 當前節點的層級信息。
  2. 當前節點的父節點是否是展開狀態。

所以思路就是對數據進行一次遞歸處理,把層級寫在節點上,并且要把父節點的引用也寫上,之后再通過傳給 Table 的 expandedRowKeys 屬性來維護表格的展開行數據。

這里我是直接改寫了原始數據,如果需要保證原始數據干凈的話,也可以參考 React Fiber 的思路,構建一顆替身樹進行數據寫入,只要保留原始樹節點的引用即可。

  1. /** 
  2.  * 遞歸樹的通用函數 
  3.  */ 
  4. const traverseTree = ( 
  5.   treeList, 
  6.   childrenColumnName, 
  7.   callback 
  8. ) => { 
  9.   const traverse = (list, parent = nulllevel = 1) => { 
  10.     list.forEach(treeNode => { 
  11.       callback(treeNode, parent, level); 
  12.       const { [childrenColumnName]: next } = treeNode; 
  13.       if (Array.isArray(next)) { 
  14.         traverse(next, treeNode, level + 1); 
  15.       } 
  16.     }); 
  17.   }; 
  18.   traverse(treeList); 
  19. }; 
  20.  
  21. function rewriteTree({ dataSource }) { 
  22.   traverseTree(dataSource, childrenColumnName, (node, parent, level) => { 
  23.     // 記錄節點的層級 
  24.     node[INTERNAL_LEVEL] = level 
  25.     // 記錄節點的父節點 
  26.     node[INTERNAL_PARENT] = parent 
  27.   }) 

之后利用 Table 組件提供的 components 屬性,自定義渲染 Cell 組件,也就是 td 元素。

  1. const components = { 
  2.   body: { 
  3.     cell: (cellProps) => ( 
  4.       <TreeTableCell 
  5.         {...props} 
  6.         {...cellProps} 
  7.         expandedRowKeys={expandedRowKeys} 
  8.       /> 
  9.     ) 
  10.   } 

之后,在自定義渲染的 Cell 中,只需要獲取兩個信息,只需要根據層級和父節點的展開狀態,來決定繪制幾條垂直線即可。

  1. const isParentExpanded = expandedRowKeys.includes( 
  2.   record?.[INTERNAL_PARENT]?.[rowKey] 
  3. // 只有當前是展示指引線的列 且父節點是展開節點 才會展示縮進指引線 
  4. if (dataIndex !== indentLineDataIndex || !isParentExpanded) { 
  5.   return <td className={className}>{children}</td> 
  6.  
  7. // 只要知道層級 就知道要在 td 中繪制幾條垂直指引線 舉例來說: 
  8. // 第 2 層: | | text 
  9. // 第 3 層: | | | text 
  10. const level = record[INTERNAL_LEVEL] 
  11.  
  12. const indentLines = renderIndentLines(level

這里的實現就不再贅述,直接通過絕對定位畫幾條垂直線,再通過對 level 進行循環時的下標 index 決定 left 的偏移值即可。

效果如圖所示:

縮進線

 

遠程懶加載子節點

這個需求就需要用比較 hack 的手段實現了,首先觀察了一下 Table 組件的邏輯,只有在有children 的子節點上才會展示「展開更多」的圖標。

所以思路就是,和后端約定一個字段比如 has_next,之后預處理數據的時候先遍歷這些節點,加上一個假的占位 children。

之后在點擊展開的時候,把節點上的這個假 children 刪除掉,并且把通過改寫節點上一個特殊的 is_loading 字段,在自定義渲染 Icon 的代碼中判斷,并且展示 Loading Icon。

又來到遞歸樹的邏輯中,我們加入這樣的一段代碼:

  1. function rewriteTree({ dataSource }) { 
  2.   traverseTree(dataSource, childrenColumnName, (node, parent, level) => { 
  3.     if (node[hasNextKey]) { 
  4.       // 樹表格組件要求 next 必須是非空數組才會渲染「展開按鈕」 
  5.       // 所以這里手動添加一個占位節點數組 
  6.       // 后續在 onExpand 的時候再加載更多節點 并且替換這個數組 
  7.       node[childrenColumnName] = [generateInternalLoadingNode(rowKey)] 
  8.     } 
  9.   }) 

之后我們要實現一個 forceUpdate 函數,驅動組件強制渲染:

  1. const [_, forceUpdate] = useReducer((x) => x + 1, 0) 

再來到 onExpand 的邏輯中:

  1. const onExpand = async (expanded, record) => { 
  2.   if (expanded && record[hasNextKey] && onLoadMore) { 
  3.     // 標識節點的 loading 
  4.     record[INTERNAL_IS_LOADING] = true 
  5.     // 移除用來展示展開箭頭的假 children 
  6.     record[childrenColumnName] = null 
  7.     forceUpdate() 
  8.     const childList = await onLoadMore(record) 
  9.     record[hasNextKey] = false 
  10.     addChildList(record, childList) 
  11.   } 
  12.   onExpandProp?.(expanded, record) 
  13.  
  14. function addChildList(record, childList) { 
  15.   record[childrenColumnName] = childList 
  16.   record[INTERNAL_IS_LOADING] = false 
  17.   rewriteTree({ 
  18.     dataSource: childList, 
  19.     parentNode: record 
  20.   }) 
  21.   forceUpdate() 

這里 onLoadMore 是用戶傳入的獲取更多子節點的方法,

流程是這樣的:

  1. 節點展開時,先給節點寫入一個正在加載的標志,然后把子數據重置為空。這樣雖然節點會變成展開狀態,但是不會渲染子節點,然后強制渲染。
  2. 在加載完成后賦值了新的子節點 record[childrenColumnName] = childList 后,我們又通過 forceUpdate 去強制組件重渲染,展示出新的子節點。

需要注意,我們遞歸樹加入邏輯的所有邏輯都在 rewriteTree 中,所以對于加入的新的子節點,也需要通過這個函數遞歸一遍,加入 level, parent 等信息。

新加入的節點的 level 需要根據父節點的 level 相加得出,不能從 1 開始,否則渲染的縮進線就亂掉了,所以這個函數需要改寫,加入 parentNode 父節點參數,遍歷時寫入的 level 都要加上父節點已有的 level。

  1. function rewriteTree({ 
  2.   dataSource, 
  3.   // 在動態追加子樹節點的時候 需要手動傳入 parent 引用 
  4.   parentNode = null 
  5. }) { 
  6.   // 在動態追加子樹節點的時候 需要手動傳入父節點的 level 否則 level 會從 1 開始計算 
  7.   const startLevel = parentNode?.[INTERNAL_LEVEL] || 0 
  8.  
  9.   traverseTree(dataSource, childrenColumnName, (node, parent, level) => { 
  10.       parent = parent || parentNode; 
  11.       // 記錄節點的層級 
  12.       node[INTERNAL_LEVEL] = level + startLevel; 
  13.       // 記錄節點的父節點 
  14.       node[INTERNAL_PARENT] = parent; 
  15.  
  16.     if (node[hasNextKey]) { 
  17.       // 樹表格組件要求 next 必須是非空數組才會渲染「展開按鈕」 
  18.       // 所以這里手動添加一個占位節點數組 
  19.       // 后續在 onExpand 的時候再加載更多節點 并且替換這個數組 
  20.       node[childrenColumnName] = [generateInternalLoadingNode(rowKey)] 
  21.     } 
  22.   }) 

自定義渲染 Loading Icon 就很簡單了:

  1. // 傳入給 Table 組件的 expandIcon 屬性即可 
  2. export const TreeTableExpandIcon = ({ 
  3.   expanded, 
  4.   expandable, 
  5.   onExpand, 
  6.   record 
  7. }) => { 
  8.   if (record[INTERNAL_IS_LOADING]) { 
  9.     return <IconLoading style={iconStyle} /> 
  10.   } 

功能完成,看一下效果:

遠程懶加載

 

每個層級支持分頁

這個功能和上一個功能也有點類似,需要在 rewriteTree 的時候根據外部傳入的是否開啟分頁的字段,在符合條件的時候往子節點數組的末尾加入一個占位 Pagination 節點。

之后在 column 的 render 中改寫這個節點的渲染邏輯。

改寫 record:

  1. function rewriteTree({ 
  2.   dataSource, 
  3.   // 在動態追加子樹節點的時候 需要手動傳入 parent 引用 
  4.   parentNode = null 
  5. }) { 
  6.   // 在動態追加子樹節點的時候 需要手動傳入父節點的 level 否則 level 會從 1 開始計算 
  7.   const startLevel = parentNode?.[INTERNAL_LEVEL] || 0 
  8.  
  9.   traverseTree(dataSource, childrenColumnName, (node, parent, level) => { 
  10.     // 加載更多邏輯 
  11.     if (node[hasNextKey]) { 
  12.       // 樹表格組件要求 next 必須是非空數組才會渲染「展開按鈕」 
  13.       // 所以這里手動添加一個占位節點數組 
  14.       // 后續在 onExpand 的時候再加載更多節點 并且替換這個數組 
  15.       node[childrenColumnName] = [generateInternalLoadingNode(rowKey)] 
  16.     } 
  17.  
  18.     // 分頁邏輯 
  19.     if (childrenPagination) { 
  20.       const { totalKey } = childrenPagination; 
  21.       const nodeChildren = node[childrenColumnName] || []; 
  22.       const [lastChildNode] = nodeChildren.slice?.(-1); 
  23.       // 渲染分頁器,先加入占位節點 
  24.       if ( 
  25.         node[totalKey] > nodeChildren?.length && 
  26.         // 防止重復添加分頁器占位符 
  27.         !isInternalPaginationNode(lastChildNode, rowKey) 
  28.       ) { 
  29.         nodeChildren?.push?.(generateInternalPaginationNode(rowKey)); 
  30.       } 
  31.     } 
  32.   }) 

改寫 columns:

  1. function rewriteColumns() { 
  2.   /** 
  3.    * 根據占位符 渲染分頁組件 
  4.    */ 
  5.   const rewritePaginationRender = (column) => { 
  6.     column.render = function ColumnRender(text, record) { 
  7.       if ( 
  8.         isInternalPaginationNode(record, rowKey) && 
  9.         dataIndex === indentLineDataIndex 
  10.       ) { 
  11.         return <Pagination /> 
  12.       } 
  13.       return render?.(text, record) ?? text 
  14.     } 
  15.   } 
  16.  
  17.   columns.forEach((column) => { 
  18.     rewritePaginationRender(column
  19.   }) 

來看一下實現的分頁效果:

 

重構和優化

隨著編寫功能的增多,邏輯被耦合在 Antd Table 的各個回調函數之中,

  • 指引線的邏輯分散在 rewriteColumns, components中。
  • 分頁的邏輯被分散在 rewriteColumns 和 rewriteTree 中。
  • 加載更多的邏輯被分散在 rewriteTree 和 onExpand 中

至此,組件的代碼行數也已經來到了 300 行,大概看一下代碼的結構,已經是比較混亂了:

  1. export const TreeTable = (rawProps) => { 
  2.   function rewriteTree() { 
  3.     // 🎈加載更多邏輯 
  4.     // 🔖 分頁邏輯 
  5.   } 
  6.  
  7.   function rewriteColumns() { 
  8.     // 🔖 分頁邏輯 
  9.     // 🏁 縮進線邏輯 
  10.   } 
  11.  
  12.   const components = { 
  13.     // 🏁 縮進線邏輯 
  14.   } 
  15.  
  16.   const onExpand = async (expanded, record) => { 
  17.     // 🎈 加載更多邏輯 
  18.   } 
  19.  
  20.   return <Table /> 

 

有沒有一種機制,可以讓代碼按照功能點聚合,而不是散落在各個函數中?

  1. // 🔖 分頁邏輯 
  2. const usePaginationPlugin = () => {} 
  3. // 🎈 加載更多邏輯 
  4. const useLazyloadPlugin = () => {} 
  5. // 🏁 縮進線邏輯 
  6. const useIndentLinePlugin = () => {} 
  7.  
  8. export const TreeTable = (rawProps) => { 
  9.   usePaginationPlugin() 
  10.  
  11.   useLazyloadPlugin() 
  12.  
  13.   useIndentLinePlugin() 
  14.  
  15.   return <Table /> 

沒錯,就是很像 VueCompositionAPI 和 React Hook 在邏輯解耦方面所做的改進,但是在這個回調函數的寫法形態下,好像不太容易做到?

下一篇文章,我會聊聊如何利用自己設計的插件機制來優化這個組件的耦合代碼。

記得關注后加我好友,我會不定期分享前端知識,行業信息。2021 陪你一起度過。

 本文轉載自微信公眾號「前端從進階到入院」,可以通過以下二維碼關注。轉載本文請聯系前端從進階到入院公眾號。

 

責任編輯:武曉燕 來源: 前端從進階到入院
相關推薦

2022-10-17 08:03:47

封裝vue組件

2024-03-20 09:31:00

圖片懶加載性能優化React

2017-03-28 10:11:12

Webpack 2React加載

2021-03-04 08:19:29

插件機制代碼

2021-11-22 10:00:33

鴻蒙HarmonyOS應用

2021-09-16 14:22:06

微軟WinUI 2.7InfoBadge

2022-05-13 08:46:46

jsoneditorjson編輯器

2010-01-13 13:53:32

VB.NET組件封裝

2023-04-10 08:30:30

json編輯器typescript

2021-02-04 17:04:22

Python編程語言代碼

2021-06-08 11:31:11

WineWaylandVulkan

2019-04-24 16:12:59

iOSSiriMacOS

2013-11-12 10:46:04

ChromeChrome32 be

2021-04-30 17:35:16

前端開發技術熱點

2021-02-05 07:03:17

微軟Edge瀏覽器

2022-01-25 10:34:37

微軟Edge Cana側邊欄

2022-07-06 08:29:12

antdInput 組件

2024-03-13 13:39:21

2021-12-05 21:05:49

前端JSON API

2020-11-20 10:52:54

Antd表格日程
點贊
收藏

51CTO技術棧公眾號

精品国产一区久久久| 午夜精品福利一区二区三区av| 国产精品丝袜视频| 五月天激情丁香| 欧美亚洲tv| 欧美日韩精品综合在线| 99国产精品白浆在线观看免费| 手机看片1024日韩| 免费在线看一区| 欧美日韩xxx| 国内精品卡一卡二卡三| 日韩免费高清视频网站| 日韩欧美一区视频| 日本一道在线观看| 国产三级电影在线| 国产suv精品一区二区883| 国产精品久久久久久av下载红粉| 久久国产免费观看| 日韩精品一区二区三区免费观影 | 国产在线观看福利| 国产激情视频在线| 自拍欧美一区| 午夜视频网站在线观看| 粉嫩av四季av绯色av第一区| 国产精品美女视频| 久久男人中文字幕资源站| 精品自在线视频| 国产三级短视频| 久久久久久毛片免费看 | 在线观看欧美| 欧美日韩午夜剧场| 国产 欧美 日本| av电影在线观看| 99久久国产综合精品麻豆| 91视频九色网站| 中文字幕久久熟女蜜桃| 国产一区成人| 欧美激情一级欧美精品| 欧美肥妇bbwbbw| 欧美日韩在线播放视频| 日韩激情第一页| 91精产国品一二三| 国产精品久久久久久久久久辛辛 | 国产91九色视频| 日本天堂网在线观看| 欧美啪啪一区| 欧美精品生活片| 中国毛片直接看| 性欧美欧美巨大69| 精品国产欧美一区二区五十路| 亚洲一区二区自偷自拍 | 亚洲欧美福利视频| 人妻丰满熟妇av无码久久洗澡| www.成人网| 日韩女同互慰一区二区| 老女人性生活视频| 国产一区二区三区亚洲综合| 制服.丝袜.亚洲.另类.中文| 中文字幕资源在线观看| 男人亚洲天堂| 51精品国自产在线| 日本中文字幕在线不卡| 日韩精品免费视频一区二区三区| 欧美一卡二卡三卡四卡| 97超碰人人看| 成人资源在线| 亚洲免费视频观看| 国产精品免费无码| 日韩中文字幕高清在线观看| 日韩中文字幕视频在线| 91在线播放观看| 国模 一区 二区 三区| 国内精品久久久久| 国产午夜精品久久久久| 日韩精品国产精品| 91精品久久久久久久久久久久久久| 伊人亚洲综合网| 国产一区二区三区在线看麻豆| 5566中文字幕一区二区| 亚洲精品第五页| 91伊人久久大香线蕉| 日本不卡二区| 国产精品久久久久久福利| 一区二区三区国产精品| 久久久999免费视频| 欧美特大特白屁股xxxx| 欧美揉bbbbb揉bbbbb| 一级片免费在线观看视频| 粉嫩av一区二区| 亚洲视频欧美视频| 日韩影院一区二区| 亚洲一区中文| 91免费高清视频| 四虎精品在线| 国产精品久久久久久久久图文区 | 精品少妇一区二区三区密爱| 女生裸体视频一区二区三区| 18久久久久久| 国产精品视频无码| 26uuu另类欧美| 蜜臀av.com| 国产日韩电影| 日韩三级高清在线| 午夜影院黄色片| 国产一区久久| 国产欧美久久久久久| 日韩在线观看视频一区| 国产精品免费视频网站| 黄色一级在线视频| 国产在线不卡一区二区三区| 亚洲精品一区在线观看香蕉| 青青草在线观看视频| 日韩和欧美一区二区三区| av蓝导航精品导航| 18视频免费网址在线观看| 无码av免费一区二区三区试看| 欧美三级午夜理伦三级富婆| 日韩精品福利一区二区三区| 久久久极品av| 波多野结衣小视频| 91一区二区三区在线观看| 日本一本草久p| 成人高清一区| 亚洲视频精品在线| 成人午夜视频在线播放| 东方欧美亚洲色图在线| 丰满女人性猛交| 欧美日韩精品免费观看视完整| 精品国产三级a在线观看| 日韩在线视频网址| 麻豆国产欧美一区二区三区| 欧美色图亚洲自拍| 欧美久久天堂| 亚洲精品国产精品国产自| 欧美三级在线免费观看| 国内精品免费**视频| 少妇精品久久久久久久久久| 国产欧美一区二区三区精品酒店| 亚洲精品国产suv| 亚洲免费毛片网站| 久久影视中文粉嫩av| 日韩av激情| 日韩欧美卡一卡二| 免费在线看黄网址| 国产91丝袜在线18| 国产精品日韩三级| 国产精品15p| 久久久久免费精品国产| 丁香六月色婷婷| 亚洲综合清纯丝袜自拍| 男人的天堂免费| 欧美午夜久久| 国产精品一区二区三区在线观| 三级资源在线| 精品成a人在线观看| 中文字幕第28页| 成人妖精视频yjsp地址| 日本男女交配视频| 国产精品自在线拍| 欧美在线性爱视频| 国产私拍精品| 欧美精品 国产精品| 日日操免费视频| 极品美女销魂一区二区三区| 97超碰免费观看| 超碰成人在线免费| 欧美激情一区二区三区在线视频观看 | 欧美性猛交xxxx乱大交极品| 中国美女乱淫免费看视频| 三级不卡在线观看| 亚洲一区二区三区免费观看| 成人av在线播放| 欧美福利小视频| 亚洲 美腿 欧美 偷拍| 色一区在线观看| 成人无码精品1区2区3区免费看| 久久99国产精品尤物| 国产 国语对白 露脸| 成人看片爽爽爽| 国产成人在线一区二区| 欧洲不卡av| 精品国产区一区| 免费无码国产精品| 亚洲欧美在线视频观看| 日韩综合第一页| 日韩电影在线一区二区三区| 久久av喷吹av高潮av| 九色丨蝌蚪丨成人| 国产欧美日韩免费| 丝袜在线视频| 亚洲桃花岛网站| 午夜精品小视频| 在线免费观看日本欧美| 中文字幕在线观看成人| 久久久青草青青国产亚洲免观| 中文字幕 欧美日韩| 国产亚洲亚洲| 青青草免费在线视频观看| 日韩在线你懂的| 91久久久久久久久| 在线女人免费视频| 日韩视频免费在线| 男人的天堂av高清在线| 日韩限制级电影在线观看| 无码人妻丰满熟妇区五十路| 亚洲男人天堂av网| 免费看裸体网站| 成人网在线免费视频| 亚洲综合欧美在线| 国产精品最新自拍| 日本精品福利视频| 日韩欧美视频在线播放| 久久久久se| 亚洲精品国产九九九| 国产精品欧美激情| 在线精品亚洲欧美日韩国产| 欧美精品亚州精品| 网友自拍视频在线| 亚洲欧美中文在线视频| 免费观看黄色av| 91麻豆精品国产| 中国老头性行为xxxx| 福利视频导航一区| 国产极品在线播放| 亚洲精品高清视频在线观看| 无码人妻丰满熟妇啪啪欧美| 99精品欧美一区二区三区小说| 污免费在线观看| 精品午夜一区二区三区在线观看 | 国产系列精品av| 亚洲色图.com| 永久免费看mv网站入口| 国产精品污污网站在线观看| 巨胸大乳www视频免费观看| proumb性欧美在线观看| 真实乱偷全部视频| 国产剧情一区二区| 91在线第一页| 国产在线精品一区二区不卡了| 婷婷六月天在线| 日本在线不卡视频一二三区| avav在线看| 欧美一级久久| 欧美精品色婷婷五月综合| 一区二区精品| 少妇高潮毛片色欲ava片| 亚洲视频碰碰| 日韩国产一级片| 日韩一区二区免费看| 久久综合九色综合88i| 亚洲永久免费| 黄色国产精品视频| 日韩中文字幕一区二区三区| 992kp快乐看片永久免费网址| 久久久人人人| 亚洲一区在线不卡| 激情成人综合网| 中文字幕在线观看视频www| 国产99一区视频免费| 国产女人18毛片水真多18| www.亚洲人| 熟女高潮一区二区三区| 国产亚洲1区2区3区| 殴美一级黄色片| 综合婷婷亚洲小说| av资源吧首页| 欧美特级www| 中文字幕黄色av| 日韩欧美aaaaaa| 亚洲色欧美另类| 日韩精品免费视频| 69av亚洲| 欧美另类老女人| 在线黄色的网站| 国产一区视频在线| av成人资源| 日韩经典在线视频| 综合色一区二区| 国产99久久九九精品无码| 久久亚洲视频| 亚洲一区二区中文字幕在线观看| 成人久久18免费网站麻豆| 亚洲av综合一区二区| 中文字幕一区二区三区四区| 免费在线观看国产精品| 色网综合在线观看| 国产色综合视频| 精品视频偷偷看在线观看| 免费黄色在线看| 91精品国产乱码久久久久久久久| av高清一区| 成人h视频在线观看| 精品国精品国产自在久国产应用| 久久久成人精品一区二区三区| 亚洲综合另类| 色偷偷中文字幕| 久久久另类综合| 久久精品第一页| 欧美影院一区二区三区| 成人毛片视频免费看| 伊人伊成久久人综合网站| 福利小视频在线| 国产免费一区视频观看免费| 欧洲亚洲视频| 精品久久免费观看| 视频一区二区三区中文字幕| 熟妇女人妻丰满少妇中文字幕| 国产亚洲成aⅴ人片在线观看 | 国外成人在线视频网站| 欧美高清视频手机在在线| 九色在线视频观看| 国产超碰在线一区| 91大神福利视频| 精品久久久久久久久久ntr影视| av av片在线看| 在线精品91av| 中文字幕在线视频网站| 成人xxxxx色| 欧美一区在线看| 一级做a免费视频| 国产网红主播福利一区二区| 日韩av免费网址| 日韩美女一区二区三区四区| 日本在线视频网| 国产精品久久久精品| 全球av集中精品导航福利| 久久在线中文字幕| 国产伦精品一区二区三区在线观看| 无码国产69精品久久久久同性| 午夜精品久久久久久久久| 黄色一级大片在线免费看国产| 久久久精品国产网站| 欧美一级做一级爱a做片性| 日韩精品一线二线三线| 麻豆9191精品国产| 亚洲黄色免费在线观看| 偷拍与自拍一区| 刘玥91精选国产在线观看| 色综合久久88| 亚洲成人黄色| 日韩美女爱爱视频| 大尺度一区二区| 久久久夜色精品| 精品久久久久久最新网址| 秋霞在线午夜| 国产精品国产一区二区| 在线日韩av| 国产成人无码一区二区在线观看| 黄色精品在线看| 日韩av成人| 国产精品2018| 成人久久久久| 中文字幕视频三区| 亚洲蜜臀av乱码久久精品 | 国产a区久久久| 亚欧洲精品在线视频| 亚洲国产日韩精品在线| 性国裸体高清亚洲| 日本一区二区三区免费看| 日韩av二区在线播放| 老司机深夜福利网站| 欧美一区二区三区人| 美足av综合网| 久久久www免费人成黑人精品| 亚洲欧美日韩国产综合精品二区| 亚洲区自拍偷拍| 欧美精品久久久久久久多人混战 | 毛片在线播放网址| 国产精品人人做人人爽| 亚洲澳门在线| 精品国产免费久久久久久婷婷| 亚洲国产综合色| 免费黄网站在线观看| 国产深夜精品福利| 国内成人在线| 性欧美精品男男| 日韩一区二区麻豆国产| 中文字幕在线视频久| 中文字幕中文字幕在线中一区高清| 国产精品一区二区在线播放| 日操夜操天天操| 在线a欧美视频| 亚洲一区网址| 日本999视频| 一区二区三区在线影院| 久久经典视频| 91免费在线视频网站| 亚洲欧美久久久| 全程偷拍露脸中年夫妇| 亚洲女人被黑人巨大进入al| 四虎精品一区二区免费 | 精品一区二区日韩| 日韩手机在线观看| 日日噜噜噜夜夜爽亚洲精品| 黄色美女久久久| 午夜视频在线网站| 日韩人体视频一二区| 污污片在线免费视频| 色噜噜狠狠一区二区三区| 丰满放荡岳乱妇91ww|