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

不清楚React Hooks的類型聲明?來(lái)看就對(duì)了

開(kāi)發(fā) 前端
本文根據(jù)閱讀@types/react下hook?相關(guān)源碼入手,意在幫助大家熟悉常用hook以及類型聲明,在開(kāi)發(fā)時(shí)能得心應(yīng)手,明白hooks的約束條件,更深入理解hook的功能。

在了解react hooks的類型之前,有必要先了解一下@types、.d.ts文件的概念及作用。

node_modules中的@types是什么?

當(dāng)我們使用第三方npm包的時(shí)候,如果這個(gè)包不是ts編寫,則沒(méi)有導(dǎo)出類型,這時(shí)候如果在ts中導(dǎo)入會(huì)報(bào)錯(cuò)。比如jquery 這時(shí)會(huì)報(bào)錯(cuò)

無(wú)法找到模塊“jquery”的聲明文件嘗試使用 npm i --save-dev @types/jquery (如果存在),或者添加一個(gè)包含 declare module 'jquery'; 的新聲明(.d.ts

這里提示找不到j(luò)query的類型定義 可以安裝@types/jquery或者在d.ts中自定義類型,大多數(shù)情況我們應(yīng)該使用第一種辦法,如果這個(gè)庫(kù)沒(méi)有@types庫(kù)再使用第二種, 可以在https://microsoft.github.io/TypeSearch/中查找一個(gè)包是否存在types。

types查找規(guī)則

當(dāng)我們使用import xx from時(shí)ts將會(huì)默認(rèn)從./node_modules/@types中獲取類型聲明,具體查找規(guī)則是ts編譯器先在當(dāng)前編譯上下文找jquery的定義,找不到則再去./node_modules/@types中查找。 在本地模塊查找的類型聲明作用域是在模塊,在@types中的類型聲明是全局的。在tsconfig.json中也可以使用typeRoots設(shè)置默認(rèn)路徑 。

模塊types

當(dāng)然在`tsconfig.json`中也可以使用`types`單獨(dú)控制`@types`。`types`指定的包會(huì)被單獨(dú)引入。這樣全局引入就失效了。

*.d.ts是什么

@types下存放的文件都是.d.ts開(kāi)頭的文件 對(duì)應(yīng)的npm包js的類型聲明。 在.d.ts文件中聲明的類型或者模塊,在其他文件中不需要使用import導(dǎo)入,可以直接使用,d.ts的類型聲明可以自行編寫也可以使用工具聲明。有2個(gè)工具

可以使用微軟的dts-gen,生成單個(gè)文件的聲明dtsmake。值得注意的是如果你使用JSDOC語(yǔ)法 在ts3.7以后是可以通過(guò)命令為js生成.ds文件。具體用法可查看官方文檔。

介紹完前菜,現(xiàn)在開(kāi)始進(jìn)入本文正題。 一起來(lái)看下react hooks相關(guān)的類型聲明吧。在@types/react/index.d.ts文件中。

useContext

`useContext和createContext`是結(jié)合一起使用的

useContext定義: function useContext<T>(context:Context<T>):TcreateContext定義: function createContext<T>(defaultValue:T,):Context<T>createContext的返回Context類型的值提供給useContext的參數(shù)。這里泛型T在2個(gè)方法中是一致的,如果不指定 ts會(huì)類型推導(dǎo)出正確的類型。而Context 類型 則是一個(gè)interface

interface Context<T> {
  Provider: Provider<T>;
  Consumer: Consumer<T>;
  displayName?: string | undefined;
}
`Provider` 擁有`value`和`children` `Consumer`擁有 `children` 類型都是`ReactNode|undefined`。想想我們這react中使用`Context`傳值 是不是感覺(jué)很熟悉?看懂類型定義 再也不怕忘記api了。

useState

定義:function useState<S>(initialState:S| (() =>S)): [S, Dispatch<SetStateAction<S>>]泛型S表示state 是用來(lái)約束initialState類型,也可以傳入返回值是S的方法。useState返回值為2個(gè)元素的元組類型,返回state和更新state的方法。默認(rèn)情況下useState會(huì)根據(jù)傳入類型自動(dòng)推導(dǎo)出S類型。SetStateAction<S>定義了傳入setState的參數(shù)類型。是S類型或者返回S類型值的函數(shù)的聯(lián)合類型。SetStateAction 的定義為: type SetStateAction<S> = S|((prevState:S) =>S),prevState為上一次的state,聯(lián)合類型暫可以理解成或的關(guān)系。而 Dispatch 表示setState的類型,是一個(gè)沒(méi)有返回值的方法。定義也很簡(jiǎn)單Dispatch :type Dispatch<A> = (value:A) =>void。 還有useState參數(shù)個(gè)數(shù)為0的情況。上面的類型無(wú)法滿足,所以后面?zhèn)€函數(shù)重載約束沒(méi)有傳入初始值的實(shí)現(xiàn)。function useState<S=undefined>(): [S|undefined, Dispatch<SetStateAction<S|undefined>>];

