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

useEffect 實踐案例之一

開發 前端
案例中的樣式使用了CSS Module,因此 ClassName 的語法會與前面介紹的有所不同,我們把 S.input 當成一個字符串來看待即可。

對于 useEffect 的掌握是 React hooks 學習的重中之重。因此我們還需要花一些篇幅繼續圍繞它講解。

上一篇文章中,我們使用兩個案例分析了 useEffect 的理論知識。接下來,我們通過一些具體的實踐案例來學習 useEffect 的運用。

一、需求

現有一個簡單的需求,要實現一個搜索框,輸入內容之后,點擊搜索按鈕,然后得到一個列表。

當列表為空時,顯示暫無數據。

接口請求過程中,需要顯示 Loading 狀態。

Loading 狀態隨便用的一個轉圈圖標來表示,和下面的圖標有點重疊,以后有機會再調整一下 UI。

接口請求成功之后,顯示一個列表。

再次搜索時,顯示 Loading 狀態。

如果接口請求出錯,顯示錯誤頁面。

在實踐中,這是針對一個請求所需要的常規狀態處理,當然很多時候我們在學習的過程中簡化了空數據/Loading/異常等狀態,就導致了許多自學的朋友沒有在工作中友好處理這些狀態的習慣。

二、實現

我們一步一步來實現該需求。

我們假設一個請求需要花費 600ms,在學習階段,我們可以借助 Promise 與 setTimeout 來模擬一個接口請求。

單獨創建一個 api.ts 文件。

在該文件中,我們聲明一個名為 searchApi 的函數,該函數接收一個字符串作為參數。

我計劃設計該函數最終返回一個 Promise 對象。并將一個字符串數組 resolve 出來。該字符串由搜索條件的一個字符與Math.random 產生的隨機數組成。

輸出的列表長這樣。

該 api 函數具體代碼如下:

// ./api.ts
export function searchApi(param: string) {
  return new Promise<string[]>((resolve, reject) => {
    const p = param.split('')
    const arr: string[] = []
    for(var i = 0; i < 10; i++) {
      const pindex = i % p.length
      arr.push(`${p[pindex] || '^ ^'} - ${Math.random()}`)
    }
    setTimeout(() => {
      if (Math.random() * 10 > 1) {
        resolve(arr)
      } else {
        reject('請求異常,請重新嘗試!')
      }
    }, 600)
  })
}

在該函數中,我們使用泛型明確了 Promise 的輸出類型,在后續的使用中就可以利用 TypeScript 的自動類型推導得到具體的返回類型。

接下來我們要創建組件函數。

// index.tsx
export default function DemoOneNormal() {
  // ...
}

然后我們根據 UI 的情況去分析應該在代碼中設計哪些數據。

首先有一個列表需要展示。

const [list, setList] = useState<string[]>([])

然后有一個 Loading 的顯示與隱藏需要控制。

const [loading, setLoading] = useState(false)

還有一個錯誤信息需要顯示。

const [error, setError] = useState('')

還有一個稍微有一些特殊的,輸入框中輸入的內容。我們要注意準確分析內容:該內容的展示在已有的 UI 中,是根據鍵盤輸入而展示內容,它不由數據來驅動。

我們在該案例中,僅僅只是記錄輸入的內容,并傳入 searchApi即可。因此我們可以使用 useRef 來存儲該變量。

const str = useRef('')

如果情況有變,有其他的 UI 需要該數據來驅動,那么我們就需要將其調整為使用 useState 來存儲。

接下來思考 JSX 代碼的編寫。

首先是一個輸入框 input 與按鈕 button。

<input 
  className={s.input} 
  placeholder="請輸入您要搜索的內容" 
  notallow={(e) => str.current = e.target.value} 
/>
<Button 
  className={s.button} 
  onClick={onSure}
>
  搜索
</Button>

案例中的樣式使用了 css module,因此 className 的語法會與前面介紹的有所不同,我們把 s.input 當成一個字符串來看待即可。

代碼中,借助 input 的 onChange 回調來記錄當前輸入的值。

// const str = useRef('')
notallow={(e) => str.current = e.target.value}

點擊按鈕時,修改對應的狀態,并開始發送請求。此時 Loading 應該修改為 true。

