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

如何使用 React Query 做下拉數(shù)據(jù)自動(dòng)刷新?

開發(fā) 前端
本文我們講述了 React Query 中用于無限查詢 API useInfiniteQuery() 的使用。通過循序漸進(jìn)的 3 個(gè)案例,最終實(shí)現(xiàn)了一個(gè)下拉到底后自動(dòng)新數(shù)據(jù)的交互效果,還是比較好實(shí)現(xiàn)的。

useInfiniteQuery() API

看名字就能猜出來,useInfiniteQuery() 是專門用來應(yīng)付無限查詢場(chǎng)景的。不僅如此,useInfiniteQuery() API 能力也是基于 useQuery() 的。

之前的文章中我們介紹了 useQuery() 的核心 API,為了找回印象,我們?cè)诖速N出來:

import { useQuery } from 'react-query'

const {
  data,
  error,
  isError,
  isFetching,
  isLoading,
  isRefetching,
  isSuccess,
  refetch,
} = useQuery(queryKey, queryFn?, {
  enabled,
  onError,
  onSuccess,
  refetchOnWindowFocus,
  retry,
  staleTime,
})

如果我們把這些 API 簡(jiǎn)化如下:

const {
  ...result,
} = useQuery(queryKey, queryFn?, {
  ...options,
})

useInfiniteQuery() 其實(shí)就是在 useQuery() 基礎(chǔ)之上增添一些無限查詢場(chǎng)景的參數(shù):

const {
  fetchNextPage,
  fetchPreviousPage,
  hasNextPage,
  hasPreviousPage,
  isFetchingNextPage,
  isFetchingPreviousPage,
  ...result
} = useInfiniteQuery(queryKey, ({ pageParam = 1 }) => fetchPage(pageParam), {
  ...options,
  getNextPageParam: (lastPage, allPages) => lastPage.nextCursor,
  getPreviousPageParam: (firstPage, allPages) => firstPage.prevCursor,
})

如你所見,增加的 API 其實(shí)就是跟上一頁/下一頁查詢動(dòng)作相關(guān)的參數(shù),相比較于自己組裝 的分頁查詢能力的 useQuery(),useInfiniteQuery() 需要配置上一頁/下一頁的參數(shù)獲取函數(shù),并提供了相應(yīng)的查詢調(diào)用能力,更加自動(dòng)化和便捷。

當(dāng)然,增加的不只是參數(shù),還有 2 處:

一個(gè)是 queryFn 參數(shù)的入?yún)ⅲ嗔艘粋€(gè)名為 pageParam 的參數(shù)。

pageParam 表示當(dāng)前頁數(shù)。這個(gè)值是每次 useInfiniteQuery() 調(diào)用時(shí),通過 getNextPageParam()/getPreviousPageParam() 返回值自動(dòng)獲取并傳入 queryFn 的。

第二個(gè)還有返回值的數(shù)據(jù)結(jié)構(gòu),即 data。

const { data } = useInfiniteQuery()

原來 data 就是表示內(nèi)部請(qǐng)求方法的返回值。而 useInfiniteQuery() 的返回 data 因?yàn)橐囗摂?shù)據(jù)(展示舊數(shù)據(jù)時(shí),還要持有舊數(shù)據(jù)),因此 data 變更為:

data: { pages: TData[], pageParams: unknown[] }

pages 很好理解,就是用來承載過程中請(qǐng)求到的多頁數(shù)據(jù);pageParams 則是每個(gè)頁面當(dāng)時(shí)在做數(shù)據(jù)獲取時(shí)使用的查詢參數(shù)。

簡(jiǎn)單一例

當(dāng)然語言上說得再多,也是蒼白無力的,實(shí)踐出真知。這里我們就舉一個(gè)簡(jiǎn)單的例子說明 useInfiniteQuery() 的使用。

首先,我們先創(chuàng)建一個(gè)獲取數(shù)據(jù)的請(qǐng)求函數(shù)(使用 Fetch API)。

const getPosts = async (pageParam) => {
  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => res.json())
}

接著,使用 useInfiniteQuery() 請(qǐng)求數(shù)據(jù):