useRef

定義比較簡(jiǎn)單:function useRef<T>(initialValue:T):MutableRefObject<T>, useRef 返回一個(gè)可變 ref 對(duì)象,其 .current 屬性初始化為傳遞的參數(shù)。MutableRefObject就是一個(gè)包含current:T的接口。值得注意的是 這里同樣用了函數(shù)重載,包括了initialValue沒(méi)有傳或者為null的情況。ref在props中大部分的初始值都為null。 類型聲明中注釋明確指定了如果要使用可變的useRef 則需要在范型參數(shù)中包含| null.

* Usage note: if you need the result of useRef to be directly mutable, include `| null` in the type
     * of the generic argument.

如果我們這樣寫,此時(shí)ref為RefObject類型 RefObject的current被readonly修飾。所以是不可變的。當(dāng)在范型中指定了| null 則根據(jù)函數(shù)重載命中第一種類型,返回MutableRefObject是可變的。

const ref = useRef<number>(null)
ref.current = 2 // 無(wú)法分配到 "current" ,因?yàn)樗侵蛔x屬性。
// 此時(shí)命中的這個(gè)重載的useRef
function useRef<T>(initialValue: T|null): RefObject<T>;

useEffect

定義: function useEffect(effect:EffectCallback, deps?:DependencyList):void, EffectCallback是一個(gè)只能返回void|Destructor的函數(shù)類型 用來(lái)處理副作用 。 void表示沒(méi)有返回值 ,但這里并不意味著你賦值一個(gè)有返回值的函數(shù)會(huì)報(bào)錯(cuò),在一個(gè)返回值為void的函數(shù)你明確返回類型 并不會(huì)報(bào)錯(cuò)。而void真正表示無(wú)論你返回什么?編譯器都不會(huì)使用檢查它。 Destructor 表示析構(gòu)函數(shù),看下它的定義

declare const UNDEFINED_VOID_ONLY: unique symbol;
type Destructor = () => void | { [UNDEFINED_VOID_ONLY]: never }

這里UNDEFINED_VOID_ONLY表示一個(gè)常量類型 unique symbol是symbol的子類型 , 使用unique symbol的變量必須為const,而值為never表示的是那些永不存在的值的類型。 never 類型是那些總是會(huì)拋出異常或根本就不會(huì)有返回值的函數(shù)表達(dá)式或箭頭函數(shù)表達(dá)式的返回值類型。這里使用void和{ [UNDEFINED_VOID_ONLY]: never }作為聯(lián)合類型, 明確約束了effect是不能有返回類型的, 如果明確聲明 則會(huì)報(bào)錯(cuò)。 如果有async修飾函數(shù)默認(rèn)返回promise類型, 所以在useEffect中的effect也同樣不能使用async。deps是可選參數(shù),作為依賴是一個(gè)只讀數(shù)組。ReadonlyArray是一個(gè)真正的只讀數(shù)組類型,根據(jù)范型來(lái)約束數(shù)組元素類型。它沒(méi)有改變數(shù)組的方法push shift等。

useLayoutEffect

useLayoutEffect類型聲明與useEffect一致。但useLayoutEffect的callback會(huì)在DOM更新后同步觸發(fā) 在瀏覽器同步刷新之前執(zhí)行完成 可能會(huì)阻塞瀏覽器渲染。

useReducer

官方介紹useReducer 為 An alternative to useState.是useState的替代解決方案。一般我們都這樣使用。當(dāng)state結(jié)構(gòu)或邏輯比較復(fù)雜時(shí),用useReducer管理更方便容易。

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
  }
}
const [state, dispatch] = useReducer(reducer, {count: 0});
state.count
dispatch({type: 'decrement'})

