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

午夜精品久久久久久毛片| 精品女同一区二区三区| 精品久久久久中文字幕小说| 欧美撒尿777hd撒尿| 一区二区三区的久久的视频| 日韩av加勒比| 成人在线影视| 快she精品国产999| 日韩视频123| 热99这里只有精品| 免费网站看v片在线a| 成人精品高清在线| 欧美巨乳美女视频| 一区二区三区免费在线观看视频 | 精品国产乱码久久久久久影片| 成人免费观看在线| 97最新国自产拍视频在线完整在线看| 亚洲日产国产精品| 中文字幕国产亚洲| 亚洲 中文字幕 日韩 无码| 在线观看免费黄色| 99精品视频在线免费观看| 国产日韩在线看片| 岛国av中文字幕| 黄色亚洲精品| 精品国内自产拍在线观看| 国产精品第七页| av在线精品| 欧美综合亚洲图片综合区| www插插插无码视频网站| 日本在线观看视频| 久久久久久久网| 国产女人精品视频| 在线观看日本网站| 亚洲精选成人| 欧美成人午夜免费视在线看片| 一区二区精品免费| 国产精品毛片视频| 亚洲国产欧美一区二区三区丁香婷 | 国产精品成人无码免费| 久久草在线视频| 日韩欧美在线影院| 在线不卡一区二区三区| 精品成人免费一区二区在线播放| 五月开心婷婷久久| 999一区二区三区| 天堂8中文在线| 亚洲日本乱码在线观看| 成人av电影免费| 国产又色又爽又黄又免费| 免费观看日韩av| 国产精品ⅴa在线观看h| 国产免费a视频| 久热精品在线| 日本免费一区二区三区视频观看| 制服丝袜亚洲播放| 亚洲二区在线观看| av日韩免费电影| 97人妻一区二区精品免费视频| 久久久精品午夜少妇| 97精品视频在线| 欧美成人综合色| 手机在线免费看av| 人妻丰满熟妇aⅴ无码| 福利片在线观看| 久久精品在线免费观看| 牛人盗摄一区二区三区视频| 天堂中文在线视频| 黄色日韩精品| 欧美激情在线一区| 久久久97精品| 日韩在线视频免费观看| 国产福利精品一区二区三区| 麻豆久久久久| 8v天堂国产在线一区二区| 午夜福利123| 日韩欧美中文字幕一区二区三区 | 91在线观看免费观看| 国产91成人在在线播放| 精品人妻一区二区三区蜜桃视频| 国产成人手机高清在线观看网站| 一夜七次郎国产精品亚洲| 东京热无码av男人的天堂| 天天射天天综合网| 欧美激情视频在线观看| 日韩欧美中文字幕一区二区| 鲁大师影院一区二区三区| 国产伦精品一区二区三区精品视频| 97超碰资源站| 99视频有精品| 一区精品视频| 2018av在线| www.成人在线| 热舞福利精品大尺度视频| 日本在线播放| 黄网站色欧美视频| xxx国产在线观看| 亚洲天堂av资源在线观看| 国产视频综合在线| 午夜爽爽爽男女免费观看| 免费国产在线观看| 99精品美女| 欧美另类极品videosbestfree| 国产真实乱人偷精品视频| 久久久久在线| 91九色对白| 国产理论电影在线观看| 亚洲制服丝袜av| 簧片在线免费看| 大陆精大陆国产国语精品| 国产一区二区三区在线观看视频| 久久久久久久久久久网| 秋霞成人午夜伦在线观看| 国产精品久久久久久久久婷婷| 川上优的av在线一区二区| 亚洲综合色成人| 久久撸在线视频| 成人av地址| 日韩精品一区二区三区在线播放 | 精品99久久久久久| 国产免费嫩草影院| 久久激情网站| 国产不卡一区二区三区在线观看 | 亚洲国产欧美自拍| 天天看片中文字幕| 欧美 日韩 国产 一区| 欧美最猛性xxxxx(亚洲精品)| 国产三级三级在线观看| 中文字幕av一区二区三区| 欧美日韩一道本| xxxxx性欧美特大| 精品国产乱码久久久久久图片| 精品人体无码一区二区三区| 亚洲欧美久久久| 国产偷国产偷亚洲高清97cao| av免费网站在线观看| 欧美日韩大陆在线| 91禁男男在线观看| 日本vs亚洲vs韩国一区三区二区| 欧美精品七区| 亚洲一区站长工具| 亚洲精品视频免费在线观看| 日本一级黄色录像| 成人午夜又粗又硬又大| 国产高清不卡无码视频| 国产精品色婷婷在线观看| 日韩性xxxx爱| 99免费在线视频| 成人免费看黄yyy456| 女人床在线观看| 欧美aa一级| 欧美性高清videossexo| 中文字幕免费看| 亚欧美中日韩视频| 欧美亚洲另类在线一区二区三区| 91探花在线观看| 精品久久久久久亚洲综合网| 日本系列第一页| 91丨九色丨蝌蚪丨老版| 久久婷婷国产综合国色天香| 日韩一区二区精品在线观看| 亚洲自拍偷拍图| 丝袜亚洲另类欧美| 日韩欧美精品一区二区三区经典 | 日本视频免费在线| kk眼镜猥琐国模调教系列一区二区| 大伊香蕉精品视频在线| 欧美国产不卡| 国产精品91视频| 黄网址在线观看| 精品成人佐山爱一区二区| 日韩欧美性视频| 国产欧美日韩综合精品一区二区 | 日本韩国欧美中文字幕| 日韩福利一区| 九九久久成人| xxx一区二区| 国内精品久久久久久久久久 | 久久精品女人毛片国产| 99精品视频在线免费观看| 青青青国产在线视频| 91视频综合| 国产日韩二区| 国产又爽又黄ai换脸| 欧美性天天影院| av午夜在线观看| 日韩电影网在线| 裸体武打性艳史| 国产成人精品aa毛片| 欧美一区二区三区爽大粗免费| 久久av导航| 91老司机精品视频| 91九色国产ts另类人妖| 国产馆在线观看| 激情综合色播激情啊| 99在线看视频| 三妻四妾的电影电视剧在线观看 | 久久久国产一区二区| 好吊视频一区二区三区| 国产精品素人视频| 国产裸体视频网站| 久久先锋影音| 国产美女永久无遮挡| 成人一区而且| 黄色91av| 欧美三级一区| 国产精品美女呻吟| heyzo高清国产精品| 色av吧综合网| 天堂91在线| 日韩欧美一卡二卡| 亚洲性生活大片| 精品成人av一区| 欧美成欧美va| 国产精品久久免费看| 91精品小视频| 国产99久久久精品| 99re精彩视频| 久久天堂成人| 日本福利视频在线| 国产精品v欧美精品v日本精品动漫| 偷拍视频一区二区| 伊人久久大香线蕉av不卡| 粉嫩高清一区二区三区精品视频| 成人噜噜噜噜| 国产日韩av在线| 久久香蕉av| 亚洲日本三级| 高清欧美性猛交xxxx| 免费网站成人| 伊是香蕉大人久久| 手机福利在线| 亚洲成人av在线| 午夜久久久久久噜噜噜噜| 91精品黄色片免费大全| 中文字幕a级片| 日本久久电影网| 日韩中文字幕在线观看视频| 欧美日韩国产一区二区三区| 妺妺窝人体色www在线下载| 国产一区二区在线免费观看| 免费的av在线| 亚洲成av人片一区二区密柚| 一区二区视频在线观看| 欧美xxxxx视频| 亚洲一区二区在线看| 日韩欧美中字| 中文字幕日韩精品久久| 国产精品97| 二级片在线观看| 女人天堂亚洲aⅴ在线观看| 欧美一级特黄aaaaaa在线看片| 婷婷综合网站| 亚洲激情免费视频| 激情综合久久| 国产成人无码精品久久久性色| 国产情侣一区| 成人黄色一区二区| 麻豆一区二区三区| 涩多多在线观看| 国产二区国产一区在线观看| 激情五月开心婷婷| 老鸭窝毛片一区二区三区 | 丝袜在线观看| 久久久在线视频| 唐人社导航福利精品| 国产精品视频免费观看www| 亚洲最大的免费视频网站| 亚洲自拍偷拍色片视频| 国产精品白丝av嫩草影院| 久久综合色一本| 四虎成人av| av日韩在线看| 免费日韩av| 性生活免费在线观看| 国产精品一二三在| 五十路六十路七十路熟婆| 国产亚洲综合色| 丁香花五月激情| 婷婷开心久久网| 亚洲一区中文字幕永久在线| 91精品国产综合久久福利| 欧美自拍偷拍第一页| 亚洲乱码一区av黑人高潮| av电影在线观看一区二区三区| 欧美成人一区二区三区电影| 日韩脚交footjobhd| 国产精品入口免费视| 91亚洲无吗| 日韩国产欧美精品| 欧美私人啪啪vps| 人人爽人人av| 高清成人在线观看| 男人天堂av电影| 亚洲卡通动漫在线| 伊人久久久久久久久久久久 | 最新版天堂资源在线| 国产女主播一区| 国产精品第一页在线观看| 欧美亚洲禁片免费| 人妻少妇精品无码专区久久| 中文日韩在线观看| 蜜桃视频在线网站| 亚洲字幕在线观看| 欧美日韩一区二区三区视频播放| 成人免费在线视频播放| 日本人妖一区二区| 亚洲精品国产成人av在线| 国产精品久久久一区麻豆最新章节| 国产精品成人aaaa在线| 精品污污网站免费看| 四虎精品成人影院观看地址| 欧美另类交人妖| 亚洲爱爱视频| 久久青青草综合| 极品少妇一区二区三区| 99精品视频国产| 中文字幕一区二区在线观看| 免费视频网站在线观看入口| 欧美精品一区视频| 天堂va在线| 亚洲xxxx18| 久久久久久久久久久9不雅视频| 日本在线观看a| 不卡欧美aaaaa| 成人免费看片98| 日韩一卡二卡三卡| 国产区在线看| 国产日韩在线观看av| 日韩精品一区二区久久| 日韩一级片播放| 久久久久久久久久久久久夜| 欧美亚韩一区二区三区| 精品成人私密视频| 国产在线拍揄自揄拍视频| 91久久久久久久久久| 午夜av一区| 亚洲图色中文字幕| 最新日韩在线视频| 久草视频手机在线观看| 777午夜精品免费视频| 亚洲精品传媒| 国产日韩欧美综合| 亚洲综合专区| 女王人厕视频2ⅴk| 亚洲一区免费在线观看| 日本一区二区免费电影| 日韩成人在线视频观看| 欧美少妇网站| 欧美一区免费视频| 日韩精品一卡二卡三卡四卡无卡| 四虎永久免费在线观看| 在线观看日韩毛片| 中文字幕在线观看日本| 成人网在线观看| 自拍欧美日韩| 中国xxxx性xxxx产国| 欧美日韩激情小视频| 国产视频二区在线观看| 国产日本欧美一区二区三区在线| 天天av综合| 国产成人av片| 欧美性猛交xxx| 国产高清一级毛片在线不卡| 国产日韩在线精品av| 国内综合精品午夜久久资源| 国产精品成人99一区无码| 欧美性猛交xxxx免费看漫画| 国产毛片在线看| 91日本在线观看| 在线欧美不卡| 欧美黄色高清视频| 91精品国产综合久久久久久漫画 | 快射av在线播放一区| 成人午夜在线观看| 亚洲国产日韩在线| 性欧美一区二区| 日韩午夜在线观看| 亚洲人成在线网站| 一区二区视频国产| 波多野结衣一区二区三区| 无码人妻av一区二区三区波多野 | 搜成人激情视频| 韩国黄色一级大片| 91免费看视频| 国产精品探花视频| 性色av一区二区咪爱| 色97色成人| 国产污在线观看| 欧美日韩综合色| a√中文在线观看| 亚洲亚洲精品三区日韩精品在线视频| 国产精品996| 色老头一区二区| 欧美极品少妇xxxxx| 精品视频免费在线观看| 天天躁日日躁狠狠躁免费麻豆| 在线观看av一区| tube8在线hd| 综合视频免费看|