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

配合React Portals實現一個功能強大的抽屜(Drawer)組件

開發 前端
對于react選手來說,如果沒用typescript,建議大家都用PropTypes, 它是react內置的類型檢測工具,我們可以直接在項目中導入. vue有自帶的屬性檢測方式,這里就不一一介紹了.

[[429338]]

正文

在開始組件設計之前希望大家對css3和js有一定的基礎,并了解基本的react/vue語法.我們先看看實現后的組件效果:

1. 組件設計思路

按照之前筆者總結的組件設計原則,我們第一步是要確認需求. 一個抽屜(Drawer)組件會有如下需求點:

  • 能控制抽屜是否可見
  • 能手動配置抽屜的關閉按鈕
  • 能控制抽屜的打開方向
  • 關閉抽屜時是否銷毀里面的子元素(這個問題是工作中頻繁遇到的問題)
  • 指定 Drawer 掛載的 HTML 節點, 可以將抽屜掛載在任何元素上
  • 點擊蒙層可以控制是否允許關閉抽屜
  • 能控制遮罩層的展示
  • 能自定義抽屜彈出層樣式
  • 可以設置抽屜彈出層寬度
  • 能控制彈出層層級
  • 能控制抽屜彈出方向(上下左右)
  • 點擊關閉按鈕時能提供回調供開發者進行相關操作

需求收集好之后,作為一個有追求的程序員, 會得出如下線框圖:

對于react選手來說,如果沒用typescript,建議大家都用PropTypes, 它是react內置的類型檢測工具,我們可以直接在項目中導入. vue有自帶的屬性檢測方式,這里就不一一介紹了.

通過以上需求分析, 是不是覺得一個抽屜組件要實現這么多功能很復雜呢? 確實有點復雜,但是不要怕,有了上面精確的需求分析,我們只需要一步步按照功能點實現就好了.對于我們常用的table組件, modal組件等其實也需要考慮到很多使用場景和功能點, 比如antd的table組件暴露了幾十個屬性,如果不好好理清具體的需求, 實現這樣的組件是非常麻煩的.接下來我們就來看看具體實現.

2. 基于react實現一個Drawer組件

2.1. Drawer組件框架設計