在類型聲明文件中useReducer寫了5個(gè)重載函數(shù)類型。

type ReducerWithoutAction<S> = (prevState: S) => S;

type ReducerStateWithoutAction<R extends ReducerWithoutAction<any>> =
        R extends ReducerWithoutAction<infer S> ? S : never;

function useReducer<R extends ReducerWithoutAction<any>, I>(
        reducer: R,
        initializerArg: I,
        initializer: (arg: I) => ReducerStateWithoutAction<R>
    ): [ReducerStateWithoutAction<R>, DispatchWithoutAction];
  • 第一種是reducer函數(shù)沒(méi)有傳action的情況。R表示reducer函數(shù)類型, 其中參數(shù)state類型和返回類型必須一致。initializerArg表示初始參數(shù),類型為泛型的第二個(gè)參數(shù)。initializer定義稍微復(fù)雜,但是其實(shí)約束了此類型必須是一個(gè)參數(shù)為initializerArg類型 返回值也同initializerArg類型一致的參數(shù)類型。而這個(gè)initializerArg就是reducer的參數(shù)state類型。ReducerStateWithoutAction就是為了約束這三個(gè)參數(shù)的類型。舉個(gè)例子更清晰. 下述代碼reducer中state initializerArg 已經(jīng) initializer的參數(shù)和返回參數(shù)類型都應(yīng)該保持一致。
type stateType = {num: number}
function reducer(state: stateType) {
  return state
}
const [state,dispatch]=useReducer<typeof reducer,stateType>(
  reducer, {num: 0},state=>{
    return {num: state.num+1}
  })

這里的extends 條件類型是一種條件表達(dá)式進(jìn)行類型的關(guān)系檢測(cè),類似于三元表達(dá)式。意思為左側(cè)類型可分配給右側(cè)類型則返回?后面的類型 否則返回:后的類型。 而infer關(guān)鍵字只能出現(xiàn)在條件類型extends 判斷為true的分支,表示一個(gè)待推斷的類型,infer S表示將推斷的類型保存在S中。

  • 第二個(gè)重載與第一個(gè)類似 只是在initializer為undefined的情況。如果在useReducer的泛型中指定了第二個(gè)參數(shù),則命中第一個(gè)重載 此時(shí)會(huì)報(bào)錯(cuò)。具體實(shí)現(xiàn)類似下述代碼。
function useReducer<R extends ReducerWithoutAction<any>>(
        reducer: R,
        initializerArg: ReducerStateWithoutAction<R>,
        initializer?: undefined
    ): [ReducerStateWithoutAction<R>, DispatchWithoutAction];

type stateType = {num: number}
function reducer(state: stateType) {
  return state
}
const [state,dispatch]=useReducer<typeof reducer>(
reducer, {num: 0})
  • 第三個(gè)重載約束了reducer函數(shù)傳入action的情況,不同于redux action是any類型。initializerArg初始參數(shù)為 state與泛型I的交叉類型。I可能是state的子集的情況。ReducerState同樣是為了取出reducer中state類型。initializer同上述第一種重載類似。要約束arg initializerArg 一致。而初始initializer的返回值要與reducer中state一致。
// Unlike redux, the actions _can_ be anything
type Reducer<S, A> = (prevState: S, action: A) => S;
// types used to try and prevent the compiler from reducing S
// to a supertype common with the second argument to useReducer()
type ReducerState<R extends Reducer<any, any>> = R extends Reducer<infer S, any> ? S : never;
function useReducer<R extends Reducer<any, any>, I>(
        reducer: R,
        initializerArg: I & ReducerState<R>,
        initializer: (arg: I & ReducerState<R>) => ReducerState<R>
    ): [ReducerState<R>, Dispatch<ReducerAction<R>>];

舉個(gè)例子 初始參數(shù)initializer的state類型 在初始函數(shù)的參數(shù)類型也應(yīng)該一致。

// 代碼實(shí)現(xiàn)
type stateType = {num: number}
type actionType = { type: string, payload: number}
function reducer(state: stateType,action: actionType) {
  if(action.type=='add'){
    return {num: state.num+1}
  }else {
    return {num: state.num-1}
  }
}
const [state,dispatch]=useReducer<typeof reducer,actionType>(
reducer, { type: 'add', payload: 1,num: 2},state=>{
  return {num:state.num+state.payload}
})
  • 第4個(gè)重載 和第三個(gè)類似 在初始參數(shù)不包括state的情況, 初始參數(shù)initializer的state類型 在初始函數(shù)的參數(shù)類型也應(yīng)該一致。
