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

Hooks時代,如何寫出高質量的react和vue組件?

開發 前端
在比較了兩個框架的異同后,我總結出了一套通用的hooks api的抽象方式,在這里分享給大家。如果您有不同意見歡迎在評論區指正。

vue和react都已經全面進入了hooks時代(在vue中也稱為組合式api,為了方便后面統一稱為hooks),然而受到以前react中類組件和vue2寫法的影響,很多開發者都不能及時轉換過來,以致于開發出一堆面條式代碼,整體的代碼質量反而不如改版以前了。

hooks組件到底應該如何寫,我也曾為此迷惘過一段時間。特別我以前以react開發居多,但在轉到新崗位后又變成了使用vue3開發,對于兩個框架在思維方式和寫法的不同上,很是花了一段時間適應。好在幾個月下來,我發現二者雖然在寫法上有區別之處,但思想上卻大同小異。

所以在比較了兩個框架的異同后,我總結出了一套通用的hooks api的抽象方式,在這里分享給大家。如果您有不同意見歡迎在評論區指正。

一、概述

一個組件內部的所有代碼——無論vue還是react——都可以抽象成以下幾個部分:

  1. 組件視圖,組件中用來描述視覺效果的部分,如css和html、react的jsx或者vue的template代碼
  2. 組件相關邏輯,如組件生命周期,按鈕交互,事件等
  3. 業務相關邏輯,如登錄注冊,獲取用戶信息,獲取商品列表等與組件無關的業務抽象

單獨拆分這三塊并不難,難的是一個組件可能寫得特別復雜,里面可能包含了多個視圖,每個視圖相互之間又有交互;同時又可能包含多個業務邏輯,多個業務的函數和變量雜亂無章地隨意放置,導致后續維護的時候要在代碼之間反復橫跳。

要寫出高質量的組件,可以思考以下幾個問題:

二、組件什么時候拆?怎么拆?

一個常見的誤區是,只有需要復用的時候才去拆分組件,這種看法顯然過于片面了。你可以思考一下,自己是如何抽象一個函數的,你只會在代碼需要復用的時候才抽出一個函數嗎?顯然不是。因為函數不僅有代碼復用的功能,還具有一定的描述性質以及代碼封閉性。這種特性使得我們看到一個函數的時候,不必關注代碼細節,就能大概知道這部分代碼是干啥的。

我們還可以再用函數將一部分函數組合起來,形成更高層級的抽象。按國內流行的說法,高層級的抽象被稱為粗粒度,低層級的抽象被稱為細粒度,不同粗細粒度的抽象可以稱它們為不同的抽象層級。并且一個理想的函數內部,一般只會包含同一抽象層級的代碼。

組件的拆分也可以遵循同樣的道理。我們可以按照當前的結構或者功能、業務,將組件拆分為功能清晰且單一、與外部耦合程度低的組件(即所謂高內聚,低耦合)。如果一個組件里面干了太多事,或者依賴的外部狀態太多,那么就不是一個容易維護的組件了。

components.png

然而,為了保持組件功能單一,我們是不是要將組件拆分得特別細才可以呢?事實并非如此。因為上面說過,抽象是有粗細粒度之分的,也許一個組件從較細的粒度來講功能并不單一,但是從較粗的粒度來說,可能他們的功能就是單一的了。例如登錄和注冊是兩個不同的功能,但是你從更高層級的抽象來看,它們都屬于用戶模塊的一部分。

所以是否要拆分組件,最關鍵還是得看復雜度。如果一個頁面特別簡單,那么不進行拆分也是可以,有時候拆分得過于細可能反而不利于維護。

如何判斷一個組件是否復雜?恐怕這里不能給出一個準確的答案,畢竟代碼的實現方式千奇百怪,很難有一個機械的標準評判。但是我們不妨站在第三方角度看看自己的代碼,如果你是一個工作一年的程序員,是否能比較容易地看懂這里的代碼?如果不能就要考慮進行拆分了。如果你非要一個機械的判斷標準,我建議是代碼控制在200行內。