function Example() {
  const {
    isLoading,
    isError,
    error,
    data,
  } = useInfiniteQuery(
    'posts',
    ({ pageParam }) => getPosts(pageParam),
    {
      getNextPageParam: (lastPage, allPages) => ({ page: allPages.length + 1, size: 6 }),
      refetchOnWindowFocus: false, // Prevent refetching on window focus
    }
  )
  
  // ...
}

增加下加載中或出現(xiàn)異常時(shí)的處理邏輯。

function Example() {
  // ...
  if (isLoading) {
    return <div>Loading...</div>;
  }

  if (isError) {
    return <div>Error: {error.message}</div>
  }
  
  // ...
}

最后渲染分頁數(shù)據(jù)。

function Example() {
  // ...

  return (
    <div>
      <ol>
        {/* (1) */}
        {data.pages.map((page) => (
          {page.map((post) => (
            <li key={post.id}>{post.title}</li>
          ))}
        ))}
      </ol>
      
      {/* (2) */}
      <button onClick={() => fetchNextPage()}>More</button>
    </div>
  )
}
  1. 遍歷 data.pages 中所有頁面數(shù)據(jù),渲染出來
  2. 使用 fetchNextPage() 函數(shù)加載更多(實(shí)際上即“下一頁”)數(shù)據(jù)

瀏覽器訪問,不幸運(yùn)是,報(bào)錯(cuò)了。

圖片圖片

沒關(guān)系,點(diǎn)擊查看報(bào)錯(cuò)處。

圖片圖片

發(fā)現(xiàn)是是由于首次請(qǐng)求接口時(shí),pageParam 參數(shù)是 undefined,這就需要我們給 pageParam 一個(gè)默認(rèn)值。

- const getPosts = async (pageParam) => {
+ const getPosts = async (pageParam = { page: 1, size: 6 }) => {
  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => res.json())
}

再次訪問頁面,發(fā)現(xiàn)我們成功請(qǐng)求到了第一頁數(shù)據(jù)。

圖片圖片

接下來點(diǎn)擊“More”按鈕,發(fā)現(xiàn)發(fā)起了到第二頁數(shù)據(jù)的請(qǐng)求。

圖片圖片

圖片圖片

這里邏輯是先調(diào)用 getNextPageParam() 函數(shù)獲得請(qǐng)求參數(shù)。getNextPageParam() 函數(shù)的類型聲明如下:

getNextPageParam: (lastPage, allPages) => unknown | undefined

第一個(gè)參數(shù)就是上一頁數(shù)據(jù),第二個(gè)參數(shù)即到目前為止請(qǐng)求到的所有數(shù)據(jù)。對(duì)照本例,當(dāng)我們第一次點(diǎn)擊“More”按鈕時(shí),返回的值為 { page:2, size:6 }。然后,再發(fā)起 getPosts 調(diào)用并這個(gè)參數(shù),于是我們便發(fā)起了第二頁的數(shù)據(jù)請(qǐng)求,并最終得到了數(shù)據(jù)。

下面,我們?cè)俳o“More”按鈕增加一個(gè)加載狀態(tài)——我們可以使用通用的 isFetching 狀態(tài),但這里我們使用更具體的 isFetchingNextPage 狀態(tài)。

function Example() {
  const {
    isLoading,
+   isFetchingNextPage,
    isError,
    error,
    data,
  } = useInfiniteQuery()

添加給按鈕。

- <button notallow={() => fetchNextPage()}>More</button>
+ <button disabled={isFetchingNextPage} notallow={() => fetchNextPage()}>More</button>

查看效果。

圖片圖片

這樣,我們就能在請(qǐng)求下一頁數(shù)據(jù)的時(shí)候禁用按鈕點(diǎn)擊,避免用戶誤觸。

再來一例

以上案例中,我們是通過 getNextPageParam() 所提供的第二個(gè)參數(shù) allPages 來獲得下一頁頁碼的。

getNextPageParam: (lastPage, allPages) => ({ page: allPages.length + 1, size: 6 })

這是因?yàn)榉祷氐牡谝豁摂?shù)據(jù)總并未包含下一頁信息。

圖片圖片

我們?cè)偕晕⑿薷南?/p>

const getPosts = async (pageParam = { page: 1, size: 6 }) => {
  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => {
    const total = res.headers.get('X-Total-Count')

    return res.json().then(data => {
      return {
        total,
        data,
        hasMore: pageParam.page * pageParam.size < total
      }
    })
  })
}

