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

久久久www成人免费毛片麻豆| gogo久久日韩裸体艺术| 久久久精品国产免费观看同学| 97视频免费看| 欲求不满的岳中文字幕| 色资源二区在线视频| 久久久99久久| 91最新在线免费观看| 免费一级黄色大片| 伊人久久大香线蕉无限次| 欧美三级在线看| 在线观看三级网站| 五月婷婷伊人网| 日韩国产在线观看一区| 精品国产拍在线观看| 亚洲国产婷婷香蕉久久久久久99| 97caocao| yy111111少妇影院日韩夜片| 欧美激情 亚洲| av免费不卡| 久久精品视频在线免费观看 | h片在线免费| 国产成人午夜高潮毛片| 青青青国产精品一区二区| 国产福利在线导航| 久久免费视频66| 在线观看成人小视频| 国产青草视频在线观看| 成人高清免费观看mv| 国产91综合网| 国产精品久久视频| 日韩av在线播放观看| 天天操综合网| 日韩国产欧美精品一区二区三区| 在线不卡一区二区三区| 欧美少妇精品| 亚洲免费在线视频| 色涩成人影视在线播放| 天天射天天操天天干| 国产精品69毛片高清亚洲| 国产精品成人免费电影| 日产精品久久久久久久| 在线中文字幕第一区| 国产一区二区三区视频免费| 中文字幕 日本| 欧美a级大片在线| 欧美少妇xxx| 37pao成人国产永久免费视频| 肉体视频在线| 亚洲视频一二三区| 亚洲高清视频一区| 国产最新视频在线| 好吊视频一区二区三区| 国产农村妇女毛片精品久久莱园子 | 揄拍成人国产精品视频| 国产成人无码一区二区在线观看| 欧美日韩黄色| 6080午夜不卡| 日韩欧美高清在线| 国产精品免费一区二区三区四区| 又色又爽又黄无遮挡的免费视频| 亚洲免费综合| 97精品国产91久久久久久| 欧美精品xxxxx| 51精产品一区一区三区| 久久天天躁日日躁| 51精品免费网站| 欧美电影免费播放| 久久精品国产亚洲7777| 91久久久久久久久久久久久久 | 经典三级一区二区| 久久精品国产久精国产爱| 热久久免费视频精品| 久草视频在线观| 亚洲国产1区| 欧美激情va永久在线播放| 精品自拍偷拍视频| 久久久久久亚洲精品不卡4k岛国| 黄色一级片中国| 五月天久久777| 久久精品最新地址| 日韩精品一区二区亚洲av性色 | 免费亚洲一区二区| 欧美69xxxxx| 国产亚洲精品7777| 麻豆久久一区| 色婷婷久久一区二区三区麻豆| 欧美一级片免费播放| 国产在线拍揄自揄拍视频 | 国产亚洲精品久久久久久打不开| 7m精品国产导航在线| 精品国产乱码久久久久久图片| 超级砰砰砰97免费观看最新一期| 亚洲一区二区三区在线免费| 亚洲黄色在线观看| 最近中文字幕在线mv视频在线| 精品国产一区二区三区av片| 日韩一区av在线| 深夜福利影院在线观看| 91久久中文| 日韩美女福利视频| 91无套直看片红桃| 国产91色综合久久免费分享| 欧美大陆一区二区| 欧美日韩在线资源| 午夜视频一区在线观看| 色一情一乱一伦一区二区三区日本| a屁视频一区二区三区四区| 91麻豆精品国产91久久久久| 娇妻高潮浓精白浆xxⅹ| 国产伦一区二区三区| 久久精品夜夜夜夜夜久久| 日韩av电影网| 久久丁香综合五月国产三级网站 | 玖玖玖电影综合影院| 性一交一乱一区二区洋洋av| 91av成人在线| 亚洲熟女乱色一区二区三区久久久| 欧美色999| 午夜久久影院| 欧美激情精品久久久久久大尺度| 亚洲不卡视频在线观看| 国内精品免费**视频| 美女被啪啪一区二区| 免费大片黄在线| 欧美性高跟鞋xxxxhd| 深夜做爰性大片蜜桃| 国产影视一区| 国内揄拍国内精品| 97人妻精品一区二区三区视频 | 国产又黄又大又爽| 久久这里只有精品视频网| 91看片淫黄大片91| julia一区二区三区中文字幕| 精品国产成人系列| 亚洲综合视频网站| 日本在线观看不卡视频| 丁香五月网久久综合| 日本韩国在线视频爽| 日韩欧美精品免费在线| 国产亚洲精品成人a| 91中文字幕精品永久在线| 浅井舞香一区二区| 日韩一级片免费观看| 亚洲精品亚洲人成人网| 天天操天天爱天天爽| 自拍偷拍精品| 欧美在线观看网址综合| 六月婷婷综合网| 亚洲男人电影天堂| 欧美疯狂做受xxxx富婆| 亚洲精品综合在线观看| 国产一区二区三区网| 5252色成人免费视频| 黄色一级大片在线免费看国产一 | 欧美日韩午夜视频| 日本伊人午夜精品| 日本不卡二区高清三区| av高清不卡| 国产丝袜视频一区| 特级西西444www大精品视频免费看| 国产丶欧美丶日本不卡视频| 成年丰满熟妇午夜免费视频| 国产精品日韩精品在线播放| 北条麻妃在线一区二区| 97在线播放免费观看| 亚洲色欲色欲www| 在线黄色免费看| 天天综合一区| 国产综合色香蕉精品| 国产激情视频在线观看| 91精品一区二区三区久久久久久 | 欧美成人a交片免费看| 日韩精品在线免费观看| 9i看片成人免费看片| 久久综合九色综合久久久精品综合| 日韩av资源在线| 大胸美女被爆操| 亚洲在线播放| 免费毛片一区二区三区久久久| 四虎影视1304t| 国产网红在线观看| 欧美白人最猛性xxxxx69交| 国产一卡二卡在线播放| 99热这里都是精品| 麻豆av免费在线| 日韩精品中文字幕第1页| 成人欧美一区二区三区黑人孕妇| 2024最新电影免费在线观看| 亚洲精品在线观看网站| 麻豆精品久久久久久久99蜜桃| 日本一区二区三区在线不卡| 亚洲欧美手机在线| 一区在线视频| 国产一二在线观看| bt欧美亚洲午夜电影天堂| 久久精品国产sm调教网站演员| 日韩a级大片| 日韩美女av在线免费观看| 在线观看h片| 日韩亚洲欧美成人一区| 午夜精品久久久久久久久久久久久蜜桃| 26uuu亚洲综合色欧美| 免费看污污网站| 国产字幕视频一区二区| 欧洲亚洲一区二区| 久久久久九九精品影院| 青青久久av北条麻妃黑人| 超碰在线caoporen| 国产丝袜视频一区| 999免费视频| 欧美小视频在线| 一区二区三区四区五区| 91在线国产福利| 午夜免费福利视频在线观看| 影音先锋国产精品| 亚洲一区二区三区午夜| 久久a爱视频| 91嫩草在线视频| 成人性教育av免费网址| 久久亚洲私人国产精品va| 日本在线丨区| 欧美成人精品3d动漫h| 懂色av蜜臀av粉嫩av分享吧最新章节| 1024成人网| a毛片毛片av永久免费| 国产精品18久久久| 99草草国产熟女视频在线| 精品福利av| 黄频视频在线观看| 亚洲第一二三区| 亚洲最大av网| 美女色狠狠久久| 26uuu亚洲伊人春色| 1stkiss在线漫画| 中文字幕亚洲字幕| 日本成人一区| 亚洲黄色av女优在线观看| 999av视频| 欧美视频三区在线播放| 青青草成人av| 亚洲一区二区四区蜜桃| 欧美做爰爽爽爽爽爽爽| 国产精品网站一区| 午夜精产品一区二区在线观看的| 成人性生交大片免费| 中文字幕剧情在线观看| 蜜臀久久99精品久久久画质超高清 | 免费一级做a爰片久久毛片潮| 高h放荡受浪受bl| 亚洲成精国产精品女| 51精品免费网站| 国产精品的网站| 一本在线免费视频| 国产亚洲成年网址在线观看| 三级电影在线看| 99视频热这里只有精品免费| 在线免费看黄色片| 粉嫩av一区二区三区| 精品无人区乱码1区2区3区在线 | 成人国产1314www色视频| 欧洲午夜精品| 国产主播在线一区| 亚瑟国产精品| 成人黄色av播放免费| 国产精品一区免费在线 | 色香蕉在线观看| 日本精品三区| 亚洲午夜精品福利| 希岛爱理一区二区三区| 亚洲精品偷拍视频| 欧美激情一级片一区二区| 日韩极品视频在线观看 | 国产妇女馒头高清泬20p多| 激情文学一区| 波多野结衣家庭教师在线| 午夜在线视频一区二区区别 | 日韩av网站免费在线| 人人干人人干人人| 久久av老司机精品网站导航| 在线免费观看av网| 高清国产一区二区| 天堂久久久久久| 久久综合给合久久狠狠狠97色69| 日本爱爱爱视频| 中文字幕在线一区二区三区| 福利所第一导航| 香蕉成人伊视频在线观看| 老熟妇仑乱一区二区av| 欧美日韩1234| 黄色美女一级片| 亚洲欧美色婷婷| 日本不卡视频| 九色精品免费永久在线| 中文字幕在线视频久| 精品国产一区二区三区不卡 | 国产精品涩涩涩视频网站| 蜜桃av一区二区三区电影| 午夜福利123| 成人精品高清在线| 中文字幕av久久爽一区| 一区二区三区精品在线| 国产性生活视频| 欧美顶级少妇做爰| 天天躁日日躁狠狠躁喷水| 在线日韩精品视频| 超碰在线视屏| 国产精品日韩专区| 国产精品网在线观看| 日韩欧美一区二区三区久久婷婷| 欧美成熟视频| 国产麻花豆剧传媒精品mv在线| 黄色资源网久久资源365| 波多野结衣有码| 中文字幕一区二区三区视频| 影音先锋亚洲天堂| 日韩亚洲欧美成人一区| 国产三级视频在线看| 久久久久久久久久婷婷| 精品久久福利| 久久爱av电影| 中文字幕日韩一区二区不卡 | 成人激情视频在线播放| 欧美黑人巨大videos精品| 在线播放 亚洲| 葵司免费一区二区三区四区五区| 26uuu国产| 国产精品系列在线| www.国产一区二区| 精品国产91洋老外米糕| 韩国av网站在线| 国产97免费视| 欧美日韩夜夜| 亚洲国产一二三精品无码| 日韩不卡一区二区三区| 日本少妇色视频| 天天爱天天操天天干| 日韩成人动漫在线观看| www.亚洲一区二区| 日本不卡在线视频| 亚洲欧美日本一区| 一区二区在线观看av| 国产一区二区女内射| 一本一本久久a久久精品牛牛影视| 美女高潮视频在线看| 国产成人免费观看| 欧美片第1页综合| 人人爽人人爽av| 国产精品久久久久久福利一牛影视 | 欧美成人猛片aaaaaaa| 日本暖暖在线视频| 国产精品免费看久久久香蕉| 国产探花在线精品一区二区| 国产黄色一级网站| av不卡在线播放| 日韩成人av毛片| 亚洲电影在线看| 牛牛精品在线视频| 成人欧美一区二区三区黑人免费| 欧美 日韩 国产 一区| 超碰在线免费av| 中文字幕日本不卡| av一级黄色片| 欧美风情在线观看| 欧美顶级毛片在线播放| 精品久久久久久久久久中文字幕| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 国产无码精品在线观看| 欧美精品一区在线观看| 77thz桃花论族在线观看| 精品亚洲一区二区三区四区五区高| 在线日本高清免费不卡| 精品精品欲导航| 在线heyzo| 91原创国产| 亚洲国产日韩在线| 欧美与欧洲交xxxx免费观看| 视频一区二区在线播放| 人体精品一二三区| 精品视频久久| www.色就是色.com| 亚洲精品亚洲人成人网在线播放| 囯产精品一品二区三区| 18一19gay欧美视频网站| 蜜桃成人av| 亚洲a级黄色片| 亚洲一二三区视频在线观看| 亚洲 欧美 激情 小说 另类| 国产精品久久久久久av福利| 亚洲v在线看| 玖玖爱在线精品视频| 色诱视频网站一区| 免费av网站在线看| 成人欧美一区二区| 老牛嫩草一区二区三区日本 | 国产精品成人网| 亚洲伦理在线观看| 国产精品白丝jk喷水视频一区| 91精品一区国产高清在线gif| 免费a v网站|