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

《精通React/Vue組件設計》之手把手實現一個輕量級可擴展的模態框(Modal)組件

開發 前端
本文是筆者寫組件設計的第九篇文章, 今天帶大家實現一個輕量級且可靈活配置組合的模態框(Modal)組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現。

前言

本文是筆者寫組件設計的第九篇文章, 今天帶大家實現一個輕量級且可靈活配置組合的模態框(Modal)組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現,主要用來提供系統的用戶反饋。

之所以會寫組件設計相關的文章,是因為作為一名前端優秀的前端工程師,面對各種繁瑣而重復的工作,我們不應該按部就班的去"辛勤勞動",而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法。


[筆記]前端組件的一般分類:

  • 通用型組件: 比如Button, Icon等。
  • 布局型組件: 比如Grid, Layout布局等。
  • 導航型組件: 比如面包屑Breadcrumb, 下拉菜單Dropdown, 菜單Menu等。
  • 數據錄入型組件: 比如form表單, Switch開關, Upload文件上傳等。
  • 數據展示型組件: 比如Avator頭像, Table表格, List列表等。
  • 反饋型組件: 比如Progress進度條, Drawer抽屜, Modal對話框等。
  • 其他業務類型

所以我們在設計組件系統的時候可以參考如上分類去設計,該分類也是antd, element, zend等主流UI庫的分類方式。

正文

在開始組件設計之前希望大家對css3和js有一定的基礎,并了解基本的react/vue語法.我們先來解構一下Modal組件, 一個Modal分為以下幾個部分:

圖片

每一個區塊都可以自定義配置, 也可以組合其他組件.實現后的組件效果:

圖片

1、組件設計思路

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

  • 能控制Modal主體的樣式
  • 提供Modal完全關閉后的回調
  • 能控制取消按鈕文字和樣式
  • 能控制確認按鈕文字和樣式
  • 控制modal展示的位置
  • 控制是否顯示右上角的關閉按鈕
  • 可以配置自定義關閉圖標
  • 配置關閉時是否銷毀Modal里的子元素
  • 自定義模態框底部內容
  • 控制是否支持鍵盤esc關閉
  • 控制是否展示遮罩
  • 控制點擊蒙層是否允許關閉
  • 自定義遮罩樣式
  • 自定義標題
  • 控制對話框是否可見
  • 自定義對話框寬度
  • 暴露點擊遮罩層或右上角叉或取消按鈕的回調
  • 提供點擊確定回調

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

圖片

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

2、基于react實現一個Modal組件

(1)Modal組件框架設計

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

import PropTypes from 'prop-types'
import './index.less'
/**
 * Modal Modal組件
 * @param {afterClose} func Modal完全關閉后的回調
 * @param {bodyStyle} object Modal body的樣式
 * @param {cancelText} string|ReactNode 取消按鈕文字
 * @param {centered} bool 居中展示Modal
 * @param {closable} bool 是否展示右上角的關閉按鈕
 * @param {closeIcon} ReactNode 自定義關閉圖標
 * @param {destroyOnClose} bool 關閉時銷毀Modal里的子元素
 * @param {footer} null|ReactNode 底部內容,當不需要底部默認按鈕時,可以設置為footer={null}
 * @param {keyboard} bool 是否支持鍵盤的esc鍵退出
 * @param {mask} bool 是否展示遮罩
 * @param {maskclosable} bool 點擊蒙層是否允許關閉
 * @param {maskStyle} object 遮罩樣式
 * @param {okText} string|ReactNode 確認按鈕的文本
 * @param {title} string|ReactNode 標題內容
 * @param {visible} bool Modal是否可見
 * @param {width} string Modal寬度
 * @param {onCancel} func 點擊遮罩或者取消按鈕,或者鍵盤esc按鍵時的回調
 * @param {onOk} func 點擊確定的回調
 */
function Modal(props) {
  const {
    afterClose,
    bodyStyle,
    cancelText,
    centered,
    closable,
    closeIcon,
    destroyOnClose,
    footer,
    keyboard,
    mask,
    maskclosable,
    maskStyle,
    okText,
    title,
    visible,
    width,
    onCancel,
    onOk
  } = props
  return <div className="xModalWrap">
    <div className="xModalContent">
      <div className="xModalHeader">
      </div>
      <div className="xModalBody">
      </div>
      <div className="xModalFooter">
      </div>
    </div>
    <div className="xModalMask"></div>
  </div>
}
export default Modal

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

