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

淺談前端組件設計

開發 前端
由于Headless組件的抽象程度較高,所需的設計成本也更高,因此并不適用于所有前端場景。其更適合用于開發橫跨多個不同業務或跨端的通用組件,開發者需要在開發底層Headless組件和開發多套組件中衡量成本、作出抉擇。

本文為來自 字節跳動-國際化電商-S 項目團隊 成員的文章,已授權 ELab 發布。

?為何要進行前端組件設計??

與僅承擔數據處理邏輯的后端不同,前端需要負責界面渲染、數據處理、和接口調用,在框架誕生前,更多地是編寫頁面維度的順序腳本代碼。隨著前端繼續的持續發展,ES6推出了class語法糖,React提出了函數式組件,Vue則以模版語法的形式組織代碼,前端代碼逐漸從“平鋪”轉變到了“層級”結構,從“面向過程”進階為“面向對象”,前端組件也成為了近幾年來的熱門議題。

“組件是對數據和方法的簡單封裝,是軟件中具有相對獨立功能、接口由契約指定、和語境有明顯依賴關系、可獨立部署、可組裝的軟件實體。”這段百科中摘取的組件定義,揭示了組件所需要具備的特性:功能獨立、約定一致、可集成、服務于場景。

在軟件工程中,軟件設計是軟件開發流程中的必要階段,在需求分析后、軟件開發前進行。軟件復雜度是每一個項目演進的產物,隨著需求和代碼行數的增加,復雜度將持續提升。軟件設計的優劣為對復雜度帶來的影響是不同的,優雅、合理的設計使待開發的代碼復雜度可控,而拙劣的設計將會給軟件帶來無序、偶然的復雜度變更。一個優秀的前端組件需要在滿足需求的前提下,具備高易用性和良好的可擴展性,這是我們進行前端組件設計的目標。

???如何提升組件易用性??

合理的組件封裝

組件既生于頁面,又能夠獨立于頁面。我們不能將整個頁面雜糅為一個組件,也不能將每一小塊UI都封裝為組件。前端組件按類型可以分為容器組件、功能組件和展示組件,一個優秀的組件應該保證:功能內聚、樣式統一、并且與父元素僅通過Props通信。

組件的封裝粒度并不是越小越好,很多時候一個組件是在其他一個或多個組件的基礎上開發的,無法完全以功能點的數量衡量是否遵循單一職責原則,組件開發者需要根據組件功能和目標來確定組件封裝粒度:

  1. 當該組件需要承載具體的額外功能時,相較于新增 API ,封裝成獨立的組件是更好的選擇。

??:InputTag組件 在 Input、Tag 的基礎上,增加了部分交互功能,API整合了兩個組件的屬性,作為一個全新的組件提供給開發者使用。相似的,InputNumber、AutoComplete、Mentions等組件也是基于單一職責原則封裝的特定功能組件。

圖片

  1. 當組件中存在可能被單獨使用、可以承載獨立功能的子組件時,可以將其以內部組件的形式提供。

??:圖片預覽功能通常依托著圖片組件使用,在實際系統中,喚起圖片預覽的觸發器不一定是圖片,可能是按鈕或其他觸發事件,因此預覽組件需要單獨提供給開發者使用。預覽組件作為 Image 的內部組件,開發者能夠以Image.Preview、Image.PreviewGroup的方式使用,并提供左右切換、圖片縮放等功能,用戶可以通過 srcList、visible、actions、scales等API來控制并定制化預覽組件。

圖片

圖片

規范的API編寫

一個易用的組件,使用者無需閱讀文檔或僅快速瀏覽文檔即可上手使用,并且應當在使用過程中給予清晰的注釋和代碼提示。希望以下API編寫建議能夠給組件開發者一些參考:

  1. 減少必填的API項,盡可能多地提供默認值,降低組件的使用成本;
  2. 使用通用且有意義的API命名:
  1. onXXX:命名監聽/觸發方法
  2. renderXXX:命名渲染方法
  3. beforeXXX/afterXXX:命名前置/后置動作
  4. xxxProps:命名子組件屬性
  5. 優先使用常見單詞進行命名,如:value、visible、size、disabled、label、type等等
  1. 單獨維護類型文件,并將其打包至組件產物包中,這樣使用者在開發過程中能夠實時看到對應的類型提示;
  2. 在類型文件中,為API編寫注釋;

[Slot] 與 [Props] 的選擇

使用Props存在的問題?

