精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一二三四区不卡| 久久国产精品毛片| 日韩视频一区在线观看| 一区精品视频| 国产日韩欧美中文字幕| 亚洲第一天堂| 日韩午夜小视频| 只有这里有精品| 99精品久久久久久中文字幕| 欧美特黄视频| 日韩高清欧美高清| 男女视频一区二区三区| 欧洲日本在线| 国产成人精品免费在线| 中文字幕日韩高清| 欧美精品性生活| 菠萝蜜视频国产在线播放| 国产白丝精品91爽爽久久| 97精品视频在线| 中文字幕在线1| 91丨精品丨国产| 亚洲黄色av一区| 免费不卡亚洲欧美| 亚洲天堂网在线视频| 国产一区二区三区四区老人| 日韩经典中文字幕| 美女在线视频一区二区| 男女视频在线| 久久久蜜桃精品| 91精品久久久久久久久不口人| 国产一级性生活| 日本女优一区| 日韩精品中文字幕在线不卡尤物| www黄色日本| 毛片网站在线免费观看| 99久久综合色| 91免费综合在线| 日本中文字幕在线| 伊人青青综合网| 亚洲奶大毛多的老太婆| 国产精品久久久久久9999| 天堂在线中文网官网| 亚洲天堂福利av| 农村寡妇一区二区三区| a级片在线视频| 视频在线观看一区| 欧美精品videofree1080p| 日本二区在线观看| 9l亚洲国产成人精品一区二三| 欧美亚洲愉拍一区二区| 超薄肉色丝袜足j调教99| 国产粉嫩一区二区三区在线观看| 成人性色生活片免费看爆迷你毛片| 国产成人精品午夜| 四虎永久在线精品| 国产精品久久久久久| 亚洲乱码av中文一区二区| 国产人妖在线观看| av日韩在线免费观看| 色爱区综合激月婷婷| av在线播放天堂| 午夜伦理在线视频| √…a在线天堂一区| 欧美性色黄大片人与善| 熟妇人妻av无码一区二区三区| 蜜桃久久av| 51久久精品夜色国产麻豆| 久久久精品国产sm调教网站| 亚洲va在线| 日韩在线观看免费av| 日本猛少妇色xxxxx免费网站| 亚洲一区二区三区四区电影| 欧美色综合天天久久综合精品| 国产精品-区区久久久狼| 国产精品论坛| 天天影视色香欲综合网老头| www.亚洲成人网| av免费在线观看网站| 亚洲色图清纯唯美| 做爰高潮hd色即是空| 黄网站在线播放| 亚洲精品视频免费看| 黄色污污在线观看| a黄色片在线观看| 自拍偷拍亚洲综合| 天天爱天天做天天操| 黄视频在线观看网站| 亚洲人成7777| www成人免费| 国产高清视频色在线www| 午夜精品久久久久久久99樱桃| 日韩网站在线免费观看| av免费不卡国产观看| 亚洲综合久久av| 91九色丨porny丨国产jk| 国产福利电影在线播放| 色婷婷国产精品综合在线观看| 成人一级片网站| 欧美一区二区三区婷婷| 91精品国产欧美日韩| 一二三区视频在线观看| 日韩成人午夜| 中文字幕日韩高清| 黄视频网站免费看| 狠狠色丁香久久综合频道| 欧美激情视频三区| 日韩人妻精品中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 国产精品劲爆视频| 国产免费福利视频| www.av亚洲| 日韩欧美视频一区二区| 在线欧美三级| 日韩欧美中文字幕在线观看| 午夜视频你懂的| 日韩最新av| 日韩精品在线免费播放| 五月婷婷欧美激情| 欧美精品国产一区二区| 欧美在线视频网| 国产精品久久久久久69| 成人精品免费看| 日产精品高清视频免费| 国产黄a三级三级三级av在线看 | 亚洲va欧美va国产va天堂影院| 五十路熟女丰满大屁股 | 国产精品久久中文| 国产黄色美女视频| 91老师片黄在线观看| 亚洲bbw性色大片| 黑人另类精品××××性爽| 欧美色图免费看| 精品国产av色一区二区深夜久久| 日韩黄色大片| 2020欧美日韩在线视频| 国产精品高潮呻吟av| 久久婷婷成人综合色| 欧美大片免费播放| 91超碰碰碰碰久久久久久综合| 精品日韩99亚洲| 婷婷丁香综合网| 久久国产精品久久久久久电车| av一区二区三区四区电影| 成人在线二区| 精品久久中文字幕| 日韩av影视大全| 欧美精品国产白浆久久久久| 91精品国产综合久| 亚洲精品国产suv一区88| av资源中文在线天堂| 欧美伊人久久久久久午夜久久久久| 美女在线视频一区二区| 九九综合九九| 欧美精品久久久久久久| 99视频在线观看免费| 中文字幕免费在线观看视频一区| av日韩一区二区三区| 欧美另类中文字幕| 日韩视频永久免费观看| 91丨九色丨海角社区| 91婷婷韩国欧美一区二区| 日韩激情视频一区二区| 免费精品一区| 中文字幕在线观看日韩| 看黄色一级大片| www欧美成人18+| 国产免费黄视频| 一区二区三区视频播放| 欧美精品在线播放| 国产乱色精品成人免费视频| 中文字幕在线播放不卡一区| 伊人国产在线视频| 精品国产一区二区三区久久久蜜臀| 国产91对白在线播放| 三级视频在线看| 性做久久久久久久免费看| 久草视频福利在线| 精品1区2区3区4区| 国产精品我不卡| bl在线肉h视频大尺度| 欧美一二三在线| 综合 欧美 亚洲日本| 久久国产日韩欧美精品| 在线观看成人av| 国产精品欧美一区二区三区不卡| 日韩在线不卡视频| 国产精品一级视频| 一区二区激情视频| 无码国产69精品久久久久网站| 国内精品久久久久久久97牛牛 | 日韩精品视频三区| 亚洲日本韩国在线| 久久久久久毛片| 午夜精品久久久内射近拍高清| 国产精品一区高清| 国产欧美精品一区二区| 美女黄视频在线观看| 欧美va天堂va视频va在线| 日本a在线观看| 久久网这里都是精品| 视色视频在线观看| 欧美精品啪啪| 麻豆蜜桃91| 国产精品久久久久久久久久齐齐| 日韩中文有码在线视频| 国产精品伦一区二区三区| 亚洲精品水蜜桃| 欧美 日本 国产| 麻豆国产精品视频| 国产91沈先生在线播放| 蜜臀91精品国产高清在线观看| 国产精品老女人精品视频| 国产黄大片在线观看画质优化| 亚洲国产小视频| 91丨九色丨蝌蚪丨对白| 亚洲特级片在线| www.四虎精品| 日韩电影免费在线| 2018中文字幕第一页| 中文有码一区| 亚洲自拍偷拍视频| 欧美片第1页| 欧美激情va永久在线播放| 国产经典自拍视频在线观看| 欧美mv和日韩mv国产网站| 精品黑人一区二区三区| 一区二区三区日韩| 国产1区2区在线观看| 99久久综合狠狠综合久久| 伊人成人222| 欧美亚洲专区| 一本色道久久99精品综合| 大香伊人久久精品一区二区| 国产裸体写真av一区二区| 欧美巨大丰满猛性社交| 久久成人精品电影| xxxxx日韩| 日韩精品一区二区三区第95| 国产不卡av在线播放| 在线看不卡av| 日韩美女视频网站| 中文字幕永久在线不卡| 国产人妻人伦精品1国产丝袜| 捆绑调教美女网站视频一区| 久久久久人妻精品一区三寸| 亚洲国产mv| 97在线免费视频观看| 青青草国产免费一区二区下载| 久久一区二区三区av| 91成人在线精品视频| 成人网在线免费观看| av在线一区不卡| 日本不卡视频在线播放| 大香伊人中文字幕精品| 一区二区三区www| 美女欧美视频在线观看免费 | 亚洲欧美制服中文字幕| 黄色av中文字幕| 精品日韩一区二区| 亚洲av无码乱码国产精品| 88在线观看91蜜桃国自产| 激情五月婷婷网| 亚洲一区二区三区中文字幕| 精品在线观看一区| 欧美高清在线一区二区| 久久亚洲无码视频| 国产日韩亚洲欧美综合| 蜜桃av免费看| 国产日韩欧美电影| 一二三四国产精品| 国产精品久久久久久久久图文区 | 日韩av一卡二卡| 欧美一区二区在线观看视频| 精品乱人伦一区二区三区| 99精品免费观看| 精品国产一区二区在线观看| 国产成人av免费看| 日韩精品影音先锋| 亚洲欧美另类一区| 精品国产乱码久久久久久浪潮| 亚洲国产剧情在线观看| 亚洲高清不卡av| 日本中文字幕电影在线观看| 国产亚洲免费的视频看| aaa在线观看| 久久国产精品偷| 中文字幕资源网在线观看| 欧美精品成人91久久久久久久| www久久日com| 久久久久久久久亚洲| 午夜激情在线播放| 国产精品成人一区| 先锋影音一区二区| 国产精品视频在线免费观看| 亚洲婷婷影院| 亚洲一区二区三区免费看| 亚洲精品久久| 成年丰满熟妇午夜免费视频| 亚洲欧洲一区| 992kp快乐看片永久免费网址| 久草中文综合在线| 在线观看免费视频黄| 久久久久一区二区三区四区| 国产精品久久国产精麻豆96堂| 欧美国产欧美综合| 久久精品视频免费在线观看| 欧美日韩国产精品| 真实的国产乱xxxx在线91| 日韩欧美你懂的| 蝌蚪视频在线播放| 久久亚洲精品成人| 欧洲av不卡| 91手机在线视频| 风间由美性色一区二区三区四区| 欧洲精品在线一区| 天天影视欧美综合在线观看| 日韩av综合在线观看| 久久国产乱子精品免费女| 国产日韩视频一区| 国产精品久久久久9999吃药| 精品小视频在线观看| 欧美中文字幕久久| 亚洲精品久久久久久无码色欲四季 | 国内外成人免费激情在线视频网站| 中文在线免费视频| 国产精品亚洲网站| 涩爱av色老久久精品偷偷鲁| 欧美日本韩国在线| 一个色综合网| 免费男同深夜夜行网站 | 97视频色精品| 国产精品毛片无码| 日本一区免费看| 国产综合自拍| 超碰在线超碰在线| 中文文精品字幕一区二区| 日韩av在线播| 欧美视频精品在线观看| 香蕉人妻av久久久久天天| 日韩少妇与小伙激情| 97久久香蕉国产线看观看| 国模精品娜娜一二三区| 欧美人成在线| 国产精品19p| 一区二区三区高清不卡| 精品人妻一区二区三区麻豆91 | 18精品爽视频在线观看| 日韩久久久久久| 超碰97国产精品人人cao| 97免费资源站| 国内综合精品午夜久久资源| 韩国黄色一级片| 亚洲成人在线免费| 午夜小视频免费| 欧美专区在线视频| 国产成人手机高清在线观看网站| 男人揉女人奶房视频60分 | 久久精品国产免费| 亚洲AV成人无码精电影在线| 日韩亚洲电影在线| av不卡高清| 免费一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 手机免费观看av| 91精品国产综合久久久久久久久久 | 欧美 日韩 国产 成人 在线| 97成人精品区在线播放| 真实原创一区二区影院| 亚洲欧美在线精品| 亚洲精品久久久久久国产精华液| 精品区在线观看| 538国产精品一区二区免费视频| 九热爱视频精品视频| 手机看片一级片| 亚洲一级二级三级| 欧美理论在线观看| 国产欧美精品日韩精品| 国内精品福利| 成人免费毛片糖心| 欧美日韩另类国产亚洲欧美一级| 久操视频在线免费播放| 国产精品久久久久免费| 三级久久三级久久久| 永久免费观看片现看| 日韩免费一区二区| 玛雅亚洲电影| 性生活免费观看视频| 91蜜桃免费观看视频| 国产又大又黑又粗| 欧美一级视频免费在线观看| 国产韩国精品一区二区三区| 荫蒂被男人添免费视频| 欧美日韩黄视频| av小说在线播放| 在线不卡视频一区二区| 99精品1区2区| a视频免费在线观看| 日本不卡免费高清视频| 欧美三级在线| 99精品欧美一区二区|