(2)實現基礎配置功能

基礎配置功能往往和業務邏輯無關, 僅僅用來控制元素的顯示隱藏等,由于其非常容易實現,所以我們先來實現以下這些屬性的功能:

  • bodyStyle
  • cancelText
  • closable
  • closeIcon
  • footer
  • mask
  • maskStyle
  • okText
  • title
  • width

這幾個功能在框架搭建好之后已經部分實現了,是因為他們都比較簡單,不會牽扯到其他復雜邏輯。只需要對外暴露屬性并使用屬性即可。具體實現如下:

// ...
function Modal(props) {
  // ...
  return <div className="xModalWrap">
    <div 
      className="xModalContent"
      style={{
        width
      }}
    >
      <div className="xModalHeader">
        <div className="xModalTitle">
          { title }
        </div>
      </div>
      {
        closable &&
        <span className="xModalCloseBtn">
          { closeIcon || <Icon type="FaTimes" /> }
        </span>
      }
      <div className="xModalBody" style={bodyStyle}>
        { children }
      </div>
      {
        footer === null ? null :
          <div className="xModalFooter">
            {
              footer ? footer :
                <div className="xFooterBtn">
                  <Button className="xFooterBtnCancel" type="pure">{ cancelText }</Button>
                  <Button className="xFooterBtnOk">{ okText }</Button>
                </div>
            }
          </div>
      }
    </div>
    {
      mask && <div className="xModalMask" style={maskStyle}></div>
    }
  </div>
}

通過以上實現,我們很容易控制一個modal組件具體顯示那些元素,以及那些元素是可關閉modal的,具體案例如下:

  1. 去除footer(通過設置footer為null)。

圖片

  1. 去除右上角的關閉按鈕。

圖片

  1. 去除mask遮罩。

圖片

(3)實現visible(帶有彈窗出來和隱藏的動畫animation)

熟悉antd或者element的朋友都知道,visible用來控制modal的顯示和隱藏,我們這里也來實現同樣的功能,關于隱藏和顯示的動畫,我們這里用transform:scale來實現。先來看看實現效果吧:

圖片

這里筆者使用了react hooks的useState這個API,來設置彈窗可見性的state,modal默認不可見。具體邏輯如下:

let [isHidden, setHidden] = useState(!props.visible)
const handleClose = () => {
    setHidden(false)
}

html結構如下:

<div className="xModalWrap" style={{display: isHidden ? 'none' : 'block'}}>

由以上代碼我們知道模態框的顯示隱藏是通過設置display:none/block來控制的,但是我們都知道display:none是不能執行動畫效果的,為了實現內容彈窗的動畫,我們這里采用了@keyframe動畫,對于低版本瀏覽器也采用了很好的向下兼容。具體css代碼如下:

@keyframes xSpread {
    0% {
        opacity: 0;
        transform: scale(0);
    }
    100% {
        opacity: 1;
        transform: scale(1);
    }
}

(4)實現centered

centered屬性的作用就是來控制彈窗內容距離整個遮罩或者可視區域的位置的,值為true則居與遮罩或者可視區域的正中心。因為我們默認設置的modal內容區域的位置是左右居中,頂部距離可視區域頂部100px,所以這里我們實現如下:

<div className={`xModalContent${centered ? ' xCentered' : ''}`}>
&.xCentered {
    top: 50%;
    transform: translateY(-50%);
}

這個實現也非常簡單,就是通過屬性centered來動態的設置類名即可。

(5)實現destroyOnClose

這個功能意思是在彈窗關閉時是否清除子元素,我在:《精通react/vue組件設計》之配合React Portals實現一個功能強大的抽屜(Drawer)組件這篇文章中有詳細的介紹,大家感興趣可以研究以下,這里我指介紹實現過程。
當destroyOnClose為true時,我們銷毀子元素即可,通過維護一個state來實現組件的重新渲染。要想實現該功能,我們需要處理如下幾個事件:

  • 當點擊關閉按鈕時,根據destroyOnClose銷毀子組件。
  • 當點擊確認按鈕時,根據destroyOnClose銷毀子組件。
  • 當visible為true,根據destroyOnClose將子組件重新渲染出來。
    具體實現代碼如下:
// 關閉事件(關閉和確認事件邏輯基本一致,這里就不單獨寫了)
const handleClose = () => {
    setHidden(true)
    if(destroyOnClose) {
      setDestroyChild(true)
    }
    document.body.style.overflow = 'auto'
    onCancel && onCancel()
}


// visivle/destroyOnClose更新時,重新渲染子組件
useEffect(() => {
    if(visible) {
      if(destroyOnClose) {
        setDestroyChild(true)
      }
    }
  }, [visible, destroyOnClose])

這樣我們就實現了彈窗關閉時銷毀組件的功能。

(6)實現鍵盤按鍵ESC時關閉模態框(Modal)

為了更好的用戶體檢,筆者的Modal組件支持鍵盤事件,我們都知道鍵盤的ESC對應的事件碼為27,那么我們就能根據這個原理來實現鍵盤按鍵ESC時關閉模態框:

useEffect(() => {
    document.onkeydown = function (event) {
      let e = event || window.event || arguments.callee.caller.arguments[0]
      if (e && e.keyCode === 27) {
        handleClose()
      }
    }
  }, [])

因為事件監聽只需要執行一次,所以useEffect的依賴設置為空數組即可。雖然這樣已經基本實現了鍵盤關閉的功能,但是這樣的代碼明顯不夠優雅,所以我們來完善以下,我們可以將鍵盤關閉的方法抽離出來,然后在useEffect的第一個回調函數中返回另一個函數(該函數里是組件卸載前的鉤子),當組件卸載時我們將事件監聽移除,這樣可以提高一些性能,對內存優化也有幫助:

const closeModal = function (event) {
    let e = event || window.event || arguments.callee.caller.arguments[0]
    if (e && e.keyCode === 27) {
      handleClose()
    }
  }


 useEffect(() => {
    document.addEventListener('keydown', closeModal, false)
    return () => {
      document.removeEventListener('keydown', closeModal, false)
    }
  }, [])

通過這種方式,代碼和功能實現上是不是會更優雅呢?

(7)實現afterClose

afterClose的作用主要是在模態框關閉之后執行某個回調函數。我們使用class組件很好實現這個功能,因為setState可以傳兩個參數,一個是更新state的回調,另一個是state更新之后的回調,我們只需要把afterClose放到更新后的回調即可,也就是第二個參數回調里。但是我們modal組件目前是用react hooks和函數式組件寫的,那么怎么實現狀態更新后的回調呢?筆者這里提供一個實現思路,利用閉包來實現,核心代碼如下:

// 函數組件外部
let hiddenCount = 0;
//  函數組件內部
useEffect(() => {
    if(isHidden && hiddenCount) {
      hiddenCount = 0
      afterClose && afterClose()
    }
    hiddenCount = 1
  }, [isHidden])

我們知道useEffect不僅僅可以實現監聽掛載組件的鉤子,也同樣能監聽state更新,我們利用這一點來實現該功能,值得注意的是我們要在執行afterClose前重置hiddenCount,避免其他使用modal組件的函數的影響。

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

import PropTypes from 'prop-types'
// ...
Modal.propTypes = {
  afterClose: PropTypes.func,
  bodyStyle: PropTypes.object,
  cancelText: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.element
  ]),
  centered: PropTypes.bool,
  closable: PropTypes.bool,
  closeIcon: PropTypes.element,
  destroyOnClose: PropTypes.bool,
  footer: PropTypes.oneOfType([
    PropTypes.element,
    PropTypes.object
  ]),
  keyboard: PropTypes.bool,
  mask: PropTypes.bool,
  maskclosable: PropTypes.bool,
  maskStyle: PropTypes.object,
  okText: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.element
  ]),
  title: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.element
  ]),
  visible: PropTypes.bool,
  width: PropTypes.string,
  onCancel: PropTypes.func,
  onOk: PropTypes.func
}

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