function useReducer<R extends Reducer<any, any>, I>(
        reducer: R,
        initializerArg: I,
        initializer: (arg: I) => ReducerState<R>
    ): [ReducerState<R>, Dispatch<ReducerAction<R>>];

第5個(gè)重載 和上述類似 約束了initializer為undefined,reducer存在actions的情況

function useReducer<R extends Reducer<any, any>>(
        reducer: R,
        initialState: ReducerState<R>,
        initializer?: undefined
    ): [ReducerState<R>, Dispatch<ReducerAction<R>>];

useReducer的返回值都是一致。返回reducerState和Dispatch,而type Dispatch<A> = (value:A) =>void;就是一個(gè)沒(méi)有返回值的函數(shù) 用來(lái)觸發(fā)action 改變r(jià)educerState。

useCallback

定義比較簡(jiǎn)單:function useCallback<T extends (...args:any[]) =>any>(callback:T, deps:DependencyList):T;范型T為function類型為第一個(gè)參數(shù)callback的類型,第二個(gè)參數(shù)DependencyList與useEffect的依賴數(shù)組一致,都是一個(gè)只讀的數(shù)組。主要作用是用來(lái)緩存callback實(shí)例,當(dāng)傳遞給子組件方法時(shí)與React.memo 或者shouldComponentUpdate一起使用。

useMemo

定義也比較簡(jiǎn)單:

// allow undefined, but don't make it optional as that is very likely a mistake
function useMemo<T>(factory: () => T, deps: DependencyList | undefined): T;

范型T為factory的返回值類型。deps依賴為DependencyList和undefined的聯(lián)合類型,這里會(huì)有提示允許deps為undefined,但不能是可選的 否則可能是個(gè)錯(cuò)誤。

useImperativeHandle

useImperativeHandle主要用來(lái)配合forwardRef自定義暴露給父組件數(shù)據(jù)的。一般用來(lái)父組件調(diào)用子組件方法或獲取子組件數(shù)據(jù)時(shí)使用。

function useImperativeHandle<T, R extends T>(ref: Ref<T>|undefined, init: () => R, deps?: DependencyList): void;
interface RefObject<T> {
        readonly current: T | null;
    }
    // Bivariance hack for consistent unsoundness with RefObject
type RefCallback<T> = { bivarianceHack(instance: T | null): void }["bivarianceHack"];
type Ref<T> = RefCallback<T> | RefObject<T> | null;

泛型T為ref的current的類型,R是第二個(gè)參數(shù)init方法的返回值,DependencyList同上述依賴數(shù)組一樣 不可變數(shù)組。可以這樣使用

const Child = React.forwardRef<{num: number}>((prop,ref)=>{
  useImperativeHandle<{num: number}, {num: number}>(ref,()=>({
    'num': 1
  }))
  return (<div>123</div>)
})

const Foo = ()=>{
  const childRef = useRef<{num: number}|null>(null)
  useLayoutEffect(() => {
    console.log(childRef.current?.num) // 1
  }, [])
  return <>
    <Child ref={childRef}/>
  </>
}

總結(jié)

本文根據(jù)閱讀@types/react下hook相關(guān)源碼入手,意在幫助大家熟悉常用hook以及類型聲明,在開(kāi)發(fā)時(shí)能得心應(yīng)手,明白hooks的約束條件,更深入理解hook的功能。

責(zé)任編輯:武曉燕 來(lái)源: 大轉(zhuǎn)轉(zhuǎn)FE
相關(guān)推薦

2019-08-14 10:17:14

Java數(shù)據(jù)結(jié)構(gòu)文章

2021-03-10 08:56:37

Zookeeper

2021-07-27 07:31:16

JavaArrayList數(shù)組

2022-05-15 21:52:04

typeTypeScriptinterface

2024-02-29 09:08:56

Encoding算法加密

2018-05-22 16:24:20

HashMapJavaJDK

2020-10-30 08:20:04

SD卡TF卡存儲(chǔ)

2018-12-17 12:30:05

Kubernetes存儲(chǔ)存儲(chǔ)卷

2020-09-10 16:10:17