function onSure() {
  setLoading(true)
  searchApi(str.current).then(res => {
    setList(res)
    setLoading(false)
    setError('')
  }).catch(err => {
    setLoading(false)
    setError(err)
  })
}

請求成功之后,Loading 改回 false,list 得到新的數據。如果請求失敗,Loading 依然需要改成 false,并記錄錯誤信息。

接下來我們要思考列表的 UI 代碼。

首先,空數據、錯誤信息、正常列表的顯示情況是互斥的,他們三個只能存在一個。Loading 狀態是每個情況下都有可能發生的,與他們的關系是分別共存的。

因此,當有錯誤信息時,這一塊的內容應該為。

if (error) {
  return (
    <div className={s.wrapper}>
      {loading && (
        <div className={s.loading_wrapper}>
          <Icon spin type='loading' style={{ fontSize: 40 }} />
        </div>
      )}
      <Icon type='event' color='red' style={{ fontSize: 32 }} />
      <div className={s.error}>{error}</div>
    </div>
  )
}

案例中出現的 Icon 組件是一個圖標,該組件是我們這個項目自己封裝好的基礎組件。

當是空列表時。

if (list.length === 0) {
  return (
    <div className={s.wrapper}>
      {loading && (
        <div className={s.loading_wrapper}>
          <Icon spin type='loading' color='#2860Fa' style={{ fontSize: 38 }} />
        </div>
      )}
      <Icon type='event' color='#ccc' style={{ fontSize: 32 }} />
      <div className={s.nodata}>暫無數據</div>
    </div>
  )
}

正常列表有數據時。

<div className={s.list}>
  {loading && (
    <div className={s.loading_wrapper}>
      <Icon spin type='loading' color='#2860Fa' style={{ fontSize: 38 }} />
    </div>
  )}

  {list.map(item => (
    <div key={item} className={s.item}>{item}</div>
  ))}
</div>

OK,此時所有的邏輯已經考慮完畢。

三、優化封裝

我們會發現,列表相關的邏輯實在是有點繁瑣。如果每次遇到一個列表就要處理這么多,豈不是非常消耗時間?

因此我們這里考慮將這些邏輯統一封裝到 List 組件里,下次要使用直接拿出來用就可以了。

// ./List/index.tsx
export default function List(props) {}

在封裝時,我們首先要考慮哪些屬性需要作為 props 傳入該 List 組件。關于封裝的思考,和其他的邏輯封裝是一樣的,我們需要先考慮在不同的場景之下,他們的共性與差異分別是什么,差異的部分作為參數傳入。

三個數據,error,loading,list 都是差異部分,他們需要作為 props 傳入。

先定義一個類型聲明如下:

interface ListProps<T> {
  loading?: boolean,
  error?: string,
  list?: T[]
}

此時我們看到由于 list 的每一項具體數據內容,可能每一個列表都不一樣,我們無法在這里確認他的類型,因此此處使用泛型來表示。

不知道 list 的每一項具體數據是什么,也就意味著對應的 UI 我們也無法提前得知,只有在使用時才知道,因此還應該補上一個新的 props 屬性。

interface ListProps<T> {
  loading?: boolean,
  error?: string,
  list?: T[],
+ renderItem: (item: T) => ReactNode
}

然后我們只需要把差異部分與共同部分在組件邏輯中組合起來即可,List 組件完整代碼如下:

import Icon from 'components/Icon'
import { ReactNode } from 'react'
import s from './index.module.scss'

interface ListProps<T> {
  loading?: boolean,
  error?: string,
  list?: T[],
  renderItem: (item: T) => ReactNode
}

export default function List<T>(props: ListProps<T>) {
  const {list = [], loading, error, renderItem} = props

  if (error) {
    return (
      <div className={s.wrapper}>
        {loading && (
          <div className={s.loading_wrapper}>
            <Icon spin type='loading' style={{ fontSize: 40 }} />
          </div>
        )}
        <Icon type='event' color='red' style={{ fontSize: 32 }} />
        <div className={s.error}>{error}</div>
      </div>
    )
  }

  if (list.length === 0) {
    return (
      <div className={s.wrapper}>
        {loading && (
          <div className={s.loading_wrapper}>
            <Icon spin type='loading' color='#2860Fa' style={{ fontSize: 38 }} />
          </div>
        )}
        <Icon type='event' color='#ccc' style={{ fontSize: 32 }} />
        <div className={s.nodata}>暫無數據</div>
      </div>
    )
  }

  return (
    <div className={s.list}>
      {loading && (
        <div className={s.loading_wrapper}>
          <Icon spin type='loading' color='#2860Fa' style={{ fontSize: 38 }} />
        </div>
      )}

      {list.map(renderItem)}
    </div>
  )
}