當我們需要實現一個較為復雜的卡片需求組件時,為了最大程度地還原UI、減少用戶的樣式開發成本,首次設計時我們會設計出這樣的API:

export type CardProps = {
// 底部信息展示
infoProps?: {
title?: ReactNode;
content?: ReactNode;
};
// 彈層信息展示
moreInfoProps?: {
info?: ReactNode;
triggerProps?: TriggerProps;
descriptionsProps?: DescriptionsProps;
};
className?: string;
style?: CSSStyleSheet;
width?: number | string;
imageProps?: {
srcList?: Array<SrcList>; // 圖片url數組
afterImgs?: React.ReactNode; // 插槽,在圖片dom節點中
aspectRatio?: string; // 寬高比 默認3:4
buttonProps?: ButtonProps;
current?: number; // 受控展示圖
defaultCurrent?: number; // 默認展示圖
onChangeCurrent?: (current: number) => undefined; // 設置current
PreviewGroupProps?: ImagePreviewGroupProps;
src?: string;
};
children?: React.ReactNode;
} & CardCheckboxProps;

可以看到,這個業務卡片組件是由多個不同組件組合而成,其承載了渲染和操作(選中操作、圖片切換和彈層操作),這個設計的缺陷是顯而易見的:

  1. 需要編寫很多分散的JSX代碼,無論是寫在Props中還是定義成單獨的組件,其可讀性都不高;
  2. 需要在Card組件中雜糅許多額外的Props,例如triggerProps和descriptionsProps,增加了該組件的學習成本;

如果以插槽的方式對Card組件進行改造,通過內部組件間的組合來實現需求,避免了大量組件Props的堆砌,層次清晰、可讀性高,這樣的組件結構明顯易用性更高。

<Card type="verticle" {...cardProps}>
<CardImage {...ImageProps} />
<CardContent {...InfoProps} >
<div className="card-title">title</div>
<div className="card-content">content</div>
<Tag>Tag</Tag>
</CardContent>
<CardTrigger {...triggerProps}>
<Description {...descriptionProps}/>
</CardTrigger>
</Card>

什么是插槽(Slot)?

圖片

Slot是Vue框架提出的概念,可以理解為臨時占位,可以用其他組件進行填充,Slot能夠實現父組件向子組件分發內容的功能。Vue框架中提供了

  1. 使用 props.children 獲取子組件,若需要區分使用不同子組件,只能通過數組下標讀取。
  2. 使用 Props 傳遞 ReactNode 元素。
  3. 將組件劃分為多個內部組件,交由開發者自行組裝。

Slot(內部組件)的使用時機?

  • 布局類組件優先使用Slot,為開發者提供更靈活的使用方式,參考Typography、Layout、Card等組件,開發者可以隨意地在這些組件內部插入自定義實現。上文提到的業務卡片組件,實質上也是一個封裝了多圖預覽功能的布局組件,因此更適合使用Slot來組織代碼。
  • 內容復雜、定制化程度高的組件更適合使用Slot
  • 功能類組件中,以Props傳遞ReactNode的方式來接管內部元素,盡量避免傳遞基礎類型元素進行展示。
// ? 擴展性低
type CardProps {
title?: string;
tags?: string[];
}
// ? 為開發者提供對應的“插槽”
type CardProps {
title?: string | ReactNode;
tag?: string[] | ReactNode;
}

???如何提升組件可擴展性??

開閉原則:對擴展開放,模塊的行為可以被擴展;對修改關閉,模塊中的源代碼不應該被修改

將DOM交予用戶接管

在前端組件中,應該提供對應的API屬性或方法來支持額外的功能,給予開發者更充分的擴展空間,而不是有部分需求無法滿足時放棄使用組件。以 Cascader組件 為例(以下例子若無特殊說明,均來自Arco組件庫),在通常情況下,僅需要使用左側的基礎選擇器即可滿足需求。

圖片

此時若開發者需要在級聯選擇器底部添加操作按鈕或文字展示,可能會直接修改組件源代碼、甚至放棄使用該組件。作為組件開發者,為了提升組件可擴展性,在此處增加了 dropdownRender?屬性,接收一個返回 ReactNode? 的函數,并將此 ReactNode 渲染在級聯選擇器的特定位置。

圖片

<Cascader
optinotallow={options}
dropdownRender={(menu) => {
// menu 為所有選擇器元素
return (
<div>
{menu}
<Divider style={{ margin: 0 }} />
<div style={{ margin: 4 }}>
The footer content
</div>
</div>
);
}}
/>