總結一下,拆分組件的時候可以參考下面幾個原則:

  1.  拆分的組件要保持功能單一。即組件內部代碼的代碼都只跟這個功能相關;
  2.  組件要保持較低的耦合度,不要與組件外部產生過多的交互。如組件內部不要依賴過多的外部變量,父子組件的交互不要搞得太復雜等等。
  3.  用組件名準確描述這個組件的功能。就像函數那樣,可以讓人不用關心組件細節,就大概知道這個組件是干嘛的。如果起名比較困難,考慮下是不是這個組件的功能并不單一。

vue.webp

三、如何組織拆分出的組件文件?

拆分出來的組件應該放在哪里呢?一個常見的錯誤做法是一股腦放在一個名為components文件夾里,最后搞得這個文件夾特別臃腫。我的建議是相關聯的代碼最好盡量聚合在一起。

為了讓相關聯的代碼聚合到一起,我們可以把頁面搞成文件夾的形式,在文件夾內部存放與當前文件相關的組成部分,并將表示頁面的組件命名為index放在文件夾下。再在該文件夾下創建components目錄,將組成頁面的其他組件放在里面。

如果一個頁面的某個組成部分很復雜,內部還需要拆分成更細的多個組件,那么就把這個組成部分也做成文件夾,將拆分出的組件放在這個文件夾下。

最后就是組件復用的問題。如果一個組件被多個地方復用,就把它單獨提取出來,放到需要復用它的組件們共同的抽象層級上。 如下:

  1. 如果只是被頁面內的組件復用,就放到頁面文件夾下。
  2. 如果只是在當前業務場景下的不同頁面復用,就放到當前業務模塊的文件夾下。
  3. 如果可以在不同業務場景間通用,就放到最頂層的公共文件夾,或者考慮做成組件庫。

關于項目文件的組織方式已經超過本文討論的范疇,我打算放到以后專門出一篇文章說下如何組織項目文件。這里只說下頁面級別的文件如何進行組織。下面是我常用的一種頁面級別的文件的組織方式:

homePage // 存放當前頁面的文件夾
|-- components // 存放當前頁面組件的文件夾
|-- componentA // 存放當前頁面的組成部分A的文件夾
|-- index.(vue|tsx) // 組件A
|-- AChild1.(vue|tsx) // 組件a的組成部分1
|-- AChild2.(vue|tsx) // 組件a的組成部分2
|-- ACommon.(vue|tsx) // 只在componentA內部復用的組件
|-- ComponentB.(vue|tsx) // 當前頁面的組成部分B
|-- Common.(vue|tsx) // 組件A和組件B里復用的組件
|-- index.(vue|tsx) // 當前頁面
復制代碼

實際上這種組織方式,在抽象意義上并不完美,因為通用組件和頁面組成部分的組件并沒有區分開來。但是一般來說,一個頁面也不會抽出太多組件,為了方便放到一起也不會有太大問題。但是如果你的頁面實在復雜,那么再創建一個名為common的文件夾也未嘗不可。

coding.webp

四、如何用hooks抽離組件邏輯?

在hooks出現之前,曾流行過一個設計模式,這個模式將組件分為無狀態組件和有狀態組件(也稱為展示組件和容器組件),前者負責控制視覺,后者負責傳遞數據和處理邏輯。但有了hooks之后,我們完全可以將容器組件中的代碼放進hooks里面。后者不僅更容易維護,而且也更方便把業務邏輯與一般組件區分開來。

在抽離hooks的時候,我們不僅應該沿用一般函數的抽象思維,如功能單一,耦合度低等等,還應該注意組件中的邏輯可分為兩種:組件交互邏輯與業務邏輯。如何把文章開頭說的視圖、交互邏輯和業務邏輯區分開來,是衡量一個組件質量的重要標準。