封裝好之后,使用起來就非常簡單了,我們只需要把當前上下文中的數據傳入進去即可。

<List 
  list={list} 
  loading={loading}  
  error={error}
  renderItem={(item) => (
    <div key={item} className={s.item}>{item}</div>
  )}
/>

該案例組件文件路徑:src/pages/demos/effect/search/Normal.tsx

四、需求改進

在某些場景,初始化時我們并不需要展示空數組,而是需要請求一次接口,然后展示對應的列表,因此,在這種需求的情況下,代碼需要進行一些調整。

首先,Loading 的初始化狀態需要從 false 改為 true,表示一開始就會立即請求數據。

- const [loading, setLoading] = useState(false)
+ const [loading, setLoading] = useState(true)

然后初始化請求數據的操作,在 useEffect 中完成,傳入空數組作為依賴項,表示只在組件首次渲染完成之后執行一次。

... 

+ useEffect(() => {
+   searchApi(str.current).then(res => {
+     setList(res)
+     setLoading(false)
+     setError('')
+   }).catch(err => {
+     setLoading(false)
+     setError(err)
+   })
+ }, [])

function onSure() {
  setLoading(true)
  searchApi(str.current).then(res => {
    setList(res)
    setLoading(false)
    setError('')
  }).catch(err => {
    setLoading(false)
    setError(err)
  })
}

...

OK,這樣需求就完整的被解決,不過此時我們發現,useEffect 的邏輯與 onSure 的邏輯高度重合,他們一個代表初始化邏輯,一個代表更新邏輯。

因此在代碼上做一些簡單的調整。

function getList() {
    searchApi(str.current).then(res => {
      setList(res)
      setLoading(false)
      setError('')
    }).catch(err => {
      setLoading(false)
      setError(err)
    })
  }

  useEffect(() => {
    getList()
  }, [])

  function onSure() {
    setLoading(true)
    getList()
  }

這樣調整了之后,我們發現一個有趣的事情,當點擊搜索按鈕觸發 onSure 時,我們會執行一次把 loading 修改為 true 的操作。

setLoading(true)

那如果這個時候,我們就可以把 loading 作為 useEffect 的依賴項傳入,onSure 里就可以只保留這一行代碼。

useEffect(() => {
  loading && getList()
}, [loading])

function onSure() {
  setLoading(true)
}

這就是我們在本書唯一付費章節「React 哲學」中提到的開關思維。在日常生活中,如果我想要打開電視機,我們只需要關注開關按鈕那一下操作,在這里也是一樣,如果我想要重新請求列表搜索,我只需要關注如何操作 loading 這個開關即可

該案例組件文件路徑:src/pages/demos/effect/search/Normal2.tsx。

接下來我們將要學習自定義 hook,進一步感受開關思維的魅力。

責任編輯:姜華 來源: 這波能反殺
相關推薦

2023-12-21 09:00:21

函數React 組件useEffect

2022-05-07 15:44:45

eTS 開發鴻蒙

2025-05-12 01:33:00

異步函數Promise

2024-01-02 07:56:13

ReactuseEffect數據驅動 UI

2024-06-12 07:44:28

2023-12-12 09:43:17

桌面開發Net消息機制

2023-12-22 08:46:15

useEffectVueMobx

2019-08-09 10:58:48

2021-06-03 19:55:55

MySQ查詢優化

2011-01-25 10:51:54

系統架構設計師

2019-07-17 15:05:35

應用服務器Tomcat監控

2022-02-16 15:39:30

ACTS應用XTS子系統鴻蒙

2012-06-25 14:01:10

云計算案例

2021-02-04 15:08:37

Vue漸進式框架

2021-05-06 05:39:30

Inotify監聽系統

2021-04-21 21:09:36

緩存系統高可用

2021-02-18 22:21:20

ASM服務組件化

2021-11-10 10:48:36