.xModalWrap {
    position: fixed;
    z-index: 999;
    top: 0;
    left: 0;
    width: 100%;
    bottom: 0;
    overflow: hidden;
    .xModalContent {
        position: relative;
        z-index: 1000;
        margin-left: auto;
        margin-right: auto;
        position: relative;
        top: 100px;
        background-color: #fff;
        background-clip: padding-box;
        border-radius: 4px;
        -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
        pointer-events: auto;
        animation: xSpread .3s;
        &.xCentered {
            top: 50%;
            transform: translateY(-50%);
        }
        .xModalHeader {
            padding: 16px 24px;
            color: rgba(0, 0, 0, 0.65);
            background: #fff;
            border-bottom: 1px solid #e8e8e8;
            border-radius: 4px 4px 0 0;
            .xModalTitle {
                margin: 0;
                color: rgba(0, 0, 0, 0.85);
                font-weight: 500;
                font-size: 16px;
                line-height: 22px;
                word-wrap: break-word;
            }
        }
        .xModalCloseBtn {
            position: absolute;
            top: 0;
            right: 0;
            z-index: 10;
            padding: 0;
            width: 56px;
            height: 56px;
            color: rgba(0, 0, 0, 0.45);
            font-size: 16px;
            line-height: 56px;
            text-align: center;
            text-decoration: none;
            background: transparent;
            border: 0;
            outline: 0;
            cursor: pointer;
        }
        .xModalBody {
            padding: 16px 24px;
        }
        .xModalFooter {
            padding: 10px 16px;
            text-align: right;
            background: transparent;
            border-top: 1px solid #e8e8e8;
            border-radius: 0 0 4px 4px;
            .xFooterBtn {
                .xFooterBtnCancel, .xFooterBtnOk {
                    margin-left: 6px;
                    margin-right: 6px;
                }
            }
        }
    }
    .xModalMask {
        position: fixed;
        z-index: 999;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        overflow: hidden;
        background-color: rgba(0,0,0, .5);
    }
}


@keyframes xSpread {
    0% {
        opacity: 0;
        // 之所以要再加translateY(-50%),是為了防止動畫抖動
        transform: translateY(-50%) scale(0);
    }
    100% {
        opacity: 1;
        transform: translateY(-50%) scale(1);
    }
}

通過以上步驟, 一個健壯的的Modal組件就完成了.Modal組件算是組件庫中中等復雜的組件,如果不懂的可以在評論區提問,筆者看到后會第一時間解答。

(9)使用Modal組件

我們可以通過如下方式使用它:

<Modal title="xui基礎彈窗" centered mask={false} visible={false}>
    <p>我是彈窗內容</p>
    <p>我是彈窗內容</p>
    <p>我是彈窗內容</p>
    <p>我是彈窗內容</p>
</Modal>

筆者已經將實現過的組件發布到npm上了,大家如果感興趣可以直接用npm安裝后使用,方式如下:

npm i @alex_xu/xui


// 導入xui
import {
  Button,
  Skeleton,
  Empty,
  Progress,
  Tag,
  Switch,
  Drawer,
  Badge,
  Alert
} from '@alex_xu/xui'

該組件庫支持按需導入,我們只需要在項目里配置babel-plugin-import即可,具體配置如下:

// .babelrc
"plugins": [
  ["import", { "libraryName": "@alex_xu/xui", "style": true }]
]

npm庫截圖如下:

圖片

最后

后續筆者將會繼續實現

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

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

責任編輯:姜華 來源: 趣談前端
相關推薦

2022-03-10 09:00:37

提醒框ReactVue

2023-04-28 09:30:40

vuereact

2023-09-05 20:17:18

typescriptPropTypesreact

2022-09-22 12:38:46

antd form組件代碼

2020-12-15 08:58:07

Vue編輯器vue-cli

2021-03-31 08:01:24

React Portareactcss3

2016-09-26 15:14:28

Javascript前端vue

2009-07-17 14:38:51

輕量級Swing組件

2009-07-14 18:05:28

輕量級Swing組件

2020-12-02 12:29:24

Vue無限級聯樹形

2022-06-28 15:29:56

Python編程語言計時器

2018-11-22 09:17:21

消息推送系統

2022-01-24 11:02:27

PySimpleGUPython計算器

2021-06-21 15:49:39

React動效組件

2021-06-22 10:43:03

Webpack loader plugin

2022-11-07 18:36:03

組件RPC框架

2021-11-10 11:40:42

數據加解密算法

2024-11-20 13:18:21

2019-08-26 09:25:23

RedisJavaLinux

2022-02-16 16:24:05