js繼承模式前端

2020-03-03 17:35:09

Full GCMinor

2025-08-18 03:25:00

2013-12-12 16:59:39

諾基亞微軟

2023-02-27 15:46:19

數(shù)據(jù)元元數(shù)據(jù)

2021-11-09 06:01:35

前端JITAOT

2023-09-03 21:18:07

Python編程語(yǔ)言

2019-06-25 15:00:53

SpringNullJava

2025-05-12 08:40:00

前端監(jiān)控DOM

2025-08-14 08:21:17

PODAODTO

2021-02-08 23:47:51

文件存儲(chǔ)塊存儲(chǔ)對(duì)象存儲(chǔ)

2009-02-17 17:32:18

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本综合在线| 欧美成人免费看| av网址在线看| 国产麻豆视频一区二区| 美女啪啪无遮挡免费久久网站| 久久6免费视频| 在线不卡日本v二区707| 久久99国产精品久久| 久久国产精品久久久| 色噜噜狠狠永久免费| 日本视频在线观看| 国产a精品视频| 668精品在线视频| 中文字幕第24页| 高清不卡一区| 欧美日韩精品国产| 欧美在线一区二区三区四区| 一本色道久久综合精品婷婷| 激情六月综合| 亚洲人成电影在线| 日本wwwxx| 免费高潮视频95在线观看网站| 国产亚洲精品超碰| 91青青草免费在线看| 毛片在线免费视频| 91九色精品| 亚洲成人网av| 亚洲精品成人在线播放| 韩日毛片在线观看| 亚洲视频综合在线| 欧美婷婷久久| 亚洲网站免费观看| 99热精品在线| 久久成年人免费电影| 久久久久久久人妻无码中文字幕爆| 精品3atv在线视频| 一区二区三区四区不卡视频| 欧美日韩中文国产一区发布| 国产成人精品一区二区无码呦| 在线亚洲观看| 欧美富婆性猛交| 国产又黄又粗又猛又爽的| 北条麻妃一区二区三区在线| 欧美日韩国产一区二区三区地区| 日韩一级性生活片| 黄色网页网址在线免费| 久久九九久精品国产免费直播| 91亚洲永久免费精品| 青娱乐在线免费视频| 在线视频亚洲| 欧美极品xxxx| 国产乱国产乱老熟300| 成人久久一区| 亚洲男人的天堂在线播放| 中文字幕无人区二| 国产999精品在线观看| 在线精品视频小说1| 免费无码不卡视频在线观看| h片在线免费观看| 成人欧美一区二区三区白人 | 日p在线观看| 成人黄色在线网站| 91青青草免费在线看| 91国内精品久久久| 日本欧美在线观看| 国产精品天天狠天天看| 欧美性猛交xxxx乱大交hd| 亚洲专区一区二区三区| 久久久综合av| 久久精品人妻一区二区三区| 亚洲色图国产| 欧美成人精品在线观看| a在线视频播放观看免费观看| 99久久www免费| 日韩中文字幕视频在线| 强制高潮抽搐sm调教高h| 91精品亚洲| 色综合男人天堂| 日韩免费不卡视频| 久久久青草婷婷精品综合日韩| 国产精品高潮在线| 国产精品无码AV| 风间由美性色一区二区三区| 久久久免费看| 日本中文在线观看| 夜夜揉揉日日人人青青一国产精品| 欧美视频在线观看视频| 在线看欧美视频| 日韩一级片在线播放| 粗大的内捧猛烈进出视频| 风间由美性色一区二区三区四区| 日韩高清不卡av| 久久嫩草捆绑紧缚| 国产欧美午夜| 91精品一区二区| 天堂资源最新在线| 1区2区3区精品视频| 少妇人妻无码专区视频| 欧美日一区二区三区| 日韩女优毛片在线| 国产伦精品一区二区三区视频女| 欧美hd在线| 2019国产精品自在线拍国产不卡| 在线观看国产黄| 99国产精品久久久| 国产又黄又爽免费视频| 欧美粗大gay| 精品欧美一区二区三区精品久久 | 国产精品xxx在线观看| 亚洲欧美日韩精品久久亚洲区 | 天堂网av2018| 国产亚洲在线| 99久久99久久| 日本在线免费网| 日本韩国一区二区| 乱码一区二区三区| 欧美hd在线| 国产精品高潮在线| 男人天堂网在线观看| 亚洲一区免费在线观看| 黄大色黄女片18第一次| 亚洲人和日本人hd| 午夜精品在线视频| 亚洲第一成人av| 国产精品国产馆在线真实露脸 | 欧美黄页免费| 亚洲欧美日韩第一区| 国产一级大片在线观看| 久久精品国产精品亚洲红杏| 欧美日韩精品一区| 欧美亚洲日本精品| 亚洲国产成人精品久久| 久久国产精品二区| 韩国av一区二区三区四区| 亚洲精品无人区| 国产精品亚洲d| 亚洲欧洲一区二区三区久久| 九一国产在线观看| 成人黄色在线看| 国产欧美精品aaaaaa片| 日本精品视频| 欧美成人午夜免费视在线看片| 亚洲一级av毛片| 国产精品色哟哟| 成年网站在线播放| 久久在线电影| 91久久国产精品91久久性色| 九色国产在线观看| 无码av免费一区二区三区试看| 26uuu国产| 一区三区视频| 精品久久sese| 天堂在线中文网官网| 日韩极品精品视频免费观看| 天天干天天干天天| 久久久亚洲午夜电影| 999香蕉视频| 狠狠色狠狠色综合婷婷tag| 欧美一级片久久久久久久| 日韩二区三区| 欧美在线一二三四区| 欧美成人另类视频| 久久国产欧美日韩精品| 精品国产无码在线| 亚洲精品一二三**| 国内精品模特av私拍在线观看| 日本高清视频网站| 欧美视频在线免费看| 日韩丰满少妇无码内射| 麻豆91在线观看| 免费观看国产视频在线| 999久久久精品一区二区| 91高潮精品免费porn| 国产区在线视频| 91精品久久久久久久99蜜桃| 久久久精品99| 久久亚洲精品国产精品紫薇| 久久久国产欧美| 亚洲精品a级片| 精品国产乱码久久久久软件| 国模套图日韩精品一区二区| 久久精品欧美视频| 深爱激情五月婷婷| 欧美色区777第一页| 国产一二三区精品| 99精品视频一区二区| youjizzxxxx18| 欧美1区免费| 日本一区高清不卡| 亚洲精品一区二区在线播放∴| 欧美高清视频在线播放| 国产女主播在线写真| 欧美一级欧美三级在线观看| 五月婷婷开心网| 亚洲人吸女人奶水| 黑人巨大精品欧美| 国产精品自拍一区| 国产白丝袜美女久久久久| 欧美大人香蕉在线| 久久国产精品-国产精品| 日韩一级特黄| 欧美亚洲第一页| 伊人精品影院| 亚洲最新视频在线| 日本激情视频网站| 在线不卡的av| 丁香社区五月天| 亚洲午夜精品久久久久久久久| 极品蜜桃臀肥臀-x88av| 成年人网站91| 91精品999| 日韩在线a电影| 无码人妻精品一区二区蜜桃网站| 经典一区二区| 久久99影院| 亚洲啊v在线免费视频| 国产精品日韩在线播放| 美女扒开腿让男人桶爽久久软| 久久久精品亚洲| 最新av网站在线观看| 亚洲精品一区久久久久久| www视频在线| 欧美精品在线观看播放| 久久久久亚洲视频| 黑人巨大精品欧美一区二区免费| 欧美黄色免费在线观看| 国产精品电影一区二区| 欧美黄色高清视频| 久久久三级国产网站| 中文视频在线观看| 国产999精品久久| 五月六月丁香婷婷| 久久精品99久久久| 日本人69视频| 麻豆精品久久久| 日本久久久久久久久久久久| 日韩制服丝袜av| 午夜欧美福利视频| 久热精品视频| 久久久精品麻豆| 日韩av电影天堂| 亚洲xxxx2d动漫1| 日韩中文字幕亚洲一区二区va在线| 97国产在线播放| 国产欧美高清| 国产福利视频在线播放| 久久精品免费| 人妻丰满熟妇av无码区app| 久久久久免费| 午夜免费高清视频| 麻豆国产欧美一区二区三区| 日本高清久久久| 极品少妇xxxx精品少妇| theporn国产精品| 国产成人精品影视| 亚洲一区二区三区四区av| 成人免费视频视频在线观看免费 | 国产精品欧美大片| 精品国产福利| 国产成人调教视频在线观看 | 国产精品久久久亚洲一区| 少妇av一区二区三区无码| 亚洲一区国产一区| 欧美伦理片在线看| 久久黄色级2电影| 久久人人爽人人片| 成人h动漫精品一区二区| 欧美做受喷浆在线观看| 久久精品亚洲国产奇米99| 亚洲高潮女人毛茸茸| 日韩理论片一区二区| 欧美成欧美va| 日韩欧美中文字幕在线观看 | 精品国产一二三| 每日更新在线观看av| 色噜噜狠狠色综合网图区| av毛片在线免费看| 91高清视频在线免费观看| 色天使综合视频| 99视频国产精品免费观看| 日韩电影不卡一区| 亚洲欧美影院| 亚洲黄色毛片| 午夜精品在线免费观看| 国产999精品久久| 日本理论中文字幕| 一区二区三区国产豹纹内裤在线| 免费观看一区二区三区毛片| 欧美日韩国产乱码电影| 亚洲男人第一天堂| 国产一区二区三区久久精品 | 特黄特黄一级片| 26uuu亚洲| 国产探花在线免费观看| 欧美视频二区36p| 国产高清免费观看| 亚洲欧美日韩另类| 男女视频在线| 国产精品午夜视频| 日本中文字幕在线一区| 一区中文字幕在线观看| 在线亚洲激情| 中文字幕第六页| 国产精品免费aⅴ片在线观看| 精品在线视频免费| 欧美精品久久天天躁| 视频二区在线| 欧美疯狂性受xxxxx另类| 欧美天堂一区| 欧美中日韩免费视频| 亚洲黄色精品| 亚洲av无一区二区三区久久| 中文字幕电影一区| 中文字幕超碰在线| 日韩精品中午字幕| 欧美被日视频| 国产精品久久久久福利| 欧美一性一交| 欧美一级欧美一级| 国产一区二三区| 欧美精品日韩在线| 91精品1区2区| 欧美69xxxxx| 91福利视频在线观看| 国产ts一区| 国产美女在线一区| 国产精品99久久久久久久vr| 91麻豆精品久久毛片一级| 色婷婷综合在线| 水莓100在线视频| 韩国v欧美v日本v亚洲| 青草伊人久久| 99亚洲国产精品| 狠狠色综合日日| 国产黄色小视频网站| 欧美日产国产精品| av电影在线播放高清免费观看| 国产a∨精品一区二区三区不卡| 日韩动漫一区| av免费中文字幕| 99国产精品久久久久久久久久 | 欧美日本在线播放| 在线日本视频| 国产美女被下药99| 久久网站免费观看| 97人人爽人人| 亚洲天堂免费在线观看视频| 国产乱子伦精品无码码专区| 久久精彩免费视频| 精品视频在线观看免费观看| 亚洲精品天堂成人片av在线播放| 国产一区二区在线电影| 午夜精品一区二区三区视频| 欧美一区二区三区四区五区| 午夜av在线播放| 国产不卡一区二区在线观看| 亚洲国产精品一区制服丝袜| 欧美xxxx×黑人性爽| 五月婷婷综合激情| 日本在线视频1区| 国产精品高清在线| 欧美激情777| 性高潮久久久久久| 精品久久久久久中文字幕一区奶水 | 免费视频一区| 在线观看国产精品一区| 欧美日韩一区视频| 国产视频一区二区| 国产精品露出视频| 久久午夜av| 欧美视频一区二区在线| 日韩美女一区二区三区| 男人av在线播放| 色女人综合av| 国产高清久久久久| √资源天堂中文在线| 最近2019中文字幕在线高清| 国产精品亚洲综合在线观看| 黄色一级在线视频| 国产精品人成在线观看免费| 国产aⅴ爽av久久久久成人| 国内精品视频在线| 成人直播大秀| 国产午夜在线一区二区三区| 色婷婷综合视频在线观看| 乱人伦中文视频在线| 国产精品久久亚洲7777| 青草av.久久免费一区| 久操免费在线视频| 怡红院精品视频| 91蝌蚪精品视频| 福利在线一区二区三区| 亚洲一区二区欧美日韩| caoporn国产精品免费视频| caoporen国产精品| 日本不卡免费在线视频| 精品无码久久久久| 色妞久久福利网| 亚洲+变态+欧美+另类+精品| 亚洲精品在线网址|