以一個用戶模塊為例。一個包含查詢用戶信息,修改用戶信息,修改密碼等功能的hooks可以這樣寫:

// 用戶模塊hook
const useUser = () => {
// react版本的用戶狀態
const user = useState({});
// vue版本的用戶狀態
const userInfo = ref({});
// 獲取用戶狀態
const getUserInfo = () => {}
// 修改用戶狀態
const changeUserInfo = () => {};
// 檢查兩次輸入的密碼是否相同
const checkRepeatPass = (oldPass,newPass) => {}
// 修改密碼
const changePassword = () => {};
return {
userInfo,
getUserInfo,
changeUserInfo,
checkRepeatPass,
changePassword,
}
}
復制代碼

交互邏輯的hook可以這么寫(為了方便只寫vue版本的,大家應該也都看得懂):

// 用戶模塊交互邏輯hooks
const useUserControl = () => {
// 組合用戶hook
const { userInfo, getUserInfo, changeUserInfo, checkRepeatPass, changePassword } = useUser();
// 數據查詢loading狀態
const loading = ref(false);
// 錯誤提示彈窗的狀態
const errorModalState = reactive({
visible: false, // 彈窗顯示/隱藏
errorText: '', // 彈窗文案
});
// 初始化數據
const initData = () => {
getUserInfo();
}
// 修改密碼表單提交
const onChangePassword = ({ oldPass, newPass ) => {
// 判斷兩次密碼是否一致
if (checkRepeatPass(oldPass, newPass)) {
changePassword();
} else {
errorModalState.visible = true;
errorModalState.text = '兩次輸入的密碼不一致,請修改'
}
};
return {
// 用戶數據
userInfo,
// 初始化數據
initData: getUserInfo,
// 修改密碼
onChangePassword,
// 修改用戶信息
onChangeUserInfo: changeUserInfo,
}
}
復制代碼

然后只要在組件里面引入交互邏輯的hook即可:

vue版本:

<template>
<!-- 視圖部分省略,在對應btn處引用onChangePassword和onChangeUserInfo即可 -->
</template>
<script setup>
import useUserControl from './useUserControl';
import { onMounted } from 'vue';
const { userInfo, initData, onChangePassword, onChangeUserInfo } = useUserControl();
onMounted(initData);
<script>
復制代碼

react版本:

import useUserControl from './useUserControl';
import { useEffect } from 'react';
const UserModule = () => {
const { userInfo, initData, onChangePassword, onChangeUserInfo } = useUserControl();
useEffect(initData, []);
return (
// 視圖部分省略,在對應btn處引用onChangePassword和onChangeUserInfo即可
)
}
復制代碼

而拆分出的三個文件放在組件同級目錄下即可;如果拆出的hooks較多,可以單獨開辟一個hooks文件夾。如果有可以復用的hooks,參考組件拆分里面分享的方法,放到需要復用它的組件們共同的抽象層級上即可。

可以看到抽離出hooks邏輯后,組件變得十分簡單、容易理解,我們也實現了各個部分的分離。不過這里還有一個問題,那就是上面的業務場景實在太過簡單,有必要拆分得這么細,搞出三個文件這么復雜嗎?

針對邏輯并不復雜的組件,我個人覺得和組件放到一起也未嘗不可。為了簡便,我們可以只把業務邏輯封裝成hooks,而組件的交互邏輯就直接放在組件里面。如下:

<template>
<!-- 視圖部分省略,在對應btn處引用changePassword和changeUserInfo即可 -->
</template>
<script setup>
import { onMounted } from 'vue';
// 用戶模塊hook
const useUser = () => {
// 代碼省略
}
const { userInfo, getUserInfo, changeUserInfo, checkRepeatPass, changePassword } = useUser();
// 數據查詢loading狀態
const loading = ref(false);
// 錯誤提示彈窗的狀態
const errorModalState = reactive({
visible: false, // 彈窗顯示/隱藏
errorText: '', // 彈窗文案
});
// 初始化數據
const initData = () => { getUserInfo(); }
// 修改密碼表單提交
const onChangePassword = ({ oldPass, newPass ) => {};

onMounted(initData);
<script>
復制代碼

但是如果邏輯比較復雜,或者一個組件里面包含多個復雜業務或者復雜交互,需要抽離出多個hooks的情況,還是單獨抽出一個個文件比較好。總而言之,依據代碼復雜度,選擇相對更容易理解的寫法。

也許單獨一個組件,你并不能體會出hooks寫法的優越性。但當你封裝出更多的hooks之后,你會逐漸發現這樣寫的好處。正因為不同的業務和功能被封裝在一個個hooks里面,彼此互不干擾,業務才能更容易區分和理解。對于項目的可維護性和可讀性提升是非常之大的。

下圖展示了vue2寫法和vue3 hooks寫法的區別。圖中相同顏色的代碼塊代表這些代碼是屬于同一個功能的,但vue2的寫法導致本來是相同功能的代碼,卻被拆散到了不同地方(react其實也容易有相同的問題,例如當一個組件有多個功能時,不同功能的代碼也很容易混雜到一起)。而通過封裝成一個個hooks,相關聯的代碼就很容易被聚合到了一起,且和其他功能區分開了。

vue3.png

題外話:全局狀態的管理

現在的前端項目還有一個較為常見的誤區,那就是全局狀態管理庫(即redux、vuex等)的濫用。依據抽象層級的思維,實際上很多項目并不需要放較多的狀態到全局,這種情況利用react和vue自身的狀態管理就足夠了。

如果非要用狀態管理庫,也要警惕放較多狀態和函數到全局。一個狀態是否要放到全局,我一般有兩個判斷標準:

  1. 狀態是否在多個頁面間共享;
  2. 跳轉頁面后又返回該頁面,是否需要還原跳轉之前的狀態(僅對react而言,vue有keep-alive)

而全局狀態管理庫中的函數,則只放置與全局狀態有關的邏輯。除此之外的狀態,一律交由react和vue組件本身進行管理。

責任編輯:龐桂玉 來源: 三分鐘學前端
相關推薦

2022-10-24 08:10:21

SQL代碼業務

2021-03-17 09:48:48

高質量技術文章

2021-01-09 22:35:51

程序員編碼代碼

2021-12-08 07:49:46

Ahooks 3.0React Hooks

2016-11-25 13:50:15

React組件SFC

2017-09-01 14:18:50

前端React組件

2021-12-13 14:37:37

React組件前端

2021-12-07 08:16:34

React 前端 組件

2012-09-13 10:44:18

Python代碼

2011-03-04 10:11:09

JavascriptAPI

2017-07-14 09:54:47

代碼函數程序

2023-07-28 22:27:41

PromptGPT

2015-08-03 10:40:59

程序員代碼質量Quora

2024-03-07 11:39:24

HadolintDockerfile工具

2020-09-18 07:57:10

代碼編碼開發

2019-03-13 10:10:26

React組件前端

2023-10-15 12:07:09

2025-07-23 04:00:00

2021-08-08 14:26:24

SQL數據庫開發

2023-10-27 09:22:27

框架開發
點贊
收藏

51CTO技術棧公眾號

亚洲午夜久久久久久久久| 91亚洲精品一区二区乱码| 国产wwwwwww| 亚洲成人777777| 亚洲一级高清| 亚洲人成电影网站色| 天天插天天操天天射| yellow91字幕网在线| 成人国产精品免费观看| 国产成人精品久久亚洲高清不卡| 粉嫩精品久久99综合一区| 欧美经典影片视频网站| 欧美日韩国产精品一区二区不卡中文| 欧美一区二区视频17c| 国产精品自产拍| 国产精品美女久久久| 日韩三级影视基地| 精品黑人一区二区三区观看时间| 992tv国产精品成人影院| 羞羞答答一区二区| 日韩欧美999| 一区二区三区一级片| 性感美女一级片| 久久99日本精品| 国产91对白在线播放| 亚洲天堂黄色片| 岳的好大精品一区二区三区| 日韩女优电影在线观看| 亚洲不卡视频在线| 手机在线观看av| 亚洲女爱视频在线| 亚洲欧美国产不卡| 日韩porn| 成人黄色av电影| 91久久在线视频| 中文字幕欧美色图| 国产毛片一区| 午夜精品久久久久久99热| 中文字幕美女视频| 国产一卡不卡| 亚洲美女又黄又爽在线观看| 黄色激情在线观看| 色妞ww精品视频7777| 欧美精品精品一区| 国产精品自拍视频在线| 制服诱惑亚洲| 欧美综合欧美视频| 国产极品美女高潮无套久久久| 超级白嫩亚洲国产第一| 亚洲一区二区三区三| 中文字幕第50页| 日韩av中文| 国产目拍亚洲精品99久久精品| 免费影院在线观看一区| 亚洲AV第二区国产精品| 99热这里都是精品| 精品欧美国产| 色视频在线观看| www亚洲一区| 欧美激情国产日韩| 欧美色视频免费| 久久网站最新地址| 欧美一区亚洲二区| 国产视频精品久久| 日本一区二区成人| 一道精品一区二区三区| 午夜不卡视频| 亚洲精品精品亚洲| 毛片av在线播放| 国产在线xxx| 午夜激情一区二区| 国产午夜伦鲁鲁| 成人看片在线观看| 欧美日韩午夜在线视频| 尤物网站在线看| 日韩欧美激情电影| 日韩电影网在线| av网站免费在线看| 国产精品久久久乱弄| 成人97在线观看视频| 国产第一页在线播放| 亚洲美女少妇无套啪啪呻吟| 欧美一区二区大胆人体摄影专业网站| 色屁屁影院www国产高清麻豆| 天堂一区二区在线| 91久久久久久久久久| 黄色av网站免费在线观看| 成人毛片老司机大片| 蜜桃视频在线观看成人| 性开放的欧美大片| 亚洲午夜免费电影| 免费看a级黄色片| 欧美一级网址| 亚洲国产精品电影| 五月激情四射婷婷| 亚洲一本视频| 国产伦精品免费视频| 成人1区2区3区| 久久久久国色av免费看影院| 制服诱惑一区| 黄色软件视频在线观看| 欧美色综合久久| 乱码一区二区三区| 成人综合一区| 91国自产精品中文字幕亚洲| 亚洲综合视频在线播放| 99国产精品99久久久久久| 婷婷久久青草热一区二区| 18+激情视频在线| 色综合久久久久综合| 亚洲视频在线不卡| 精品freesex老太交| 欧美黄色片在线观看| 日韩黄色一级视频| 成人福利视频网站| 老司机av福利| 怡红院成人在线| 精品播放一区二区| 麻豆网址在线观看| 日日骚欧美日韩| 精品免费日产一区一区三区免费| 国产区在线看| 欧美午夜精品一区二区蜜桃| 99re久久精品国产| 国产精品v日韩精品v欧美精品网站| 欧美做受高潮1| 国产小视频一区| 亚洲欧美区自拍先锋| 亚洲天堂av线| 久久最新网址| 91av中文字幕| 亚洲精品97久久中文字幕无码 | 91黑丝高跟在线| 国产精品美女一区| 国产精品麻豆欧美日韩ww| av免费播放网址| 成人知道污网站| 欧美乱妇40p| 国产免费黄色录像| 中文字幕综合网| 99热一区二区| 天天做天天爱天天爽综合网| 国产精品人成电影| 1769视频在线播放免费观看| 91福利资源站| 久久美女免费视频| 青青草精品视频| 亚洲精品日韩在线观看| 美女网站视频一区| 在线视频中文亚洲| 亚洲国产无线乱码在线观看| 国产欧美一二三区| 午夜免费看视频| 天天av综合| 91亚洲精品久久久久久久久久久久| 精品自拍一区| 欧美精品一区二区三区久久久| 久草视频中文在线| eeuss影院一区二区三区| 9久久9毛片又大又硬又粗| 日韩a级大片| 日韩av电影国产| 日本视频在线观看| 欧美一区二区黄| 国产亚洲欧美精品久久久久久 | 欧美视频中文字幕| 欧日韩不卡视频| 国产一区二区三区免费| 男人的天堂avav| 久久精品66| 4438全国成人免费| 你懂的在线看| 欧美日韩精品免费观看视频| 日本黄区免费视频观看| 开心九九激情九九欧美日韩精美视频电影 | 成人国产精选| 国产午夜精品全部视频在线播放| 波多野结衣高清视频| 中文字幕av一区二区三区| 日日干夜夜操s8| 精品国产91| 91精品视频免费| 色婷婷在线播放| 亚洲第一区在线| 国产精品国产三级国产专区52| 久久一区二区视频| 高清av免费看| 一级毛片免费高清中文字幕久久网| 3d动漫精品啪啪一区二区三区免费| 欧美午夜大胆人体| 亚洲精品国产精品久久清纯直播| 日日噜噜噜噜人人爽亚洲精品| 国产欧美日韩综合精品一区二区| 91国内在线播放| 欧美另类亚洲| 高清国产在线一区| 欧美极品免费| 欧美精品在线观看91| 丰满肉肉bbwwbbww| 欧洲av在线精品| 老妇女50岁三级| 91丨porny丨最新| 色综合色综合色综合色综合| 在线播放精品| 欧美中文娱乐网| 人人爱人人干婷婷丁香亚洲| 国产91av在线| 欧美人与性动交α欧美精品济南到 | 国产一区二区视频免费| 亚洲欧美精品午睡沙发| 亚洲精品国产91| 国产成人免费高清| 国产真人无码作爱视频免费| 欧美在线网站| 另类欧美小说| 青草伊人久久| 国产精品嫩草影院久久久| 丁香花电影在线观看完整版| 亚洲人成网站色ww在线| 国产露脸无套对白在线播放| 日韩欧美999| 久久久精品国产sm调教| 亚洲国产精品黑人久久久| 在线观看av中文字幕| 精品一区二区成人精品| 久久无码高潮喷水| 欧美三级不卡| 日本在线视频www色| 综合伊思人在钱三区| 亚洲自拍av在线| 成人国产一区| 国产成人亚洲综合91| 变态调教一区二区三区| 日韩视频欧美视频| 久草在线免费福利资源| 精品亚洲男同gayvideo网站 | www免费在线观看| 中国人与牲禽动交精品| 香蕉视频成人在线| 日韩欧美第一区| 国产情侣自拍小视频| 欧美一区在线视频| 一区二区三区在线免费观看视频| 欧美色视频日本高清在线观看| 久久久久久久久久一区二区三区 | 久久久久久久久久综合| 日韩一区欧美小说| 亚洲色图 激情小说| 国产精品国产三级国产aⅴ中文 | 亚洲人成无码网站久久99热国产| 香蕉综合视频| 一个色的综合| 中文字幕一区二区av| 一区二区三区的久久的视频| 日韩情爱电影在线观看| 亚洲国产精品综合| 小处雏高清一区二区三区| 亚洲一二三区精品| 久久婷婷蜜乳一本欲蜜臀| 婷婷五月色综合| 日韩一级毛片| 中文字幕日韩精品久久| 91视频精品| 国产欧美综合一区| 欧美日本一区| 日韩人妻精品一区二区三区| 亚洲一级毛片| 日韩精品久久一区二区| 国产亚洲一级| 日本精品一区二区三区四区| 性欧美精品高清| 粉嫩虎白女毛片人体| 老司机精品视频一区二区三区| 亚洲欧美国产日韩综合| 精品午夜一区二区三区在线观看| 国产精品久久久毛片| 国产一区二区三区高清播放| 麻豆精品国产传媒| 不卡的av中国片| 中文字幕一区三区久久女搜查官| 久久先锋影音av| 欧美视频一区二区在线| 最新日韩av在线| 99免费在线观看| 欧美色视频日本高清在线观看| 天天爱天天做天天爽| 欧美日本国产视频| 日本韩国在线观看| 亚洲精品网站在线播放gif| 国产毛片在线看| 一区二区三区四区在线观看视频| 最新国产露脸在线观看| 国产69久久精品成人| 激情久久一区二区| 国产精品xxxx| 国产亚洲精品美女久久久久久久久久| 四虎永久国产精品| 欧美美女在线| 日本人妻伦在线中文字幕| 性8sex亚洲区入口| 欧美激情第一区| 久久精品视频一区二区| 麻豆网址在线观看| 岛国av一区二区| 中文字幕人妻一区二区三区视频| 亚洲高清久久网| av一区在线观看| 国内久久久精品| 国产精品一区二区三区av| 久久综合九色综合久99| 91精品1区| 青青艹视频在线| 国产一区欧美日韩| 亚洲第一成人网站| 一区二区三区中文字幕电影| 中文字幕91爱爱| 亚洲国产三级网| 黄色成年人视频在线观看| 日本人成精品视频在线| 成人性生交大片免费看96| 亚洲一区二区精品在线| 亚洲一区不卡| 永久免费未满蜜桃| 亚洲视频在线一区| 久久久久精彩视频| 日韩免费一区二区| 免费在线你懂的| 国产成人精品一区二区三区| 88久久精品| 激情六月天婷婷| 久久99久久精品| 成人免费无遮挡无码黄漫视频| 欧美性猛交xxxx久久久| 粉嫩小泬无遮挡久久久久久| 日韩最新中文字幕电影免费看| av影视在线看| 国产精品久久久久久久小唯西川 | 日韩免费一级片| 欧美三级中文字| 欧美18xxxxx| 欧美性在线视频| 色播一区二区| 乱熟女高潮一区二区在线| 国内精品免费在线观看| 精品一区二区在线观看视频| 欧美特级限制片免费在线观看| 欧美日韩免费做爰大片| 91高清视频在线免费观看| 9l视频自拍九色9l视频成人| 水蜜桃在线免费观看| 国产一区二区三区蝌蚪| 成人午夜免费影院| 91精品国产色综合久久不卡蜜臀| 91九色在线porn| 国产精品视频午夜| 亚洲第一偷拍| 在线播放免费视频| 亚洲天堂2014| 欧洲av在线播放| 91国产一区在线| 蜜臀av免费一区二区三区| 日本美女高潮视频| 亚洲国产高清在线| 亚洲一卡二卡在线| 欧美成人自拍视频| 午夜视频一区二区在线观看| 青青视频免费在线| 成人一级片在线观看| 欧美精品亚洲精品日韩精品| 精品国产乱码久久久久久久久| 国产高潮在线| 日本三级中国三级99人妇网站| 首页亚洲欧美制服丝腿| 亚洲图片综合网| 一本大道av一区二区在线播放| 国产区av在线| 国产精品久久久久久久电影| 93在线视频精品免费观看| www.久久久久久久久久久| 一区二区三区中文字幕精品精品 | 日韩福利二区| 国产一区在线不卡| 国产一卡二卡在线| 亚洲精品狠狠操| 丰满少妇一区| 天天想你在线观看完整版电影免费| 国产高清在线精品| 亚洲成熟少妇视频在线观看| 中文字幕亚洲情99在线| av成人免费看| 毛片在线播放视频| 国产三级一区二区| 一级片一区二区三区| 欧美疯狂xxxx大交乱88av| 欧美亚视频在线中文字幕免费| 999在线免费视频| 一区二区三区色| 日本在线一二三| 98国产高清一区| 日韩一区精品视频|