首先我們先根據需求將組件框架寫好,這樣后面寫業務邏輯會更清晰:

  1. import PropTypes from 'prop-types' 
  2. import styles from './index.less' 
  3.  
  4. /** 
  5.  * Drawer 抽屜組件 
  6.  * @param {visible} bool 抽屜是否可見 
  7.  * @param {closable} bool 是否顯示右上角的關閉按鈕 
  8.  * @param {destroyOnClose} bool 關閉時銷毀里面的子元素 
  9.  * @param {getContainer} HTMLElement 指定 Drawer 掛載的 HTML 節點, false 為掛載在當前 dom 
  10.  * @param {maskClosable} bool 點擊蒙層是否允許關閉抽屜 
  11.  * @param {mask} bool 是否展示遮罩 
  12.  * @param {drawerStyle} object 用來設置抽屜彈出層樣式 
  13.  * @param {width} number|string 彈出層寬度 
  14.  * @param {zIndex} number 彈出層層級 
  15.  * @param {placement} string 抽屜方向 
  16.  * @param {onClose} string 點擊關閉時的回調 
  17.  */ 
  18. function Drawer(props) { 
  19.   const { 
  20.     closable = true
  21.     destroyOnClose, 
  22.     getContainer = document.body, 
  23.     maskClosable = true
  24.     mask = true
  25.     drawerStyle, 
  26.     width = '300px'
  27.     zIndex = 10, 
  28.     placement = 'right'
  29.     onClose, 
  30.     children 
  31.   } = props 
  32.  
  33.   const childDom = ( 
  34.     <div className={styles.xDrawerWrap}> 
  35.       <div className={styles.xDrawerMask} ></div> 
  36.       <div  
  37.         className={styles.xDrawerContent} 
  38.         { 
  39.           children 
  40.         } 
  41.         { 
  42.           !!closable && <span className={styles.xCloseBtn}>X</span> 
  43.         } 
  44.       </div> 
  45.     </div> 
  46.   ) 
  47.   return childDom 
  48.  
  49. export default Drawer 

有了這個框架,我們來一步步往里面實現內容吧.

2.2 實現visible, closable, onClose, mask, maskClosable, width, zIndex, drawerStyle

之所以要先實現這幾個功能,是因為他們實現都比較簡單,不會牽扯到其他復雜邏輯.只需要對外暴露屬性并使用屬性即可. 具體實現如下:

  1. function Drawer(props) { 
  2.   const { 
  3.     closable = true
  4.     destroyOnClose, 
  5.     getContainer = document.body, 
  6.     maskClosable = true
  7.     mask = true
  8.     drawerStyle, 
  9.     width = '300px'
  10.     zIndex = 10, 
  11.     placement = 'right'
  12.     onClose, 
  13.     children 
  14.   } = props 
  15.  
  16.   let [visible, setVisible] = useState(props.visible) 
  17.  
  18.   const handleClose = () => { 
  19.     setVisible(false
  20.     onClose && onClose() 
  21.   } 
  22.  
  23.   useEffect(() => { 
  24.     setVisible(props.visible) 
  25.   }, [props.visible]) 
  26.  
  27.   const childDom = ( 
  28.     <div  
  29.       className={styles.xDrawerWrap} 
  30.       style={{ 
  31.         width: visible ? '100%' : '0'
  32.         zIndex 
  33.       }} 
  34.     > 
  35.       { !!mask && <div className={styles.xDrawerMask} onClick={maskClosable ? handleClose : null}></div> } 
  36.       <div  
  37.         className={styles.xDrawerContent} 
  38.         style={{ 
  39.           width, 
  40.           ...drawerStyle 
  41.         }}> 
  42.         { children } 
  43.         { 
  44.           !!closable && <span className={styles.xCloseBtn} onClick={handleClose}>X</span> 
  45.         } 
  46.       </div> 
  47.     </div> 
  48.   ) 
  49.   return childDom 

上述實現過程值得注意的就是我們組件設計采用了react hooks技術, 在這里用到了useState, useEffect, 如果大家不懂的可以去官網學習, 非常簡單,如果有不懂的可以和筆者交流或者在評論區提問. 抽屜動畫我們通過控制抽屜內容的寬度來實現,配合overflow:hidden, 后面我會單獨附上css代碼供大家參考.

2.3 實現destroyOnClose

destroyOnClose主要是用來清除組件緩存,比較常用的場景就是輸入文本,比如當我是的抽屜的內容是一個表單創建頁面時,我們關閉抽屜希望表單中用戶輸入的內容清空,保證下次進入時用戶能重新創建, 但是實際情況是如果我們不銷毀抽屜里的子組件, 子組件內容不會清空,用戶下次打開時開始之前的輸入,這明顯不合理. 如下圖所示:

要想清除緩存,首先就要要內部組件重新渲染,所以我們可以通過一個state來控制,如果用戶明確指定了關閉時要銷毀組件,那么我們就更新這個state,從而這個子元素也就不會有緩存了.具體實現如下:

  1. function Drawer(props) { 
  2.   // ... 
  3.   let [isDesChild, setIsDesChild] = useState(false
  4.  
  5.   const handleClose = () => { 
  6.     // ... 
  7.     if(destroyOnClose) { 
  8.       setIsDesChild(true
  9.     } 
  10.   } 
  11.  
  12.   useEffect(() => { 
  13.     // ... 
  14.     setIsDesChild(false
  15.   }, [props.visible]) 
  16.  
  17.   const childDom = ( 
  18.     <div className={styles.xDrawerWrap}> 
  19.       <div className={styles.xDrawerContent} 
  20.         { 
  21.           isDesChild ? null : children 
  22.         } 
  23.       </div> 
  24.     </div> 
  25.   ) 
  26.   return childDom 

上述代碼中我們省略了部分不相關代碼, 主要來關注isDesChild和setIsDesChild, 這個屬性用來根據用戶傳入的destroyOnClose屬性倆判斷是否該更新這個state, 如果destroyOnClose為true,說明要更新,那么此時當用戶點擊關閉按鈕的時候, 組件將重新渲染, 在用戶再次點開抽屜時, 我們根據props.visible的變化,來重新讓子組件渲染出來,這樣就實現了組件卸載的完整流程.

2.4 實現getContainer

getContainer主要用來控制抽屜組件的渲染位置,默認會渲染到body下, 為了提供更靈活的配置,我們需要讓抽屜可以渲染到任何元素下,這樣又怎么實現呢? 這塊實現我們可以采用React Portals來實現,具體api介紹如下:

Portal 提供了一種將子節點渲染到存在于父組件以外的 DOM 節點的優秀的方案。第一個參數(child)是任何可渲染的 React 子元素,例如一個元素,字符串或 fragment。第二個參數(container)是一個 DOM 元素。

具體使用如下:

  1. render() { 
  2.   // `domNode` 是一個可以在任何位置的有效 DOM 節點。 
  3.   return ReactDOM.createPortal( 
  4.     this.props.children, 
  5.     domNode 
  6.   ); 

所以基于這個api我們就能把抽屜渲染到任何元素下了, 具體實現如下:

  1. const childDom = ( 
  2.     <div  
  3.       className={styles.xDrawerWrap} 
  4.       style={{ 
  5.         position: getContainer === false ? 'absolute' : 'fixed'
  6.         width: visible ? '100%' : '0'
  7.         zIndex 
  8.       }} 
  9.     > 
  10.       { !!mask && <div className={styles.xDrawerMask} onClick={maskClosable ? handleClose : null}></div> } 
  11.       <div  
  12.         className={styles.xDrawerContent} 
  13.         style={{ 
  14.           width, 
  15.           [placement]: visible ? 0 : '-100%'
  16.           ...drawerStyle 
  17.         }}> 
  18.         { 
  19.           isDesChild ? null : children 
  20.         } 
  21.         { 
  22.           !!closable && <span className={styles.xCloseBtn} onClick={handleClose}>X</span> 
  23.         } 
  24.       </div> 
  25.     </div> 
  26.   ) 
  27.  
  28.   return getContainer === false ? childDom 
  29.             : ReactDOM.createPortal(childDom, getContainer) 

因為這里getContainer要支持3種情況,一種是用戶不配置屬性,那么默認就掛載到body下,還有就是用戶傳的值為false, 那么就為最近的父元素, 他如果傳一個dom元素,那么將掛載到該元素下,所以以上代碼我們會分情況考慮,還有一點要注意,當抽屜打開時,我們要讓父元素溢出隱藏,不讓其滾動,所以我們在這里要設置一下:

  1. useEffect(() => { 
  2.     setVisible(() => { 
  3.       if(getContainer !== false && props.visible) { 
  4.         getContainer.style.overflow = 'hidden' 
  5.       } 
  6.       return props.visible 
  7.     }) 
  8.     setIsDesChild(false
  9.   }, [props.visible, getContainer]) 

當關閉時恢復邏輯父級的overflow, 避免影響外部樣式:

  1. const handleClose = () => { 
  2.     onClose && onClose() 
  3.     setVisible((prev) => { 
  4.       if(getContainer !== false && prev) { 
  5.         getContainer.style.overflow = 'auto' 
  6.       } 
  7.       return false 
  8.     }) 
  9.     if(destroyOnClose) { 
  10.       setIsDesChild(true
  11.     } 
  12.   } 

2.5 實現placement

placement主要用來控制抽屜的彈出方向, 可以從左彈出,也可以從右彈出, 實現過程也比較簡單,我們主要要更具屬性動態修改定位屬性即可,這里我們會用到es新版的新特性,對象的變量屬性. 核心代碼如下:

  1. <div  
  2.   className={styles.xDrawerContent} 
  3.   style={{ 
  4.     width, 
  5.     [placement]: visible ? 0 : '-100%'
  6.     ...drawerStyle 
  7.     }}> 
  8.  </div> 

 

 

 

這樣,無論是上下左右,都可以完美實現了.

2.6 健壯性支持, 我們采用react提供的propTypes工具:

  1. import PropTypes from 'prop-types' 
  2. // ... 
  3. Drawer.propTypes = { 
  4.   visible: PropTypes.bool, 
  5.   closable: PropTypes.bool, 
  6.   destroyOnClose: PropTypes.bool, 
  7.   getContainer: PropTypes.element, 
  8.   maskClosable: PropTypes.bool, 
  9.   mask: PropTypes.bool, 
  10.   drawerStyle: PropTypes.object, 
  11.   width: PropTypes.oneOfType([ 
  12.     PropTypes.string, 
  13.     PropTypes.number 
  14.   ]), 
  15.   zIndex: PropTypes.number, 
  16.   placement: PropTypes.string, 
  17.   onClose: PropTypes.func 

關于prop-types的使用官網上有很詳細的案例,這里說一點就是oneOfType的用法, 它用來支持一個組件可能是多種類型中的一個. 組件相關css代碼如下:

  1. .xDrawerWrap { 
  2.   top: 0; 
  3.   height: 100vh; 
  4.   overflow: hidden; 
  5.   .xDrawerMask { 
  6.     position: absolute
  7.     left: 0; 
  8.     right: 0; 
  9.     top: 0; 
  10.     bottom: 0; 
  11.     background-color: rgba(0, 0, 0, .5); 
  12.   } 
  13.   .xDrawerContent { 
  14.     position: absolute
  15.     top: 0; 
  16.     padding: 16px; 
  17.     height: 100%; 
  18.     transition: all .3s; 
  19.     background-color: #fff; 
  20.     box-shadow: 0 0 20px rgba(0,0,0, .2); 
  21.     .xCloseBtn { 
  22.       position: absolute
  23.       top: 10px; 
  24.       right: 10px; 
  25.       color: #ccc; 
  26.       cursor: pointer; 
  27.     } 
  28.   } 

通過以上步驟, 一個功能強大的的drawer組件就完成了,關于代碼中的css module和classnames的使用大家可以自己去官網學習,非常簡單.如果不懂的可以在評論區提問,筆者看到后會第一時間解答.

最后

后續筆者將會繼續實現

  • modal(模態窗),
  • alert(警告提示),
  • badge(徽標),
  • table(表格),
  • tooltip(工具提示條),
  • Skeleton(骨架屏),
  • Message(全局提示),
  • form(form表單),
  • switch(開關),
  • 日期/日歷,
  • 二維碼識別器組件

 

等組件, 來復盤筆者多年的組件化之旅。

 

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2021-03-31 08:01:24

React Portareactcss3

2023-08-29 17:43:39

人工智能Fooocus

2022-03-10 09:00:37

提醒框ReactVue

2011-02-23 13:52:07

vsftpd

2017-02-09 18:01:22

Android圖片選擇器開發

2023-09-21 15:10:55

2010-03-05 09:19:54

Android系統

2017-04-20 18:00:59

Linux命令行工具系統信息

2021-07-09 10:14:05

IP工具命令

2013-01-23 11:30:39

JSVirtualKeybjQuery

2021-06-21 15:49:39

React動效組件

2009-07-07 08:46:11

微軟Windows 7新功能

2022-02-24 13:08:12

前端開發視頻

2024-01-15 18:02:09

docker系統文件格式

2010-02-24 17:58:28

Python 測試框架

2022-10-10 10:14:38

Python繪圖庫

2020-12-15 15:08:17

工具Java線程

2020-12-15 07:54:40

工具Hutoolgithub

2021-10-10 12:17:06

Weakpass在線字典生成器安全工具

2012-01-10 16:23:12

兄弟傳真機
點贊
收藏

51CTO技術棧公眾號

日韩欧美国产一区二区三区| 国产精品护士白丝一区av| 久久久在线视频| 久久久久久久久久久国产精品| 日韩欧美另类一区二区| 亚洲欧洲另类国产综合| 国产美女在线精品免费观看| 久久久久久不卡| 91精品国产91久久久久久密臀| 欧美mv日韩mv亚洲| 午夜免费高清视频| 金瓶狂野欧美性猛交xxxx| 久久久一区二区三区| 成人深夜直播免费观看| 久久午夜免费视频| 综合激情婷婷| 亚洲一区二区久久| 波多野结衣办公室双飞| 外国电影一区二区| 亚洲在线观看免费视频| 视频一区视频二区视频三区视频四区国产| 91片黄在线观看喷潮| 中日韩视频在线观看| 伊人久久精品视频| 国产黑丝在线观看| 欧美高清一级片| 欧美午夜一区二区三区| 男女超爽视频免费播放| 在线观看中文字幕的网站| 国产网站一区二区| 久久国产精品精品国产色婷婷| 国产精品高潮呻吟AV无码| 久久综合网络一区二区| 久久久在线观看| 欧美日韩激情在线观看| 久久视频在线| 亚洲性69xxxbbb| 国产偷人妻精品一区| 白白在线精品| 日韩欧美成人午夜| 国产九九九视频| 国产日本亚洲| 91精品国产日韩91久久久久久| 毛葺葺老太做受视频| 成人欧美大片| 福利微拍一区二区| 18禁免费无码无遮挡不卡网站| 国产在线xxx| 亚洲最大的成人av| 成人av在线播放观看| 巨大荫蒂视频欧美另类大| 国产精品久久久久影院亚瑟| 午夜老司机精品| av在线播放网站| 国产日产欧美一区二区三区| 茄子视频成人在线观看| 国产精品免费播放| 中文字幕免费不卡在线| 五月天丁香综合久久国产| 国产中文在线| 亚洲国产精品高清| 一区精品在线| 国产黄色小视频在线| 亚洲视频香蕉人妖| www.国产二区| yellow在线观看网址| 精品日本高清在线播放| 精品中文字幕av| 国产经典一区| 欧美视频自拍偷拍| 永久免费黄色片| 一区二区三区四区视频免费观看| 精品福利二区三区| theav精尽人亡av| 国产一区二区三区网| 在线亚洲国产精品网| 91制片厂在线| 欧美午夜不卡影院在线观看完整版免费| 欧美激情亚洲另类| 中文字幕视频网站| 久久超碰97人人做人人爱| 亚洲自拍欧美另类| 亚洲av成人无码网天堂| 国产丝袜美腿一区二区三区| 亚洲最大免费| 波多野结衣中文字幕久久| 欧美日韩国产精品| 911福利视频| 国产精品videossex| 日韩成人中文字幕| 国产激情无码一区二区三区| 亚洲一级影院| 国产精品中文字幕久久久| www日本高清视频| 91论坛在线播放| 亚洲精品视频一区二区三区| 日日夜夜天天综合入口| 色综合一个色综合| theporn国产精品| 欧美大胆视频| 久久久成人av| 久草视频在线观| 国产精品一区二区在线播放| 麻豆91av| 久草在线视频资源| 欧美日韩在线播放一区| 在线天堂www在线国语对白| 日韩欧美大片| 欧美一区二区三区图| 国产精品自拍电影| 国产欧美一区二区精品性色| 免费看黄在线看| www.成人| 在线国产精品视频| 国产区在线观看视频| 国产成人在线视频播放| 亚洲视频在线观看日本a| 国产盗摄——sm在线视频| 欧美一区二区国产| 成人小视频免费看| 性久久久久久| 国模精品一区二区三区| 伊人福利在线| 欧美精品一二三| 亚洲一二三四视频| 久久精品道一区二区三区| 国偷自产av一区二区三区小尤奈| 成人午夜在线影视| 欧美精品色一区二区三区| 欧美成人国产精品一区二区| 亚洲精品1区| http;//www.99re视频| 国产精品扒开做爽爽爽的视频| 色国产综合视频| 中文字幕丰满孑伦无码专区| 亚洲视频免费| 成人久久18免费网站漫画| 黄视频网站在线| 91麻豆精品国产91久久久 | 日韩护士脚交太爽了| 国产视频久久网| 九九九在线观看| 99riav久久精品riav| 日韩网站在线免费观看| 国产精品久久久久av蜜臀| 久久精品视频播放| 99热精品在线播放| 亚洲精品日韩综合观看成人91| 亚洲一区日韩精品| 日韩一级毛片| 91人成网站www| 国产网友自拍视频导航网站在线观看 | 日韩欧美激情一区二区| 日韩精品一区二区三区| 在线看日韩欧美| 91丨九色丨丰满| 亚洲欧美日韩中文播放| 亚洲 自拍 另类 欧美 丝袜| 女主播福利一区| 成人91视频| 福利在线免费视频| 国产婷婷色综合av蜜臀av| 特级西西444www大精品视频免费看| 99久久伊人网影院| 国产男女激情视频| 97人人精品| 2022国产精品| a天堂资源在线| 亚洲美女自拍视频| 国产精品毛片久久久久久久av| 日韩久久一区二区| 欧美图片自拍偷拍| 一本久道久久综合狠狠爱| 欧美最大成人综合网| 日韩亚洲国产免费| 欧美精品video| 三级视频在线播放| 欧洲国内综合视频| www.av视频| www亚洲一区| 亚洲美女爱爱视频| 亚洲视频一二| 日韩精品av一区二区三区| 欧美一区二区三区婷婷| 久久99久久久久久久噜噜| 四虎在线免费看| 欧美精品在线观看一区二区| 黄色一级视频免费观看| 久久综合色一综合色88| 91高清国产视频| 亚洲国产91| 亚洲高清不卡一区| 九九热hot精品视频在线播放| 国产成人精品av| av免费在线观看网站| 亚洲精品色婷婷福利天堂| 国产一区二区三区四区视频| 亚洲综合久久久| 精品成人无码一区二区三区| 国产剧情一区在线| 成人羞羞国产免费网站| 香蕉av一区二区| 美日韩精品免费| 中文字幕日韩在线| 国产精品欧美一区二区| gogo高清午夜人体在线| 日韩在线观看免费网站| 色网站免费观看| 这里只有精品99re| 亚洲欧美偷拍一区| 亚洲成人av电影| 小泽玛利亚一区| 日本一区二区三级电影在线观看 | 一区视频网站| 国产日产欧美精品| 性欧美videohd高精| 久久久久久亚洲精品不卡| 日韩av中文| 亚洲人成在线播放| 亚洲欧美日韩成人在线| 欧美va亚洲va| 99久久久国产精品无码免费 | 国产高清在线观看视频| 欧美羞羞免费网站| 男人午夜免费视频| 五月激情综合婷婷| 久久网免费视频| 亚洲欧美激情一区二区| 后入内射无码人妻一区| 欧美韩国日本一区| 国产aⅴ激情无码久久久无码| 成人h动漫精品一区二区| 91网址在线观看精品| 麻豆精品一区二区三区| 青青在线视频免费| 久久免费高清| 国产成人无码一二三区视频| 亚洲精品视频啊美女在线直播| 粉嫩av一区二区三区天美传媒| 99国产精品一区二区| 亚洲人成网站在线播放2019| av在线不卡顿| 日本一区二区三区免费观看| 在线日本制服中文欧美| 加勒比在线一区二区三区观看| 粉嫩的18在线观看极品精品| 99电影网电视剧在线观看| 国产不卡精品在线| 亚洲aaaaaa| 日韩视频一区二区三区四区| 99re资源| 国产亚洲成av人片在线观黄桃| 91pron在线| 成人看片黄a免费看视频| 国产精品久久久久久免费观看| 成人av影音| 精品久久久久久中文字幕动漫| 懂色av一区二区| 久久精品一二三区| 欧美日本成人| 伊人天天久久大香线蕉av色| 91日韩视频| 老司机激情视频| 亚洲精品九九| 波多野结衣作品集| 麻豆精品久久精品色综合| 日韩av.com| 国产91精品入口| 尤物网站在线观看| 国产欧美一区二区精品性色| 中文乱码字幕高清一区二区| 亚洲免费大片在线观看| 日本天堂在线视频| 在线观看成人免费视频| 国产女18毛片多18精品| 精品国产网站在线观看| 亚洲AV成人无码一二三区在线| 亚洲欧洲国产伦综合| 免费av在线| 国内揄拍国内精品| av在线一区不卡| 91久久爱成人| 日韩av三区| 亚洲欧美日韩不卡| 亚洲免费激情| 九九热精品在线播放| 国产成人在线看| www.黄色在线| 亚洲一区在线免费观看| 无码人妻丰满熟妇区五十路 | 亚洲在线视频免费观看| 无码无套少妇毛多18pxxxx| 51午夜精品国产| 视频二区在线| 久久国产精彩视频| 亚洲精品中文字幕| 亚洲一区中文字幕在线观看| 午夜a一级毛片亚洲欧洲| 国产又大又长又粗又黄| 国产日韩亚洲欧美精品| 日韩成人av免费| 久久久久久久免费视频了| 国产极品国产极品| 在线视频亚洲一区| 五月婷婷在线播放| 超薄丝袜一区二区| 日韩一级二级| 黄色一区三区| 亚洲私拍自拍| 51自拍视频在线观看| 欧美国产乱子伦 | 怡红院av在线| 国产精品最新在线观看| 欧美a一欧美| 800av在线免费观看| 琪琪一区二区三区| 强伦人妻一区二区三区| 亚洲一区视频在线| 国产精品视频第一页| 国产香蕉精品视频一区二区三区| 超免费在线视频| 3d精品h动漫啪啪一区二区| 欧美独立站高清久久| 免费大片在线观看| heyzo一本久久综合| www.av视频在线观看| 日韩午夜中文字幕| 国产原厂视频在线观看| 国产日韩av在线播放| 国内亚洲精品| 不卡影院一区二区| 91亚洲永久精品| 日韩久久精品视频| 亚洲第一页自拍| 激情图片在线观看高清国产| 91九色露脸| 国产精品草草| 亚洲一区二区三区黄色| 亚洲一本大道在线| 亚洲av永久纯肉无码精品动漫| 日日狠狠久久偷偷四色综合免费 | 激情网站在线| av免费观看久久| 好吊一区二区三区| 亚洲视频 中文字幕| 性久久久久久久| 午夜av免费观看| 欧美亚洲另类视频| 九九热线有精品视频99| 亚洲成人福利在线观看| 国产精品乱码人人做人人爱| 无码久久精品国产亚洲av影片| 伊人久久免费视频| 久久精品97| 国产精品h视频| 国产大陆精品国产| 国产无码精品在线播放| 亚洲国产精品福利| av综合电影网站| 日韩国产精品一区二区| 久久99热这里只有精品| 手机在线免费看毛片| 精品久久久久久久久久久久久久久 | 欧美一区 二区| 久久久久人妻精品一区三寸| 国产网红主播福利一区二区| 亚洲熟女乱色一区二区三区久久久| 丝袜一区二区三区| 午夜精品在线| 日日摸日日碰夜夜爽av| 国产日韩视频一区二区三区| 一本色道久久综合无码人妻| 精品少妇v888av| 日韩高清电影免费| 亚洲第一中文av| 亚洲蜜桃精久久久久久久| 蜜桃91麻豆精品一二三区| 欧美性受xxx| 999久久久精品国产| 精人妻一区二区三区| 一本色道久久综合精品竹菊| 免费网站看v片在线a| 国产精品免费一区二区三区四区| 西西人体一区二区| 国产黄在线免费观看| 亚洲精品之草原avav久久| 婷婷成人av| 欧美精品一区免费| 成人免费视频在线观看| 天天摸夜夜添狠狠添婷婷| 国产精品午夜国产小视频| 国产精品红桃| 黄色av片三级三级三级免费看| 日韩久久久久久| 国产精品扒开腿做爽爽爽视频软件| 中国一级大黄大黄大色毛片| 久久久久久久久久久久久久久99| 国产毛片毛片毛片毛片| 欧洲亚洲免费在线| 欧美午夜一区二区福利视频|