與此類似的,還有 renderFooter、renderOption、renderFormat 等API,這些API實現難度并不高,一定程度上將DOM元素的掌控權交予組件使用者,作為通用組件,為開發者提供了部分功能和樣式的可擴展性。我們在設計前端組件時,多多留意組件中能夠接管給使用者的渲染邏輯和操作邏輯,并將這些邏輯暴露出去。

設計可擴展的API

組件開發前,整理組件所需實現的功能,并以功能為維度設計組件API。以下是一個設計移動端選擇器的例子,這個選擇器需要支持單選、多選和時間選擇,于是這樣寫了第一版API??,它可以滿足我們當前的選擇器需求。

type PickerProps {
dataSource?: PickerData[] | PickerData[][];
multiple?: boolean; // 是否多選
time?: boolean; // 是否時間選擇
value?: (string|number)[];
onChange?: (value: (string|number)[]) => void;
...
}

在后續迭代中發現還有地區選擇和級聯選擇的需求,選擇器需要進行優化更新,在以上API的基礎上只能通過添加cascader、region兩個布爾值字段用于標識不同選擇需求。這樣做的缺陷是很明顯的,每當我們新增不同類型的選擇功能,都需要新增一個API字段,并且這些字段還是互斥關系。理清問題后,更新了第二版API??。在組件庫中很多API都設計為常量枚舉值的形式,即使其只有兩個取值,這樣擴展性相較于布爾值類型更好。

type PickerProps {
dataSource?: PickerData[] | PickerData[][];
type?: "single" | "multiple" | "cascader" | "region" | "time"; // 選擇器類型
value?: (string|number)[];
onChange?: (value: (string|number)[]) => void;
...
}

除上述例子外,還可以利用ts的泛型和可選類型來實現API擴展,例如 Table 組件的pagination、border等字段,既可以直接設置為true/false,也能夠以對象的形式進行更詳細的配置。

極致的擴展性——Headless UI

圖片

首次接觸headless概念是在chrome瀏覽器中,在headless模式下用戶無需看到網頁界面即可進行網頁操作,現在廣泛用于web自動化測試和爬蟲場景中。與之相似的,Headless UI 是基于 React Hooks 的組件開發設計理念,強調只負責組件的狀態及交互邏輯,不關注組件的樣式實現。其本質思想其實就是關注點分離,將組件的“狀態及交互邏輯”和“UI 展示層”實現解耦。

Headless UI目前有兩種主流實現方式,其一是將組件劃分為多個原子組件,使用者可以通過填充組件或修改樣式的方式來實現自己的需求,其二是以Hooks的方式暴露內置交互功能的子組件屬性,使用者可以將這些屬性應用于任意組件上,由于沒有將樣式封裝到組件中,Headless組件實現了最大程度的視圖層可擴展性。

圖片

<NumberInput>
<NumberInputField />
<NumberInputStepper>
<NumberIncrementStepper />
<NumberDecrementStepper />
</NumberInputStepper>
</NumberInput>
// chakra-ui 提供的數字增減框組件
function HookUsage() {
const { getInputProps, getIncrementButtonProps, getDecrementButtonProps } =
useNumberInput({
step: 0.01,
defaultValue: 1.53,
min: 1,
max: 6,
precision: 2,
})

const inc = getIncrementButtonProps()
const dec = getDecrementButtonProps()
const input = getInputProps()

return (
<HStack maxW='320px'>
<Button {...inc}>+</Button>
<Input {...input} />
<Button {...dec}>-</Button>
</HStack>
)
}

由于Headless組件的抽象程度較高,所需的設計成本也更高,因此并不適用于所有前端場景。其更適合用于開發橫跨多個不同業務或跨端的通用組件,開發者需要在開發底層Headless組件和開發多套組件中衡量成本、作出抉擇。

?Reference?

https://arco.design/react/docs/start

https://juejin.cn/post/7160223720236122125

https://juejin.cn/post/6844904032700481550

責任編輯:武曉燕 來源: ELab團隊
相關推薦

2009-08-10 10:19:47

ASP.NET組件設計

2009-09-02 13:22:23

C#組件化程序設計

2009-07-15 13:06:38

Swing組件

2019-10-21 09:40:17

JavaScript瀏覽器Flash

2009-06-25 13:03:48

JSF的UI組件

2012-06-21 11:02:43

前端開發

2021-08-29 23:25:36

前端開發工具

2019-11-01 10:00:14

前端業務代碼