我們將返回?cái)?shù)據(jù)放在 data 屬性中,并返回?cái)?shù)據(jù)總數(shù)(total)以及是否還有數(shù)據(jù)(hasMore)。

有了這些信息,我們就可以有了更加細(xì)膩的交互了。

下面,修改渲染邏輯。

function Example() {
  // ...
  
  return (
    <div>
      <ol>
        {data.pages.map((page) => (
          <>
            {page.data.map((post) => (
              <li key={post.id}>{post.title}</li>
            ))}
          </>
        ))}
      </ol>
      <p>總共 <strong>{data.pages[0].total}</strong> 條數(shù)據(jù)</p>
      {
        data.pages[data.pages.length - 1].hasMore ? (
          <button disabled={isFetchingNextPage} onClick={() => fetchNextPage()}>More</button>
        ) : <span>--- 我是有底線的 ---</span>
      }
    </div>
  )
}

查看初始加載效果。

圖片圖片

查看最終效果。

圖片圖片

不過,按鈕顯隱邏輯還是有些冗余。

{
  data.pages[data.pages.length - 1].hasMore ? (
    <button disabled={isFetchingNextPage} onClick={() => fetchNextPage()}>More</button>
  ) : <span>--- 我是有底線的 ---</span>
}

這一點(diǎn) useInfiniteQuery 也幫我們想到了,便提供了一個(gè) hasNextPage 供我們使用。

{
-  data.pages[data.pages.length - 1].hasMore ? (
+  hasNextPage ? (
    <button disabled={isFetchingNextPage} notallow={() => fetchNextPage()}>More</button>
  ) : <span>--- 我是有底線的 ---</span>
}

hasNextPage 為 true 表示有下一頁數(shù)據(jù),為 false 表示沒有數(shù)據(jù)了。

不過 hasNextPage 的值是受到 getNextPageParam() 返回值影響的——當(dāng) getNextPageParam() 返回 undefined 時(shí),hasNextPage 值為 false,否則為 true。

因此,我們修改下 getNextPageParam() 的判斷邏輯。

getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore 
    ? { page: allPages.length + 1, size: 50 } 
    : undefined
},

如此,我們?cè)賮聿榭聪滦Ч?/p>

圖片圖片

發(fā)現(xiàn)沒有數(shù)據(jù)的時(shí)候,同樣也不會(huì)展示“More”按鈕了。大功告成!

下拉拉取新數(shù)據(jù)

當(dāng)然,以上通過點(diǎn)擊“More”按鈕加載新數(shù)據(jù)的方式還是太麻煩了一些。如果我們?cè)诰W(wǎng)頁下拉到底部的時(shí)候自動(dòng)獲取數(shù)據(jù)不是更好嗎?

下面就來實(shí)現(xiàn)一下。

我們將借助 IntersectionObserver API[4] + 底部一個(gè) .loadMore 元素來實(shí)現(xiàn)。

首先,將 “More” 按鈕部分的代碼替換成:

<div className="loadMore" style={{ height: '30px', lineHeight: '30px' }} ref={loadMoreRef}>
  {
    isFetchingNextPage 
      ? <span>Loading...</span> 
      : <span>--- 我是有底線的 ---</span>
  }
</div>

注意,我們同時(shí)通過 loadMoreRef 拿到 DOM 元素。

然后,我們監(jiān)聽 .loadMore 元素,一旦出現(xiàn)在屏幕中,就調(diào)用 fetchNextPage() 獲取下一頁數(shù)據(jù)。

useEffect(() => {
  const observer = new IntersectionObserver((entries) => {
    if (entries[0].isIntersecting && hasNextPage) {
      fetchNextPage();
    }
  });

  if (loadMoreRef.current) {
    observer.observe(loadMoreRef.current);
  }

  return () => observer.disconnect();
}, [hasNextPage, fetchNextPage]);

來查看效果。

圖片圖片

完美。

最后,再把完整代碼貼出來,方便大家學(xué)習(xí)。

import { useEffect, useRef } from 'react'
import { QueryClient, QueryClientProvider, useInfiniteQuery } from 'react-query'

// Create a client
const queryClient = new QueryClient()

export default function App() {
  return (
    // Provide the client to your App
    <QueryClientProvider client={queryClient}>
      <Example />
    </QueryClientProvider>
  )
}