C++函數指針

2021-11-30 07:02:10

虛擬化Linux 中斷

2011-04-25 11:18:39

Ajax
點贊
收藏

51CTO技術棧公眾號

九九九在线观看| 欧美又黄又嫩大片a级| 日本福利片在线| 久久深夜福利| 这里只有视频精品| 午夜一区二区视频| 绿色成人影院| 国产精品久久三区| 日韩欧美一区二区久久婷婷| 99re6这里有精品热视频| 丰满少妇一级片| 亚洲女人av| 久久精品视频在线播放| 国产精品久久久久久亚洲av| 日韩国产激情| 亚洲精品免费播放| 日本成人三级电影网站| 国内老熟妇对白xxxxhd| 美女黄网久久| 欧美大片欧美激情性色a∨久久| 精品人伦一区二区三电影 | 一区视频在线播放| 国产精品一区二区欧美| 亚洲在线精品视频| 另类图片国产| 久久久久久香蕉网| 久久av红桃一区二区禁漫| 久久a爱视频| 911国产精品| 午夜视频你懂的| 欧美伦理91| 亚洲一区二区三区四区在线免费观看| 日本黑人久久| 天堂中文在线资| 国产精品羞羞答答xxdd| 国产精品美女视频网站| 久久国产视频播放| 国内精品久久久久久久97牛牛| 在线观看久久久久久| 亚洲av片不卡无码久久| 99这里只有精品视频| 欧美精品久久久久久久久老牛影院| 激情综合在线观看| 国产在线美女| 亚洲一区二区三区爽爽爽爽爽| 尤物一区二区三区| 91青青在线视频| 国产偷国产偷亚洲高清人白洁| 黑人巨大精品欧美一区二区小视频 | 激情深爱综合网| 在线免费av导航| 亚洲欧美色综合| 中文字幕日韩精品久久| 99视频在线观看地址| 久久九九国产精品| 秋霞毛片久久久久久久久| 同心难改在线观看| 91美女片黄在线观看| 国内精品久久久久久久果冻传媒| 丰满人妻熟女aⅴ一区| 国产不卡高清在线观看视频| 粉嫩av一区二区三区免费观看| 性欧美videos另类hd| 粉嫩久久99精品久久久久久夜| 99re在线视频观看| 亚洲免费不卡视频| 99精品黄色片免费大全| 麻豆传媒一区| 成人福利在线| 亚洲欧美国产77777| av影院在线播放| a毛片不卡免费看片| 亚洲成人动漫在线观看| 国模gogo一区二区大胆私拍| 庆余年2免费日韩剧观看大牛| 蜜桃av免费在线观看| 久久综合成人| 欧美精品在线观看| 久久精品久久精品久久| 亚洲视频www| 国产精品久久久久免费a∨| 一卡二卡三卡在线观看| 国产精品影视在线观看| 国产嫩草一区二区三区在线观看| 飘雪影视在线观看免费观看| 中文字幕精品一区| 在线观看三级网站| 欧美伦理91| 欧美欧美欧美欧美| 岛国精品一区二区三区| 精品一区欧美| 欧美不卡视频一区发布| 亚洲黄色小说图片| 久久精品国产成人一区二区三区 | 国产高清免费在线观看| 99久久精品一区二区| 五月天婷亚洲天综合网鲁鲁鲁| а√天堂8资源在线官网| 偷拍日韩校园综合在线| 99热这里只有精品在线播放| 亚洲日本va午夜在线电影| 亚洲美女视频网站| av成人免费网站| 先锋影音久久久| 91免费福利视频| 色鬼7777久久| 亚洲精品第1页| 中文字幕欧美人妻精品一区| 日韩一二三区| 色偷偷9999www| 在线观看免费av片| 国产不卡视频在线播放| 亚洲人成人77777线观看| 黑人极品ⅴideos精品欧美棵| 欧美性感一类影片在线播放| 精人妻一区二区三区| 欧美jizz| 欧美洲成人男女午夜视频| 性一交一乱一伧老太| 国产无一区二区| heyzo亚洲| 麻豆视频久久| 日韩中文字幕网址| 一级片免费在线播放| 波多野结衣中文字幕一区二区三区| 亚洲色图自拍| 日本一区二区三区视频在线| 日韩精品一区二区三区第95| 久久国产在线观看| 国产在线国偷精品产拍免费yy | 最近高清中文在线字幕在线观看| 欧美日韩国产激情| 野战少妇38p| 自拍日韩欧美| 91亚洲va在线va天堂va国 | 色悠悠久久综合网| 国产探花一区二区| 4388成人网| 香港三日本三级少妇66| 亚洲综合视频在线观看| 污免费在线观看| 99久久精品费精品国产| 国产精品永久免费在线| a天堂在线资源| 欧美午夜精品电影| 久久久久久久久久久久久久久| aa级大片欧美三级| 精品久久一区二区三区蜜桃| 国产理论在线| 日韩福利在线播放| 久久亚洲精品国产| 久久综合久久久久88| 国产午夜福利视频在线观看| 清纯唯美亚洲经典中文字幕| 国产91精品久| 欧美日韩在线精品一区二区三区激情综| 黄网动漫久久久| 黑人巨大精品欧美| 亚洲制服av| 日韩三级电影| 日本一区二区中文字幕| 久久久精品视频在线观看| 国产精品国产三级国产aⅴ| 亚洲美腿欧美偷拍| 老司机av网站| 国产欧美另类| 色一情一乱一伦一区二区三欧美| 国产一区二区色噜噜| 精品国产一区二区三区久久狼黑人| 国产主播第一页| 亚洲欧洲精品天堂一级| 潘金莲一级淫片aaaaa| 亚洲美女毛片| 日韩精品国内| 国产精品一区二区三区四区在线观看| 欧美黑人国产人伦爽爽爽| 午夜福利一区二区三区| 色一情一伦一子一伦一区| 亚洲一二三在线观看| 成人黄色网址在线观看| 黄色三级视频片| 综合精品久久| 欧美激情论坛| 国产日韩一区二区三免费高清| 欧美精品国产精品日韩精品| 免费观看成年在线视频网站| 欧美高清一级片在线| 久一区二区三区| 国产欧美精品一区二区色综合朱莉| www.cao超碰| 一本色道久久综合亚洲精品不| 日韩欧美视频第二区| 亚洲天堂中文字幕在线观看| 97超级碰碰人国产在线观看| 免费在线观看av网站| 中文一区二区在线观看| 日日干日日操日日射| 亚洲三级影院| 一区二区三区不卡在线| 久久精品福利| 成人在线视频网| 中文在线а√在线8| 欧美精品一区三区| 高清av在线| 亚洲国产成人精品电影| 亚洲一区在线观| 色综合久久99| 精品视频在线观看免费| 中文字幕精品一区二区三区精品| 国内成人自拍视频| 日韩欧美国产三级| 国产网站在线看| 国产精品久久毛片a| 800av在线播放| 国内成人自拍视频| 日韩一级理论片| 国产日韩一区二区三区在线| 色哟哟免费网站| 久久精品国产大片免费观看| 久久精品一二三区| 7m精品国产导航在线| 国产精品一香蕉国产线看观看| 中文在线аv在线| 午夜免费久久久久| 影音先锋在线播放| www.久久久久| 求av网址在线观看| 一区二区三区在线播放欧美| 艳母动漫在线看| 亚洲国产精品系列| 亚洲精品久久久久avwww潮水 | 国产精品无码av在线播放| 欧美在线高清| 天天干天天色天天爽| 日韩午夜电影网| 亚洲精品国产一区| jlzzjlzz亚洲女人| 欧美极品一区二区| 美女精品一区最新中文字幕一区二区三区 | 夜夜嗨av色综合久久久综合网| 午夜福利一区二区三区| 亚洲国产精品一区二区三区| 欧洲av在线播放| 亚洲爱爱爱爱爱| 天天干,夜夜爽| 日韩成人久久久| 日本一级在线观看| 亚洲女人天堂av| 六十路在线观看| 亚洲天堂网在线观看| 黄网站在线观看| 尤物99国产成人精品视频| 成年在线电影| 日韩专区在线观看| 国精产品一区| 欧美激情精品在线| av在线不卡免费| 欧美又大又硬又粗bbbbb| 韩国成人漫画| 国产精品美女呻吟| 精品国产鲁一鲁****| 51国偷自产一区二区三区| 91久久精品无嫩草影院| 精品一卡二卡三卡四卡日本乱码| 中文有码一区| 一区二区三区视频| 欧美人成网站| 久久美女福利视频| 另类小说综合欧美亚洲| 欧美性受xxxx黒人xyx性爽| 国产不卡在线视频| 国产精品亚洲无码| 中文字幕在线观看不卡视频| 婷婷伊人五月天| 午夜精品久久久久久久99樱桃| 青草视频在线观看免费| 欧美日韩精品一区二区在线播放| 国产熟女精品视频| 亚洲精品成人久久电影| www.久久热.com| 欧美裸体xxxx极品少妇| 国产免费拔擦拔擦8x在线播放| 国产国语刺激对白av不卡| 性欧美video另类hd尤物| 成人精品水蜜桃| 深爱激情综合| 欧美美女黄色网| 久久久成人网| 青娱乐精品在线| av电影在线观看不卡| 日韩欧美黄色网址| 亚洲无人区一区| 中文字幕久久久久| 日韩欧美精品在线| se在线电影| 91禁国产网站| 高清久久一区| 日韩精品资源| 影音先锋久久精品| 日本肉体xxxx裸体xxx免费| 不卡一区在线观看| 美女三级黄色片| 色综合激情五月| 国产 日韩 欧美 精品| 深夜福利国产精品| 亚洲一级少妇| 国产精品久久国产三级国电话系列 | 自拍偷拍欧美视频| 91久久精品www人人做人人爽| 国产成人ay| 免费毛片网站在线观看| 久久99热99| 欧洲av一区二区三区| 亚洲成av人在线观看| 国产三区在线播放| 最新69国产成人精品视频免费| 黄色激情在线播放| 懂色中文一区二区三区在线视频| 久久视频精品| 老熟妇仑乱视频一区二区| 99精品视频一区二区| 久久久一二三区| 欧美一区二区成人| 日本中文字幕在线2020| 国产成人精品久久亚洲高清不卡| 久久久精品国产**网站| 草草草视频在线观看| 狠狠网亚洲精品| 美国一级片在线观看| 欧美在线观看18| 国产精品毛片一区二区三区四区| 欧美一区二区三区艳史| 丁香5月婷婷久久| 久久av高潮av| 国产成人鲁色资源国产91色综| www成人啪啪18软件| 欧美在线一二三| 成人动漫在线播放| 国产精品私拍pans大尺度在线| 国产乱码精品一区二区三区四区| 国产真实乱子伦| 久久你懂得1024| 欧美激情黑白配| 亚洲欧美综合另类中字| 免费观看亚洲| 欧美精品人人做人人爱视频| 国产精品日本| av在线网站观看| 欧美在线观看禁18| 日韩欧美小视频| 91亚洲国产成人久久精品网站| 久久久久蜜桃| 四虎国产精品免费| 亚洲影院久久精品| 天天操天天射天天| 日韩av片永久免费网站| 自拍亚洲一区| 亚洲男人天堂视频| 人妻人人澡人人添人人爽| 色婷婷综合久久久中文一区二区| 久久精品色图| 国产精品永久免费| 欧美高清不卡| 中文字幕在线永久| 日韩欧美在线观看视频| av在线1区2区| 亚洲free嫩bbb| 亚洲啪啪91| 久久久久久久毛片| 欧美丰满美乳xxx高潮www| 欧美黑人xx片| 免费看成人片| 狠狠狠色丁香婷婷综合久久五月| 久久久久亚洲天堂| 精品亚洲一区二区三区四区五区 | 91色在线视频| 一区在线视频| 夫妇露脸对白88av| 日韩一区二区高清| 国内激情视频在线观看| 婷婷精品国产一区二区三区日韩 | 中文字幕日韩三级片| 在线观看亚洲一区| av免费网站在线观看| 精品网站在线看| 久久精品99久久久| 国产区在线观看视频| 自拍偷拍亚洲精品| 国产在线播放精品| 小泽玛利亚视频在线观看| 一区二区成人在线视频 | 日本一区二区三区视频视频| 国产三级三级在线观看| 欧美综合在线观看| 中文字幕免费一区二区三区| 黄瓜视频污在线观看| 欧美一区二区三区成人| 免费观看亚洲| 日本xxxxxxxxxx75| 中文字幕在线观看不卡视频|