2009-06-24 17:05:10

2024-07-08 08:53:52

2009-09-21 17:30:25

組件復用服務復用

2022-10-09 14:15:42

短鏈設計

2011-09-01 10:21:52

jQuery Mobi元素

2015-10-26 10:32:01

前端優化工程化

2023-02-28 11:43:35

2021-08-31 14:56:51

鴻蒙HarmonyOS應用

2009-07-02 13:31:13

JSP組件

2012-01-09 15:46:37

Delphi 7

2013-11-13 14:00:31

網頁設計設計

2009-07-10 09:31:57

MyEclipse U
點贊
收藏

51CTO技術棧公眾號

99久久久精品免费观看国产蜜| 91tv精品福利国产在线观看| 日本丶国产丶欧美色综合| 鲁丝一区二区三区免费| 波多野结衣毛片| 天天综合一区| 日韩精品久久久久| www.夜夜爽| 7777kkk亚洲综合欧美网站| xfplay精品久久| 成人免费在线视频网址| 久草视频精品在线| 成人无号精品一区二区三区| 日韩美女视频在线| 国产福利一区视频| av电影免费在线看| 亚洲欧洲另类国产综合| 明星裸体视频一区二区| 99产精品成人啪免费网站| 欧美一级播放| 欧美国产第一页| 伊人影院综合网| 麻豆一区二区麻豆免费观看| 欧美另类一区二区三区| 91视频 -- 69xx| 99视频免费在线观看| 国产清纯美女被跳蛋高潮一区二区久久w| 2019国产精品视频| 最近日韩免费视频| 亚洲中字在线| 国模精品系列视频| 国产三级国产精品国产国在线观看| 亚洲精品小区久久久久久| 日韩一区二区免费电影| 污污网站免费看| 亚洲欧美小说色综合小说一区| 亚洲精品你懂的| 欧美日韩在线一区二区三区| 蜜桃视频污在线观看| 国内精品免费**视频| 国产精品av免费在线观看| 日本天堂在线视频| 欧美日韩四区| 欧美猛男性生活免费| 亚洲综合久久av一区二区三区| 欧美男同视频网| 亚洲裸体xxxx| 日韩 中文字幕| 99这里只有精品视频| 日韩午夜电影av| 黄色片免费网址| 图片一区二区| 欧美日韩亚洲另类| 亚洲不卡视频在线| h1515四虎成人| 欧美日韩一区国产| 爱豆国产剧免费观看大全剧苏畅| 成人在线不卡| 欧美福利一区二区| 一级黄色在线播放| 亚洲精品a区| 亚洲国产古装精品网站| 性农村xxxxx小树林| www.成人网| 亚洲成色777777女色窝| 香蕉视频黄色在线观看| 亚州国产精品| 尤物精品国产第一福利三区| av在线播放中文字幕| 99精品小视频| 欧美国产亚洲精品久久久8v| 日本黄色片视频| 六月丁香综合| 国产日韩欧美视频| a天堂在线视频| 成人丝袜视频网| 欧美大陆一区二区| 91在线不卡| 亚洲日本在线a| 欧美 亚洲 视频| 2021天堂中文幕一二区在线观| 精品国产91久久久久久老师| 亚州精品一二三区| 久久久久九九精品影院| 日韩经典一区二区三区| 国产一区二区三区四区五区六区 | 日韩中文字幕一区二区三区| 国产精品丝袜高跟| 成 人 黄 色 片 在线播放| www.久久久久久久久| 日本一区视频在线| 大片免费在线看视频| 香蕉加勒比综合久久| 在线免费av播放| 日韩精品一级| 国产亚洲精品久久久久久牛牛 | 在线观看一区二区三区视频| 欧美大片网址| y97精品国产97久久久久久| 久久久久久av无码免费网站| 日韩中文字幕1| 翡翠波斯猫1977年美国| 国产裸舞福利在线视频合集| 一区二区三区在线不卡| 国产情侣av自拍| 91精品啪在线观看国产爱臀| 一区二区欧美久久| 国产精品福利小视频| 亚洲精品久久久久久久蜜桃臀| 亚洲免费福利| 日韩一区和二区| 欧美老熟妇乱大交xxxxx| 中文精品久久| 国产精品美女主播在线观看纯欲| 亚洲黄色一级大片| 亚洲国产精品ⅴa在线观看| www.69av| 91麻豆精品| 亚洲人成网站色ww在线| 久久久精品91| 国产一区视频网站| 日韩国产精品一区二区三区| 国模雨婷捆绑高清在线| 欧美片网站yy| 美女被到爽高潮视频| 狠狠88综合久久久久综合网| 国产欧美中文字幕| 黄网在线观看| 欧美日韩一二三四五区| 欧美日韩一区二区区别是什么| 成人网18免费网站| 日韩美女免费视频| 污视频软件在线观看| 一区二区三区在线观看动漫| xxww在线观看| 日韩中文欧美| 国产精品午夜一区二区欲梦| 免费一级毛片在线观看| 亚洲.国产.中文慕字在线| 毛毛毛毛毛毛毛片123| 99精品视频在线| 国产日韩精品入口| 国产高清免费在线播放| 一本大道久久a久久综合婷婷| 中国黄色片视频| 黄色在线成人| 国产精品久久国产三级国电话系列| 九色porny在线| 欧美另类z0zxhd电影| 在线观看天堂av| 免费在线观看视频一区| 一本久久a久久精品vr综合 | av成人午夜| 天使と恶魔の榨精在线播放| 日韩一区二区高清| 日本妇女毛茸茸| 成人一区二区在线观看| 男人添女荫道口喷水视频| 97人人澡人人爽91综合色| 欧美黄色小视频| 人妻一区二区三区四区| 亚洲一区二区欧美激情| 国产精品一级无码| 在线不卡欧美| 欧美精品二区三区四区免费看视频 | 一区二区三区在线电影| 亚洲最大的av网站| 四虎影院观看视频在线观看| 亚洲国产另类久久精品| 午夜婷婷在线观看| 国产三级精品在线| 亚洲第一成肉网| 狠狠色丁香久久综合频道| 国内精品国语自产拍在线观看| 天堂中文在线播放| 尤物yw午夜国产精品视频| 国产日韩欧美中文字幕| 亚洲成精国产精品女| 色无极影院亚洲| 久久99国产精品麻豆| 激情小视频网站| 久久成人高清| 91在线观看欧美日韩| 国产精品蜜臀| 在线播放国产一区二区三区| av老司机久久| 欧美视频在线看| 糖心vlog免费在线观看| 国产高清在线精品| 欧美大片在线播放| 禁断一区二区三区在线| 91久久夜色精品国产网站| 一区二区三区伦理| 亚洲加勒比久久88色综合 | 中文字幕一区二区三| 欧美日韩理论片| 欧美成熟视频| 久久精品丝袜高跟鞋| 欧美成人黄色| 欧美人与性动交a欧美精品| 桃花色综合影院| 欧美中文字幕不卡| 国产一级二级毛片| 久久亚洲精精品中文字幕早川悠里| 婷婷激情四射五月天| 中文无码久久精品| 日韩高清国产一区在线观看| 国产在线不卡一区二区三区| 97热在线精品视频在线观看| 成人高清免费观看mv| 亚洲国产成人精品电影| www.亚洲激情| 亚洲在线视频一区| 日本成人免费视频| 91在线精品一区二区三区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 一区二区三区毛片免费| 欧美一区二区三区电影在线观看| 亚洲精品18| 国产精品狼人色视频一区| 激情图片在线观看高清国产| 中文字幕亚洲欧美一区二区三区 | 一区二区三区在线观看www| 成人春色在线观看免费网站| 国产精品美女久久久免费| 小早川怜子影音先锋在线观看| www.欧美精品一二三区| 青梅竹马是消防员在线| 精品国产1区二区| a天堂在线观看视频| 亚洲国产日韩一级| 午夜国产福利视频| 久久久久久久久久久久久女国产乱| 国产亚洲色婷婷久久| 黄页视频在线91| 青青草av网站| 亚洲欧美日韩国产综合精品二区 | 国内精品久久国产| 精品久久久久久久久久岛国gif| 国产成人精品av在线| 中文字幕成在线观看| 欧美激情视频一区| 黄色在线观看网站| 中文字幕在线成人| 日漫免费在线观看网站| 精品精品国产高清a毛片牛牛| 成人小视频在线播放| 色狠狠桃花综合| 免费日韩一级片| 一区二区理论电影在线观看| 亚洲欧美日韩国产中文在线| 中文字幕高清视频| 成人免费毛片aaaaa**| 日本一二三四区视频| 久久99精品久久久久| 国产理论在线播放| 午夜影院日韩| 男人透女人免费视频| 午夜在线视频观看日韩17c| 东北少妇不带套对白| 亚洲欧美成人综合| 日韩欧美亚洲天堂| 欧美一级久久| 国产av无码专区亚洲精品| 日韩成人av影视| 一级片视频免费观看| 免费在线观看一区二区三区| 999这里有精品| 国产一区在线视频| 先锋资源在线视频| 国产+成+人+亚洲欧洲自线| av在线播放网址| 99热国产精品| 亚洲午夜久久久久久久久红桃| 久久久亚洲欧洲日产国码αv| 91精品小视频| 久久嫩草精品久久久精品| 在线国产视频一区| xnxx国产精品| 国产又黄又粗的视频| 欧美国产综合色视频| 美国黑人一级大黄| 中文字幕亚洲在| 欧美三级小视频| 亚洲成av人影院在线观看网| 国产嫩bbwbbw高潮| 欧美日韩亚洲国产综合| 国产特级aaaaaa大片| 日韩av在线免费观看一区| 男生女生差差差的视频在线观看| 国产亚洲欧美aaaa| 在线观看麻豆蜜桃| 久久久久久国产精品美女| 午夜裸体女人视频网站在线观看| 日韩av成人在线| 老司机亚洲精品一区二区| 国产66精品久久久久999小说| 香蕉久久夜色精品国产使用方法 | 日韩精品在线播放视频| 成人精品电影在线观看| 国精产品一区二区三区| 亚洲精品国久久99热| 毛片毛片女人毛片毛片| 精品视频在线免费| 一级片一区二区三区| 日韩av一区在线| 美女隐私在线观看| 久久久久五月天| 亚洲国产天堂| 精品一区久久久久久| 色狮一区二区三区四区视频| 日日碰狠狠添天天爽超碰97| 九色|91porny| 亚洲熟女一区二区| 欧美国产精品v| 久久久午夜影院| 欧美日韩视频第一区| 免费观看成年人视频| www国产亚洲精品久久网站| 精精国产xxx在线视频app| 91精品国产综合久久久久久蜜臀| 久操国产精品| 成人高清dvd| 久久精品国产精品亚洲精品| www.色天使| 亚洲一二三四在线观看| 中文字幕久久网| 国产亚洲精品激情久久| 成年男女免费视频网站不卡| 91久久精品在线| 久久在线视频| 日韩中文字幕二区| 成人精品gif动图一区| 久一区二区三区| 欧美日韩电影在线| 男人的天堂av高清在线| 欧美人交a欧美精品| 91精品国产一区二区在线观看| 久久综合一区二区三区| 亚洲精品一区二区在线看| 中国黄色片免费看| 91麻豆精品视频| 亚欧洲精品在线视频| 欧美精品一区二区不卡| 色呦呦久久久| 91在线直播亚洲| 欧美激情亚洲| 午夜免费福利网站| 中文字幕一区二区三区色视频| 国产在成人精品线拍偷自揄拍| 国产亚洲激情视频在线| 黑人巨大精品欧美一区二区桃花岛| 久久久一本精品99久久精品| 一本色道久久精品| 五月天激情小说| 欧美性生活大片免费观看网址| 少妇精品高潮欲妇又嫩中文字幕| 久久香蕉国产线看观看av| 精品国产三级| 激情视频小说图片| 国产一区二区三区视频在线播放| 青青草手机在线视频| 日韩免费成人网| 欧美xxxx做受欧美88bbw| 国内精品二区| 亚洲欧美清纯在线制服| 久久国产精品无码一级毛片| 一本高清dvd不卡在线观看| 毛片网站在线观看| 国语自产精品视频在免费| 亚洲品质自拍| 国产又大又黄又粗的视频| 久久亚洲免费视频| 国产一区二区三区在线观看 | 国产一区二区久久久| 一本色道88久久加勒比精品| 国产麻豆天美果冻无码视频| 在线看日韩精品电影| 啊v视频在线| 国产美女精品免费电影| 综合久久一区| 特级特黄刘亦菲aaa级| 一级特黄大欧美久久久| 五月色婷婷综合| 国产精品第10页| 女生裸体视频一区二区三区| 午夜影院福利社| 午夜欧美视频在线观看| 成人精品一区二区三区免费 | 国产日韩一区二区在线| 久久精品视频在线免费观看| 一区二区视频在线免费观看| 欧美激情综合亚洲一二区 | 日韩av中文在线| 日韩国产网站| 免费在线看黄色片| 久久综合五月天婷婷伊人| 中文字幕在线观看1| 国内外成人免费激情在线视频网站| 在线视频亚洲专区|