const getPosts = async (pageParam = { page: 1, size: 25 }) => {
  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam.page}&_limit=${pageParam.size}`).then(res => {
    const total = res.headers.get('X-Total-Count')

    return res.json().then(data => {
      return {
        total,
        data,
        hasMore: pageParam.page * pageParam.size < total
      }
    })
  })
}

function Example() {
  const {
    isLoading,
    isFetchingNextPage,
    hasNextPage,
    isError,
    error,
    data,
    fetchNextPage
  } = useInfiniteQuery(
    'posts',
    ({ pageParam }) => getPosts(pageParam),
    {
      getNextPageParam: (lastPage, allPages) => {
        return lastPage.hasMore ? { page: allPages.length + 1, size: 25 } : undefined
      },
      refetchOnWindowFocus: false, // Prevent refetching on window focus
    }
  )

  const loadMoreRef = useRef(null);

  useEffect(() => {
    const observer = new IntersectionObserver((entries) => {
      if (entries[0].isIntersecting && hasNextPage) {
        fetchNextPage();
      }
    });

    if (loadMoreRef.current) {
      observer.observe(loadMoreRef.current);
    }

    return () => observer.disconnect();
  }, [hasNextPage, fetchNextPage]);


  if (isLoading) {
    return <div>Loading...</div>;
  }

  if (isError) {
    return <div>Error: {error.message}</div>
  }

  return (
    <div>
      <p>總共 <strong>{data.pages[0].total}</strong> 條數(shù)據(jù)</p>
      <ol>
        {data.pages.map((page) => (
          <>
            {page.data.map((post) => (
              <li key={post.id}>{post.title}</li>
            ))}
          </>
        ))}
      </ol>
      <div className="loadMore" style={{ height: '30px', lineHeight: '30px' }} ref={loadMoreRef}>
        {
          isFetchingNextPage ? <span>Loading...</span> : <span>--- 我是有底線的 ---</span>
        }
      </div>
    </div>
  )
}

總結(jié)

本文我們講述了 React Query 中用于無限查詢 API useInfiniteQuery() 的使用。

通過循序漸進(jìn)的 3 個(gè)案例,最終實(shí)現(xiàn)了一個(gè)下拉到底后自動(dòng)新數(shù)據(jù)的交互效果,還是比較好實(shí)現(xiàn)的。

當(dāng)然,本文只是以“下一頁”舉例,“上一頁”與此同理。

希望本位講述的內(nèi)容能夠?qū)δ愕墓ぷ饔兴鶐椭8兄x閱讀,再見。

參考資料

[1]React Query 是做什么的?: https://juejin.cn/post/7378015213348257855

[2]一個(gè)數(shù)據(jù)獲竟然被 React Query 玩出這么多花樣來!: https://juejin.cn/post/7380342160581918731

[3]React Query 的 useQuery 竟也內(nèi)置了分頁查詢支持!: https://juejin.cn/post/7380569775686746151

[4]IntersectionObserver API: https://ruanyifeng.com/blog/2016/11/intersectionobserver_api.html

責(zé)任編輯:武曉燕 來源: 寫代碼的寶哥
相關(guān)推薦

2024-10-14 08:39:25

2022-08-03 09:11:31

React性能優(yōu)化

2019-11-22 08:40:19

ProtobufGo編程語言

2015-04-22 10:57:22

androidSwipeRefres

2013-07-17 16:33:02

下拉刷新listvie滾動(dòng)到底部加載Android開發(fā)學(xué)習(xí)

2023-11-27 08:24:57

FormikReact

2023-06-16 09:08:39

ReactContextRFC

2019-10-08 11:10:18

React自動(dòng)保存前端

2022-03-30 09:43:19

jscodeshif自動(dòng)化重構(gòu)開發(fā)

2016-08-05 17:01:09

AndroidRecyclerVie下拉刷新

2015-03-23 18:11:39

UITableViewswift下拉刷新

2023-05-26 06:30:56

2012-04-12 10:19:08

Ajax.NET

2022-04-14 08:00:00

Cypress測(cè)試開發(fā)

2021-12-01 10:02:57

鴻蒙HarmonyOS應(yīng)用

2015-05-13 09:36:18

js模擬手機(jī)下拉刷新

2021-03-12 18:25:09

開發(fā)前端React

2023-12-01 09:18:27

AxiosAxios 庫

2021-06-01 09:27:52

視頻動(dòng)畫Remotion

2022-07-18 09:01:58

React函數(shù)組件Hooks
點(diǎn)贊
收藏

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

亚洲人精品午夜射精日韩| 国产又爽又黄的激情精品视频| 伊人av在线播放| 超碰97免费在线| 2020国产精品自拍| 91久久国产精品| 自拍偷拍欧美亚洲| 日韩影院二区| 亚洲国产精品va在线| 无码内射中文字幕岛国片| 91精品久久| 久久精品日韩一区二区三区| 成人女保姆的销魂服务| 日韩三级小视频| 欧美理论在线播放| 日韩精品一区二区三区视频在线观看 | 九九九伊在人线综合| 一区二区导航| 欧美午夜不卡视频| 欧美成人免费在线观看视频| 欧美日韩视频在线播放| www.性欧美| 91九色国产在线| 免费av中文字幕| 夜夜嗨av一区二区三区网站四季av| 中文字幕精品久久| free性中国hd国语露脸| 欧洲一区在线| 欧美综合在线视频| 国产最新免费视频| 美女精品导航| 亚洲人xxxx| 夜夜爽www精品| 国产女主播在线写真| av亚洲精华国产精华精华| 91免费国产视频| 国产女优在线播放| 久久久久久网| 欧美有码在线观看| 国产成人免费观看视频| 国产精品v日韩精品v欧美精品网站| 色黄久久久久久| 精品国产成人亚洲午夜福利| 日本国产精品| 日韩大陆欧美高清视频区| 特级特黄刘亦菲aaa级| 麻豆精品一区| 日韩免费视频一区二区| 午夜激情影院在线观看| 图片一区二区| 91精品婷婷国产综合久久| 天堂av2020| 久久福利在线| 欧美亚洲禁片免费| 污视频免费在线观看网站| 欧美自拍电影| 欧美亚洲综合另类| 天天干天天操天天做| 国产成人精品一区二区三区在线 | 三级视频在线观看| 国产精品嫩草99av在线| 欧美一区二区三区…… | 欧美视频一区在线| 亚洲成色www.777999| 日本一区二区三区视频在线| 日本福利一区二区| 性刺激的欧美三级视频| 伊人久久一区| 欧美成人一区二区三区片免费 | 国产成人在线免费看| 三级中文字幕在线观看| 欧美午夜宅男影院在线观看| 欧美视频免费播放| 国产激情久久| 日韩三级在线免费观看| 亚洲精品久久一区二区三区777 | 精品久久久三级丝袜| 性农村xxxxx小树林| 人体久久天天| 色yeye香蕉凹凸一区二区av| 欧美日韩精品在线观看视频| 在线视频观看日韩| 国产精品第七十二页| 国产乱人乱偷精品视频| 成人在线综合网站| 欧美日韩精品综合| 国产一二三区在线观看| 亚洲国产精品影院| 爆乳熟妇一区二区三区霸乳| av国产精品| 亚洲国产天堂久久国产91| 乐播av一区二区三区| 99久久亚洲精品蜜臀| 欧美国产乱视频| 亚洲欧美自拍视频| 久久www免费人成看片高清| 国产富婆一区二区三区| 国产在线资源| 亚洲一区二区三区四区在线免费观看 | 在线视频你懂得一区| 激情成人在线观看| 人人网欧美视频| 久久亚洲欧美日韩精品专区| 国产又大又黑又粗免费视频| 麻豆精品一区二区三区| 国产精品视频免费观看| 尤物网在线观看| 亚洲r级在线视频| 超碰人人草人人| 亚洲区小说区图片区qvod按摩| 日韩在线视频二区| 中文字幕一区二区三区精品| 久热成人在线视频| 乱一区二区三区在线播放| 黄色在线免费网站| 日本高清无吗v一区| 亚洲av成人片色在线观看高潮| 欧美顶级大胆免费视频| 青青在线视频一区二区三区| 国产av无码专区亚洲a∨毛片| 久久老女人爱爱| 精品一二三四五区| 91麻豆精品| 亚洲片av在线| 美日韩一二三区| 国产成人av影院| 伊人情人网综合| 日韩欧美一区二区三区在线观看 | 麻豆国产在线播放| 亚洲大尺度视频在线观看| 在线视频观看一区二区| 国产精品一区高清| 136fldh精品导航福利| www.狠狠干| 亚洲桃色在线一区| 一道本在线免费视频| 欧美日韩激情在线一区二区三区| 97视频在线观看视频免费视频| www香蕉视频| 亚洲免费色视频| 欧美性猛交xxxx乱大交91| japanese国产精品| 国产成人avxxxxx在线看| 天天摸天天干天天操| 亚洲图片自拍偷拍| 日批免费观看视频| 亚洲视频久久| 国产精品9999久久久久仙踪林| a篇片在线观看网站| 91精品久久久久久久久99蜜臂| 国产成人免费在线观看视频| 久久综合导航| 日韩精品一区二区三区外面| 二吊插入一穴一区二区| 夜夜嗨av一区二区三区免费区| 91porny九色| 国产精品青草综合久久久久99| 成人性生生活性生交12| 色综合五月天| 国产日韩欧美日韩大片| 日本在线天堂| 欧美一区二区三区电影| 五月婷婷一区二区| 成人午夜激情影院| 国产91对白刺激露脸在线观看| 欧美午夜18电影| 欧美一区二区视频97| 精品福利视频导航大全| 欧美男生操女生| 国产精品久久久久久久精| 豆国产96在线|亚洲| 日韩av片在线看| 日韩av有码| 91在线观看免费高清| 久草在线视频资源| 亚洲护士老师的毛茸茸最新章节| 欧美精品韩国精品| 中文字幕av在线一区二区三区| av中文字幕网址| 亚洲先锋成人| 日韩欧美亚洲精品| 国产精品亚洲欧美日韩一区在线 | 一区二区三区四区五区精品| 成人免费91| 久久免费高清视频| 成年人在线观看网站| 91精品久久久久久蜜臀| 日日夜夜综合网| 国产精品国产精品国产专区不片| 亚洲成人福利视频| 美女91精品| 奇米777四色影视在线看| 天堂网av成人| 91网站在线看| www.com.cn成人| 久久伊人91精品综合网站| 天天射天天操天天干| 欧美日韩dvd在线观看| 动漫精品一区一码二码三码四码| 国产欧美日韩亚州综合 | 国产午夜伦鲁鲁| 91精品电影| 久久艳妇乳肉豪妇荡乳av| 国产日本久久| 91高清免费在线观看| av片哪里在线观看| 亚洲午夜av久久乱码| 午夜免费福利视频| 精品视频免费在线| 亚洲第一精品在线观看 | 免费观看成人毛片| 亚洲另类春色国产| 女女互磨互喷水高潮les呻吟| 丁香亚洲综合激情啪啪综合| 邪恶网站在线观看| 亚洲在线黄色| 免费网站永久免费观看| 成人在线免费观看视频| 精品麻豆av| 亚洲高清在线一区| 国产精品丝袜白浆摸在线| 日本乱码一区二区三区不卡| 欧美高清性猛交| 日本中文在线| 日韩在线小视频| 成人午夜电影在线观看| 日韩av最新在线观看| 性欧美18一19性猛交| 欧美情侣在线播放| 日本成人一级片| 91精品福利在线| 欧美三级午夜理伦| 亚洲v日本v欧美v久久精品| 91插插插插插插| 国产精品国产成人国产三级| 99精品欧美一区二区| 久久夜色精品国产噜噜av| 捆绑凌虐一区二区三区| 国产传媒欧美日韩成人| 中文字幕第66页| 国产剧情av麻豆香蕉精品| 成 人 黄 色 小说网站 s色| 蜜臀久久99精品久久久画质超高清| 欧美网站免费观看| 99视频+国产日韩欧美| 欧美国产日韩激情| 9色国产精品| 日本国产在线播放| 一本色道久久综合一区| 欧美久久久久久久久久久久久| 国内精品久久久久久久97牛牛 | 国模精品视频| 98视频在线噜噜噜国产| 欧美少妇网站| 日本伊人精品一区二区三区介绍| 台湾佬中文娱乐网欧美电影| 97超碰色婷婷| 日韩成人影音| 国产日韩欧美影视| 日韩在线成人| 久久久久久久久一区| 欧美**vk| 亚洲永久激情精品| 久久网站免费观看| 日本道在线视频| 亚洲久久一区二区| 国产成人精品视频免费看| 天堂蜜桃91精品| 久久久精品高清| 国产白丝精品91爽爽久久| 亚洲av无码一区二区三区网址| 久久久亚洲欧洲日产国码αv| 中文字幕网站在线观看| 国产精品日韩精品欧美在线| 男人操女人的视频网站| 亚洲成人一二三| 中文字幕天堂在线| 欧美精品vⅰdeose4hd| 成人高潮片免费视频| 日韩电影大全免费观看2023年上| 国产视频三级在线观看播放| 久久综合免费视频| 欧美男男激情videos| 国产在线视频欧美| 加勒比色综合久久久久久久久| 蜜桃视频在线观看91| 欧美oldwomenvideos| 久久久久久久久久网| 青青草国产精品97视觉盛宴| aaaaaaaa毛片| 99久久99久久精品免费看蜜桃| 免费一级特黄3大片视频| 伊人性伊人情综合网| www.国产高清| 欧美一区二区性放荡片| 天堂视频中文在线| 久久韩剧网电视剧| 日本黄色免费在线| 91综合免费在线| 国产精品三级| www.日本在线视频| 日韩电影免费一区| 美女扒开腿免费视频| 国产精品视频第一区| 久久免费小视频| 欧美男男青年gay1069videost| 色欲av永久无码精品无码蜜桃 | 欧美一区二视频在线免费观看| 欧美一区高清| 亚欧美在线观看| 91亚洲资源网| 欧美黄色免费在线观看| 欧美在线小视频| 青青色在线视频| 久久久亚洲影院你懂的| 自拍偷拍欧美日韩| 日韩电影在线播放| 国产精品久久久亚洲一区| 国产黑丝在线视频| 国产精品美女久久久久久| 日韩中文字幕在线观看视频| 亚洲大胆人体在线| 日本天码aⅴ片在线电影网站| 国产精品国产三级国产专播精品人 | 亚洲成人网久久久| 黄色av免费在线| 国产美女精彩久久| 精品久久久久久久| 久久久久久久久久久免费视频| 成人免费的视频| 免费在线观看日韩| 91精品综合久久久久久| 午夜视频在线看| 国产精品自拍视频| 欧美精品一区二区三区精品| 日本熟妇人妻xxxxx| 99re这里都是精品| 国产无码精品一区二区| 欧美tickling网站挠脚心| 菠萝菠萝蜜在线视频免费观看| 国产免费一区二区三区在线观看 | 91麻豆福利精品推荐| 亚洲黄色一区二区| 亚洲韩国日本中文字幕| 乱人伦视频在线| 久久国产精品精品国产色婷婷 | 国内伊人久久久久久网站视频 | 香蕉视频亚洲一级| 日本不卡久久| 秋霞成人午夜伦在线观看| 日本人亚洲人jjzzjjz| 欧美日韩一区二区三区视频 | √…a在线天堂一区| 91在线你懂的| 另类图片亚洲另类| 深夜福利一区二区三区| 中国丰满熟妇xxxx性| av不卡免费电影| 二区视频在线观看| 亚洲色无码播放| 精品福利在线| 日本a级片在线观看| 成人av在线资源网| 男人午夜免费视频| 在线观看欧美视频| 粉嫩av国产一区二区三区| 青青在线视频免费观看| 白白色 亚洲乱淫| 黄色一级片免费在线观看| 伊人av综合网| www欧美在线观看| a级黄色小视频| 久久精品视频一区二区| 亚洲天堂手机在线| 欧美另类99xxxxx| 日本一道高清一区二区三区| 色婷婷综合久久久久中文字幕| 国产精品成人午夜| 黄色一级大片在线免费看国产| 欧美一级电影在线| 99久久亚洲精品| 午夜男人的天堂| 欧美性大战久久久久久久蜜臀| av网站在线看| 欧美日韩精品不卡| 国产一区啦啦啦在线观看| 国产福利拍拍拍| 日韩视频免费观看| 国产精品毛片久久久| 久久精品免费网站| 亚洲一区在线观看视频| 成人影院免费观看| 国产精品一区二区不卡视频| 日韩中文字幕一区二区三区| 玖玖爱这里只有精品| 亚洲美腿欧美激情另类| 精品麻豆剧传媒av国产九九九| 久草青青在线观看| 一区二区三区在线影院| 九九热视频在线观看|