HarmonyOS鴻蒙操作系統
點贊
收藏

51CTO技術棧公眾號

一本久久a久久免费精品不卡| 日韩av网站免费在线| 日韩西西人体444www| 69精品丰满人妻无码视频a片| www.天堂av.com| 99亚洲一区二区| 亚洲最大在线视频| 亚洲成人手机在线观看| 日本一级理论片在线大全| 不卡av在线免费观看| 国产精品9999| 国产精品高潮呻吟AV无码| 黄色成人在线观看网站| 亚洲理论在线观看| 日本福利一区二区三区| a天堂在线视频| 久久av一区二区三区| 精品国产依人香蕉在线精品| 成人在线电影网站| 成人福利一区二区| 精品国产999| 潘金莲一级淫片aaaaaa播放1| 性感美女一级片| 国产一区二区三区免费观看| 日本国产精品视频| 不卡的免费av| 天天射—综合中文网| 亚洲欧美日韩综合| 极品白嫩的小少妇| 高清国产一区二区三区四区五区| 欧美性猛交xxxx免费看| 国产精彩视频一区二区| av在线下载| 国产精品传媒视频| 日韩久久精品一区二区三区| 天堂成人在线视频| 国产成人精品1024| 91在线观看免费高清| 国产免费www| 国产视频一区三区| 欧美精品久久久久久久免费观看| 99精品中文字幕| 欧洲grand老妇人| 亚洲码在线观看| 少妇一级淫免费观看| 99这里只有精品视频| 91精品久久久久久久久99蜜臂| 九色porny91| 久久人体大尺度| 黑丝美女久久久| 欧美色图色综合| 爱啪啪综合导航| 亚洲.国产.中文慕字在线| 99久久免费观看| 在线中文字幕电影| 亚洲免费观看在线观看| 国产成人三级视频| 国产原创在线观看| 亚洲人妖av一区二区| 正在播放久久| 欧美高清视频| 亚洲日本青草视频在线怡红院 | 777精品久无码人妻蜜桃| 青草青在线视频| 亚洲一区二区三区四区五区中文 | 国产午夜福利一区| 国内精品视频在线观看| 国产一区二区三区在线播放免费观看 | 亚洲激情一区二区| 永久免费av在线| 亚洲婷婷综合久久一本伊一区| 中文字幕日韩一区二区三区不卡| 黄网站app在线观看| 一区二区在线观看视频在线观看| 久久综合久久久久| 小早川怜子影音先锋在线观看| 狠狠色狠狠色综合日日五| 日韩av资源在线| 成人做爰视频www| 欧美男生操女生| 中文字幕一二三| 欧美电影在线观看免费| 亚洲欧洲午夜一线一品| 成人一级片免费看| 欧美久久99| 欧美一级免费视频| 波多野结衣一本一道| 青青草国产精品亚洲专区无| 91视频九色网站| 午夜福利视频一区二区| 久久亚洲精华国产精华液 | 欧美不卡在线| 91av在线看| 亚洲天堂网视频| 国产乱理伦片在线观看夜一区| 国产精品白丝jk白祙| 黄色片在线免费观看| 亚洲人成网站在线| 久草精品视频在线观看| 一区二区三区导航| 国产欧美日韩专区发布| 亚洲国产欧美另类| 久久伊99综合婷婷久久伊| 亚洲a∨一区二区三区| jizz性欧美| 日韩欧美在线观看视频| 制服丝袜中文字幕第一页 | 欧美日韩一级片在线观看| 亚洲网中文字幕| 欧美电影在线观看完整版| 最近中文字幕日韩精品| 日本学生初尝黑人巨免费视频| 免费成人在线影院| 高清不卡日本v二区在线| 美丽的姑娘在线观看免费动漫| 亚洲人妖av一区二区| 欧美成人黑人猛交| 懂色av一区二区| 久久精彩免费视频| 国产精品乱码一区二区视频| 高清在线观看日韩| 日韩亚洲视频在线| 成人bbav| 日韩精品专区在线影院重磅| youjizz亚洲女人| 久久久久久穴| 国产精品一区二区免费看| 生活片a∨在线观看| 日韩欧美999| 亚洲图片综合网| 午夜视频一区| 91性高湖久久久久久久久_久久99| 国产在线电影| 欧美视频精品一区| 大尺度做爰床戏呻吟舒畅| 91精品一区国产高清在线gif | 怡红院av久久久久久久| 成人av中文字幕| 2022中文字幕| 久久天堂久久| 乱亲女秽乱长久久久| 一级黄色录像大片| 国产精品免费免费| 一级黄色特级片| 成人vr资源| 国产成人一区二区| 国模吧精品人体gogo| 欧美特级www| 草草影院第一页| 久久久久久婷| 日韩精品最新在线观看| 亚洲天堂1区| 在线播放国产精品| 岳乳丰满一区二区三区| 国产精品网站一区| 天天干天天草天天| 天天做天天爱天天综合网2021| 国产精品一区二区久久久久| 日本在线看片免费人成视1000| 欧美日韩久久一区| 国产探花在线视频| 国产一区二区不卡老阿姨| 亚洲国产精品影视| 999精品视频在这里| 欧美激情一区二区久久久| 粉嫩av一区二区夜夜嗨| 天天综合色天天| 久久久久久九九九九九| 日韩不卡手机在线v区| 亚洲v欧美v另类v综合v日韩v| 国产一区精品福利| 在线精品高清中文字幕| 国产精品爽爽久久久久久| 亚洲精品自拍动漫在线| yjizz视频| 日韩精品一二区| 中文字幕一区二区三区精彩视频| 日本精品在线播放| 91av福利视频| av大全在线免费看| 日韩三级中文字幕| 狠狠人妻久久久久久综合| 中日韩av电影| av在线天堂网| 石原莉奈一区二区三区在线观看| 亚洲人成网站在线播放2019| 涩爱av色老久久精品偷偷鲁| 欧美一级高清免费| 成人在线观看亚洲| 亚洲娇小xxxx欧美娇小| 中文字幕无码乱码人妻日韩精品| 亚洲免费大片在线观看| 中文字幕一区二区人妻在线不卡| 美日韩一区二区三区| 国产精品视频网站在线观看| 一道在线中文一区二区三区| 成人网页在线免费观看| 性欧美xxx69hd高清| 久久精品视频亚洲| 日本中文字幕电影在线观看| 6080yy午夜一二三区久久| 欧美亚韩一区二区三区| 中文字幕av一区二区三区免费看 | 国产中文字幕二区| 欧洲毛片在线视频免费观看| 国产成人亚洲欧美| 日韩成人综合网站| 91精品国产一区| 黄色免费在线网站| 亚洲性无码av在线| 亚洲乱熟女一区二区| 欧美性色欧美a在线播放| 国产在线视频99| 亚洲欧美在线另类| 少妇大叫太粗太大爽一区二区| 国产精品一二二区| 亚洲欧洲日本精品| 免费一级欧美片在线播放| 黄色录像特级片| 日韩精品免费一区二区在线观看| 韩国成人av| 日韩精品一区二区三区免费视频| 国产精品精品视频一区二区三区| bl在线肉h视频大尺度| 久久精品一偷一偷国产| 成人免费一区二区三区视频网站| 亚洲国产日韩欧美在线图片| 国产免费无遮挡| 欧美日韩小视频| 欧美一级黄视频| 日韩欧美一区二区三区| 日韩欧美一级视频| 亚洲va国产va欧美va观看| 私库av在线播放| 综合色中文字幕| 懂色av粉嫩av蜜臀av一区二区三区| 久久综合色一综合色88| 四季av综合网站| 成人免费高清视频在线观看| 亚洲av综合色区无码另类小说| 激情欧美一区二区| 九九九九九伊人| 久久99久国产精品黄毛片色诱| 嫩草影院国产精品| 日本强好片久久久久久aaa| 中文字幕无码不卡免费视频| 麻豆精品网站| 久久精品一区二| 久久久精品日韩| 欧美牲交a欧美牲交aⅴ免费真| 国产精品日韩精品欧美精品| www黄色日本| 国产精品综合| 91看片就是不一样| 日韩avvvv在线播放| 亚洲天堂网一区| 蜜桃视频一区二区三区在线观看| 手机在线成人免费视频| 麻豆91精品视频| 亚洲免费成人在线视频| 国产美女在线精品| 北条麻妃亚洲一区| 国产电影一区二区三区| 亚洲高清av一区二区三区| 国产精品一区二区黑丝| av电影中文字幕| 99久久精品久久久久久清纯| 精品国产无码在线观看| 中日韩av电影| 久久久久无码国产精品| 亚洲自拍欧美精品| 日本在线观看视频网站| 日韩欧美精品免费在线| 亚洲综合成人av| 日韩视频一区二区三区| 五月婷婷深深爱| 伊人久久久久久久久久久久久| 色影视在线观看| 欧美精品免费看| 三级在线看中文字幕完整版| 国产精品91在线观看| 精品午夜av| 精品久久久久久乱码天堂| 奇米色欧美一区二区三区| 中文字幕制服丝袜在线| 狠久久av成人天堂| 天天摸天天碰天天添| 久久99精品国产麻豆婷婷洗澡| 国产免费无码一区二区| 国产色一区二区| 久久久精品视频在线| 色婷婷亚洲精品| 草逼视频免费看| 亚洲欧美第一页| 丝袜美腿av在线| 国产成人精品电影久久久| 国产一区二区三区| 欧美精品一区二区三区久久| 亚洲色图欧美| 最近免费中文字幕中文高清百度| 国内精品免费在线观看| 国产又粗又猛又爽视频| 夜夜嗨av一区二区三区四季av| 中文字幕在线欧美| 欧美xxxx老人做受| 亚洲视频tv| 2018日韩中文字幕| 日韩精品中文字幕吗一区二区| 欧美亚洲丝袜| 精品二区久久| 日本高清免费观看| 欧美—级在线免费片| www.av视频在线观看| 欧美精品一二三| 日本护士...精品国| 久久91精品国产91久久跳| a屁视频一区二区三区四区| 激情视频一区二区| 欧美一区综合| 在线观看免费的av| 久久精品一级爱片| 一区二区三区视频免费看| 欧美一区二区三区在线看| av中文天堂在线| 欧洲成人性视频| 六月丁香久久丫| 韩国无码av片在线观看网站| 久久97超碰国产精品超碰| 国产高潮呻吟久久| 疯狂欧美牲乱大交777| 精品人妻一区二区三区浪潮在线| 色狠狠av一区二区三区香蕉蜜桃| 久九九久频精品短视频| 久久久久se| 亚洲九九精品| 97精品人妻一区二区三区蜜桃| 亚洲综合无码一区二区| 国产福利免费视频| 久久综合电影一区| 国产一区二区三区黄网站| 伊人色综合久久天天五月婷| 美女网站色91| 国产一二三av| 欧美另类一区二区三区| 亚洲精品传媒| 91亚洲午夜在线| 欧美ab在线视频| 香蕉视频免费网站| 亚洲一区二区在线免费看| 亚洲精品视频专区| 欧美激情中文字幕在线| h视频久久久| 亚洲人成无码网站久久99热国产| 成人小视频在线| 日本高清www免费视频| 亚洲精品白浆高清久久久久久| 免费看男女www网站入口在线| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲一区二区毛片| 五月天精品视频| 欧美性一级生活| 黄在线免费观看| 国产精品久久久久久久久久久久冷| 伊人成人在线视频| 欧美bbbbb性bbbbb视频| 日本韩国欧美在线| 午夜视频在线看| 999精品视频一区二区三区| 亚洲黄色一区| 一区二区伦理片| 欧美人xxxx| 黄色美女视频在线观看| 久久久久一区二区| 麻豆精品一区二区综合av| av成人免费网站| 亚洲精品国产精品乱码不99按摩| 免费日韩电影| 中文字幕乱码一区二区三区| 成人激情动漫在线观看| 久久久久在线视频| 大胆欧美人体视频| 欧美精品中文字幕亚洲专区| 午夜免费高清视频| 一区二区三区欧美亚洲| 日本人妖在线| 91中文在线观看| 性欧美长视频| 日本爱爱小视频| 日韩精品有码在线观看| 国产精品777777在线播放| 国产精品后入内射日本在线观看| 国产欧美日韩久久| 亚洲精品久久久狠狠狠爱| 国产精品久久久久久久久粉嫩av| 中文字幕乱码亚洲无线精品一区| 特级西西人体wwwww| 欧美日韩美少妇| 色黄视频在线观看| 特大黑人娇小亚洲女mp4| 国产亚洲精品超碰|