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

在React應用中使用Dexie.js進行離線數據存儲

開發 前端
離線存儲應用程序數據已成為現代 Web 開發中的必要條件。內置的瀏覽器 localStorage 可以用作簡單輕量數據的數據存儲,但是在結構化數據或存儲大量數據方面卻不足。

[[388114]]

原文:https://blog.logrocket.com/dexie-js-indexeddb-react-apps-offline-data-storage/

作者:Ebenezer Don

離線存儲應用程序數據已成為現代 Web 開發中的必要條件。內置的瀏覽器 localStorage 可以用作簡單輕量數據的數據存儲,但是在結構化數據或存儲大量數據方面卻不足。

最重要的是,我們只能將字符串數據存儲在受 XSS 攻擊的 localStorage 中,并且它沒有提供很多查詢數據的功能。

這就是 IndexedDB 的亮點。使用 IndexedDB,我們可以在瀏覽器中創建結構化的數據庫,將幾乎所有內容存儲在這些數據庫中,并對數據執行各種類型的查詢。

在本文中,我們將了解 IndexedDB 的全部含義,以及如何使用 Dexie.js(用于 IndexedDB 的簡約包裝)處理 Web 應用程序中的離線數據存儲。

IndexedDB 如何工作

IndexedDB 是用于瀏覽器的內置非關系數據庫。它使開發人員能夠將數據持久存儲在瀏覽器中,即使在脫機時也可以無縫使用 Web 應用程序。使用 IndexedDB 時,您會經常看到兩個術語:數據庫存儲和對象存儲。讓我們在下面進行探討。

使用 IndexedDB 創建數據庫

IndexedDB 數據庫對每個 Web 應用程序來說都是唯一的。這意味著一個應用程序只能從與自己運行在同一域或子域的 IndexedDB 數據庫中訪問數據。數據庫是容納對象存儲的地方,而對象存儲又包含存儲的數據。要使用 IndexedDB 數據庫,我們需要打開(或連接到)它們:

  1. const initializeDb = indexedDB.open
  2.   "name_of_database"
  3.   version 
  4. ); 

indexedDb.open() 方法中的 name_of_database 參數將用作正在創建的數據庫的名稱,而 version 參數是一個代表數據庫版本的數字。

在 IndexedDB 中,我們使用對象存儲來構建數據庫的結構,并且每當要更新數據庫結構時,都需要將版本升級到更高的值。這意味著,如果我們從版本 1 開始,則下次要更新數據庫的結構時,我們需要將 indexedDb.open() 方法中的版本更改為 2 或更高版本。

使用 IndexedDB 創建對象存儲

對象存儲類似于關系數據庫(如 PostgreSQL)中的表和文檔數據庫(如 MongoDB)中的集合。要在 IndexedDB 中創建對象存儲,我們需要從之前聲明的 initializeDb 變量中調用 onupgradeneeded() 方法:

  1. initializeDb.onupgradeneeded = () => { 
  2.   const database = initializeDb.result; 
  3.   database.createObjectStore("name_of_object_store", { 
  4.     autoIncrement: true
  5.   }); 
  6. }; 

在上面的代碼塊中,我們從 initializeDb.result 屬性獲取數據庫,然后使用其 createObjectStore() 方法創建對象存儲。第二個參數 {autoIncrement:true} 告訴 IndexedDB 自動提供/增加對象存儲中項目的 ID。

我省略了諸如事務和游標之類的其他術語,因為使用低級 IndexedDB API 需要進行大量工作。這就是為什么我們需要 Dexie.js,它是 IndexedDB 的簡約包裝。讓我們看看 Dexie 如何簡化創建數據庫,對象存儲,存儲數據以及從數據庫查詢數據的整個過程。

使用 Dexie 離線存儲數據

使用 Dexie,創建 IndexedDB 數據庫和對象存儲非常容易:

  1. const db = new Dexie("exampleDatabase"); 
  2. db.version(1).stores({ 
  3.   name_of_object_store: "++id, name, price"
  4.   name_of_another_object_store: "++id, title"
  5. }); 

在上面的代碼塊中,我們創建了一個名為 exampleDatabase 的新數據庫,并將其作為值分配給 db 變量。我們使用 db.version(version_number).stores() 方法為數據庫創建對象存儲。每個對象存儲的值代表了它的結構。例如,當在第一個對象存儲中存儲數據時,我們需要提供一個具有屬性 name 和 price 的對象。++id 選項的作用就像我們在創建對象存儲區時使用的 {autoIncrement:true} 參數一樣。

請注意,在我們的應用程序中使用 dexie 包之前,我們需要安裝并導入它。當我們開始構建我們的演示項目時,我們將看到如何做到這一點。

我們將要建立的

對于我們的演示項目,我們將使用 Dexie.js 和 React 構建一個市場列表應用程序。我們的用戶將能夠在市場列表中添加他們打算購買的商品,刪除這些商品或將其標記為已購買。

我們將看到如何使用 Dexie useLiveQuery hook 來監視 IndexedDB 數據庫中的更改以及在數據庫更新時重新呈現 React 組件。這是我們的應用程序的外觀:

設置我們的應用

首先,我們將使用為應用程序的結構和設計創建的 GitHub 模板。這里有一個模板的鏈接。點擊**Use this template(使用此模板)**按鈕,就會用現有的模板為你創建一個新的資源庫,然后你就可以克隆和使用這個模板。

或者,在計算機上安裝了GitHub CLI的情況下,您可以運行以下命令從市場列表 GitHub 模板創建名為 market-list-app 的存儲庫:

  1. gh repo create market-list-app --template ebenezerdon/market-list-template 

完成此操作后,您可以繼續在代碼編輯器中克隆并打開您的新應用程序。使用終端在應用程序目錄中運行以下命令應安裝 npm 依賴項并啟動新應用程序:

  1. npm install && npm start 

導航到成功消息中的本地 URL(通常為http://localhost:3000)時,您應該能夠看到新的React應用程序。您的新應用應如下所示:

當您打開 ./src/App.js 文件時,您會注意到我們的應用程序組件僅包含市場列表應用程序的 JSX 代碼。我們正在使用Materialize 框架中的類進行樣式設置,并將其 CDN 鏈接包含在 ./public/index.html 文件中。接下來,我們將看到如何使用 Dexie 創建和管理數據。

用 Dexie 創建我們的數據庫

要在我們的 React 應用程序中使用 Dexie.js 進行離線存儲,我們將從在終端中運行以下命令開始,以安裝 dexie 和 dexie-react-hooks 軟件包:

  1. npm i -s dexie dexie-react-hooks 

我們將使用 dexie-react-hooks 包中的 useLiveQuery hook 來監視更改,并在對 IndexedDB 數據庫進行更新時重新渲染我們的 React 組件。

讓我們將以下導入語句添加到我們的 ./src/App.js 文件中。這將導入 Dexie 和 useLiveQuery hook:

  1. import Dexie from "dexie"
  2. import { useLiveQuery } from "dexie-react-hooks"

接下來,我們將創建一個名為 MarketList 的新數據庫,然后聲明我們的對象存儲 items:

  1. const db = new Dexie("MarketList"); 
  2. db.version(1).stores({ 
  3.   items: "++id,name,price,itemHasBeenPurchased"
  4. }); 

我們的 items 對象存儲將期待一個具有屬性name、price和 itemHasBeenPurchased 的對象,而 id 將由 Dexie 提供。在將新數據添加到對象存儲中時,我們將為 itemHasBeenPurchased 屬性使用默認布爾值 false,然后在我們從市場清單中購買商品時將其更新為 true。

Dexie React hook

讓我們創建一個變量來存儲我們所有的項目。我們將使用 useLiveQuery 鉤子從 items 對象存儲中獲取數據,并觀察其中的變化,這樣當 items 對象存儲有更新時,我們的 allItems 變量將被更新,我們的組件將用新的數據重新渲染。我們將在 App 組件內部進行:

  1. const App = () => { 
  2.   const allItems = useLiveQuery(() => db.items.toArray(), []); 
  3.   if (!allItems) return null 
  4.   ... 

在上面的代碼塊中,我們創建了一個名為 allItems 的變量,并將 useLiveQuery 鉤子作為其值。useLiveQuery 鉤子的語法類似于 React 的 useEffect 鉤子,它期望一個函數及其依賴項數組作為參數。我們的函數參數返回數據庫查詢。

在這里,我們以數組格式獲取 items 對象存儲中的所有數據。在下一行中,我們使用一個條件來告訴我們的組件,如果 allItems 變量是 undefined,則意味著查詢仍在加載中。

將 items 添加到我們的數據庫

仍在 App 組件中,讓我們創建一個名為 addItemToDb 的函數,我們將使用該函數向數據庫中添加項目。每當我們點擊“ADD ITEM(添加項目)”按鈕時,我們都會調用此函數。請記住,每次更新數據庫時,我們的組件都會重新渲染。

  1. ... 
  2. const addItemToDb = async event => { 
  3.     event.preventDefault() 
  4.     const name = document.querySelector('.item-name').value 
  5.     const price = document.querySelector('.item-price').value 
  6.     await db.items.add({ 
  7.       name
  8.       price: Number(price), 
  9.       itemHasBeenPurchased: false 
  10.     }) 
  11.   } 
  12. ... 

在 addItemToDb 函數中,我們從表單輸入字段中獲取商品名稱和價格值,然后使用 db.[name_of_object_store].add 方法將新商品數據添加到商品對象存儲中。我們還將 itemHasBeenPurchased 屬性的默認值設置為 false。

從我們的數據庫中刪除 items

現在我們有了 addItemToDb 函數,讓我們創建一個名為 removeItemFromDb 的函數以從我們的商品對象存儲中刪除數據:

  1. ... 
  2. const removeItemFromDb = async id => { 
  3.   await db.items.delete(id) 
  4. ... 

更新我們數據庫中的項目

接下來,我們將創建一個名為 markAsPurchased 的函數,用于將商品標記為已購買。我們的函數在調用時,會將物品的主鍵作為第一個參數——在本例中是 id,它將使用這個主鍵來查詢我們想要標記為購買的物品的數據庫。取得商品后,它將其 markAsPurchased 屬性更新為 true:

  1. ... 
  2. const markAsPurchased = async (id, event) => { 
  3.   if (event.target.checked) { 
  4.     await db.items.update(id, {itemHasBeenPurchased: true}) 
  5.   } 
  6.   else { 
  7.     await db.items.update(id, {itemHasBeenPurchased: false}) 
  8.   } 
  9. ... 

在 markAsPurchased 函數中,我們使用 event 參數來獲取用戶單擊的特定輸入元素。如果選中其值,我們將itemHasBeenPurchased 屬性更新為 true,否則更新為 false。db.[name_of_object_store] .update() 方法期望該項目的主鍵作為其第一個參數,而新對象數據作為其第二個參數。

下面是我們的 App 組件在這個階段應該是什么樣子。

  1. ... 
  2. const App = () => { 
  3.   const allItems = useLiveQuery(() => db.items.toArray(), []); 
  4.   if (!allItems) return null 
  5.  
  6.   const addItemToDb = async event => { 
  7.     event.preventDefault() 
  8.     const name = document.querySelector('.item-name').value 
  9.     const price = document.querySelector('.item-price').value 
  10.     await db.items.add({ name, price, itemHasBeenPurchased: false }) 
  11.   } 
  12.  
  13.   const removeItemFromDb = async id => { 
  14.     await db.items.delete(id) 
  15.   } 
  16.  
  17.   const markAsPurchased = async (id, event) => { 
  18.     if (event.target.checked) { 
  19.       await db.items.update(id, {itemHasBeenPurchased: true}) 
  20.     } 
  21.     else { 
  22.       await db.items.update(id, {itemHasBeenPurchased: false}) 
  23.     } 
  24.   } 
  25.   ... 

現在,我們創建一個名為 itemData 的變量,以容納我們所有商品數據的 JSX 代碼:

  1. ... 
  2. const itemData = allItems.map(({ id, name, price, itemHasBeenPurchased }) => ( 
  3.   <div className="row" key={id}> 
  4.     <p className="col s5"
  5.       <label> 
  6.         <input 
  7.           type="checkbox" 
  8.           checked={itemHasBeenPurchased} 
  9.           onChange={event => markAsPurchased(id, event)} 
  10.         /> 
  11.         <span className="black-text">{name}</span> 
  12.       </label> 
  13.     </p> 
  14.     <p className="col s5">${price}</p> 
  15.     <i onClick={() => removeItemFromDb(id)} className="col s2 material-icons delete-button"
  16.       delete 
  17.     </i> 
  18.   </div> 
  19. )) 
  20. ... 

在 itemData 變量中,我們映射了 allItems 數據數組中的所有項目,然后從每個 item 對象獲取屬性 id、name、price 和 itemHasBeenPurchased。然后,我們繼續進行操作,并用數據庫中的新動態值替換了以前的靜態數據。

注意,我們還使用了 markAsPurchased 和 removeItemFromDb 方法作為相應按鈕的單擊事件偵聽器。我們將在下一個代碼塊中將 addItemToDb 方法添加到表單的 onSubmit 事件中。

準備好 itemData 后,讓我們將 App 組件的 return 語句更新為以下 JSX 代碼:

  1. ... 
  2. return ( 
  3.   <div className="container"
  4.     <h3 className="green-text center-align">Market List App</h3> 
  5.     <form className="add-item-form" onSubmit={event => addItemToDb(event)} > 
  6.       <input type="text" className="item-name" placeholder="Name of item" required/> 
  7.       <input type="number" step=".01" className="item-price" placeholder="Price in USD" required/> 
  8.       <button type="submit" className="waves-effect waves-light btn right">Add item</button> 
  9.     </form> 
  10.     {allItems.length > 0 && 
  11.       <div className="card white darken-1"
  12.         <div className="card-content"
  13.           <form action="#"
  14.             { itemData } 
  15.           </form> 
  16.         </div> 
  17.       </div> 
  18.     } 
  19.   </div> 
  20. ... 

在 return 語句中,我們已將 itemData 變量添加到我們的項目列表中(items list)。我們還使用 addItemToDb 方法作為 add-item-form 的 onsubmit 值。

為了測試我們的應用程序,我們可以返回到我們先前打開的 React 網頁。請記住,您的 React 應用必須正在運行,如果不是,請在終端上運行命令 npm start。您的應用應該能夠像下面的演示一樣運行:

我們還可以使用條件用 Dexie 查詢我們的 IndexedDB 數據庫。例如,如果我們要獲取價格高于 10 美元的所有商品,則可以執行以下操作:

  1. const items = await db.friends 
  2.   .where("price"
  3.   .above(10) 
  4.   .toArray(); 

您可以在Dexie 文檔中查看其他查詢方法。

結束語和源碼

在本文中,我們學習了如何使用 IndexedDB 進行離線存儲以及 Dexie.js 如何簡化該過程。我們還了解了如何使用 Dexie useLiveQuery 鉤子來監視更改并在每次更新數據庫時重新渲染 React 組件。

由于 IndexedDB 是瀏覽器原生的,從數據庫中查詢和檢索數據比每次需要在應用中處理數據時都要發送服務器端 API 請求要快得多,而且我們幾乎可以在 IndexedDB 數據庫中存儲任何東西。

過去使用 IndexedDB 可能對瀏覽器的支持是一個大問題,但是現在所有主流瀏覽器都支持它。在 Web 應用中使用 IndexedDB 進行離線存儲的諸多優勢大于劣勢,將 Dexie.js 與 IndexedDB 一起使用,使得 Web 開發變得前所未有的有趣。

這是我們的演示應用程序的GitHub庫的鏈接。

本文轉載自微信公眾號「前端全棧開發者」,可以通過以下二維碼關注。轉載本文請聯系前端全棧開發者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發者
相關推薦

2023-05-24 16:41:41

React前端

2024-12-11 08:41:18

2024-11-26 08:30:33

2024-10-24 19:25:48

2011-05-27 08:48:13

Android HTML

2017-07-14 10:10:08

Vue.jsMixin

2023-10-28 16:22:21

Go接口

2021-11-29 22:59:34

Go Dockertest集成

2024-02-07 11:44:20

NestJSRxJS異步編程

2011-12-08 10:24:53

JavaNIO

2021-02-25 11:19:37

谷歌Android開發者

2018-06-11 12:53:53

LinuxStratis本地存儲

2024-11-25 07:00:00

箭頭函數JavaScriptReact

2022-11-30 15:01:11

React技巧代碼

2022-06-10 08:01:17

ReduxReact

2023-07-28 13:55:40

便捷選項組件

2019-12-12 13:50:27

strace追蹤系統調用Linux

2023-12-22 09:11:45

AndroidNFC移動開發

2009-09-22 12:17:59

ibmdwLotus

2021-05-06 08:04:37

存儲StratisCentos 8
點贊
收藏

51CTO技術棧公眾號

亚洲在线观看| 免费成人网www| 一区二区三区四区中文字幕| 99影视tv| 波多野结衣高清视频| 国产精品7m凸凹视频分类| 日韩欧美中文一区| 凹凸日日摸日日碰夜夜爽1| 免费在线看黄色| yourporn久久国产精品| 日韩免费观看av| 国产va在线播放| 亚洲三级网址| 日韩欧美一区二区久久婷婷| 久久精品99国产| 韩国av网站在线| 久久网这里都是精品| 91丨九色丨国产在线| 国产成人在线免费视频| 日韩欧美二区| 国产丝袜一区二区| 久久无码人妻一区二区三区| 日韩美女在线看免费观看| 亚洲女人小视频在线观看| 欧美主播一区二区三区美女 久久精品人| 亚洲一区精品在线观看| 亚洲欧美日韩国产综合精品二区| 久久综合伊人77777| 中文字幕丰满乱子伦无码专区| 国产专区精品| 欧美日韩一区二区三区在线| 黄色动漫网站入口| caoprom在线| 亚洲精品欧美二区三区中文字幕| 鲁鲁狠狠狠7777一区二区| 精品人妻av一区二区三区| 麻豆免费精品视频| 日本久久亚洲电影| 国产精品第9页| 欧美激情综合| 蜜臀久久99精品久久久无需会员| 91禁男男在线观看| 成人av动漫在线观看| 日韩精品极品在线观看| 蜜臀av粉嫩av懂色av| 日韩成人在线观看视频| 777午夜精品视频在线播放| 色悠悠久久综合网| 亚洲mmav| 在线免费不卡电影| 色一情一乱一伦一区二区三区日本| 国模精品视频| 欧美视频免费在线观看| 欧美视频免费看欧美视频| 成人video亚洲精品| 自拍偷自拍亚洲精品播放| 亚洲在线视频一区二区| 天天在线视频色| 中文字幕在线观看不卡视频| 亚洲三区四区| 成人免费网址| 亚洲精品高清在线| 国产成a人亚洲精v品在线观看| 岛国成人毛片| 依依成人精品视频| 成人在线国产视频| 热色播在线视频| 色综合天天综合网天天狠天天| 国产二区视频在线播放| 中文在线а√在线8| 欧美性猛交丰臀xxxxx网站| 成熟老妇女视频| 91p九色成人| 678五月天丁香亚洲综合网| 久久精品一二三四| 加勒比色综合久久久久久久久| 亚洲福利视频网| 在线免费看黄视频| 97在线精品| 欧美精品久久久久a| 91香蕉在线视频| 日韩精品乱码免费| 91在线播放国产| 全部免费毛片在线播放一个| 久久亚洲影视婷婷| 熟妇熟女乱妇乱女网站| 精精国产xxxx视频在线野外| 色8久久精品久久久久久蜜| 日本不卡一区在线| 99精品中文字幕在线不卡| 亚洲国产古装精品网站| 影音先锋男人在线| 国产综合自拍| 国产精品成av人在线视午夜片| 亚洲综合精品国产一区二区三区| 国产成人在线电影| 欧洲精品码一区二区三区免费看| 欧美精品hd| 欧美日韩国产丝袜另类| 狠狠操狠狠干视频| 国产精品玖玖玖在线资源| 中文字幕精品久久久久| 一区二区三区免费高清视频| 日韩高清不卡在线| 国产精品久久久久久久久久久久午夜片 | 777777777亚洲妇女| 怡红院成永久免费人全部视频| 国产成人啪午夜精品网站男同| 麻豆av一区二区| 伊人精品影院| 91国产免费看| 波多野结衣加勒比| 久久久久久久久久久妇女| 欧美性视频在线| 精品国产一级片| 中文字幕国产精品一区二区| 日本中文字幕网址| 日韩最新av| 中文字幕日韩av电影| 日韩欧美大片在线观看| 国产一区二区三区免费看| 日本不卡一区二区三区在线观看| 毛片在线导航| 日韩视频免费观看高清在线视频| 九九九视频在线观看| 久久aⅴ国产紧身牛仔裤| 成人av片网址| 超碰在线最新| 欧美精品v国产精品v日韩精品| 这里只有久久精品| 午夜亚洲性色福利视频| 国内成+人亚洲| 国产精品186在线观看在线播放| 337p亚洲精品色噜噜噜| 国产传媒视频在线| 三级久久三级久久久| 另类欧美小说| 玛雅亚洲电影| 亚洲视频国产视频| 三级视频在线观看| 91亚洲午夜精品久久久久久| www.av91| 加勒比中文字幕精品| 高清欧美性猛交xxxx| 亚洲精品福利网站| 亚洲一区欧美一区| 亚洲精品第二页| 激情欧美一区| 精品久久久久久一区| а√天堂8资源在线| 亚洲国语精品自产拍在线观看| 国产在线视频二区| www.亚洲国产| 欧美aⅴ在线观看| 九九在线精品| 国产精品视频永久免费播放| 91这里只有精品| 欧美日韩国产精品自在自线| 国产在线综合视频| 美女视频第一区二区三区免费观看网站 | 国产黄a三级三级三级| 亚洲九九爱视频| 日批视频免费看| 国产偷自视频区视频一区二区| 久久成人资源| 国产私拍福利精品视频二区| 性感美女视频一二三| 一本大道久久a久久综合婷婷 | 亚洲欧洲精品一区二区精品久久久 | 99热这里只有精品4| 精品一区二区三区久久| 日韩一二区视频| 啪啪激情综合网| 国产精品美女av| 黄色av电影在线播放| 亚洲国产精品福利| 久久久久久亚洲av无码专区| 国产精品国产三级国产有无不卡| 国产一级片中文字幕| 亚洲人成人一区二区三区| 日本高清一区| 免费观看性欧美大片无片| 91国产精品视频在线| 在线观看国产原创自拍视频| 欧美va亚洲va在线观看蝴蝶网| 久久露脸国语精品国产91| 国产精品午夜久久| 蜜桃视频无码区在线观看| 久久激情一区| 裸体裸乳免费看| 免费av一区| 91久久极品少妇xxxxⅹ软件| 欧美日韩大片| 九色成人免费视频| 高清在线观看av| 精品久久国产字幕高潮| 中国女人真人一级毛片| 亚洲国产日日夜夜| 国产18无套直看片| 成人午夜在线视频| 亚洲怡红院在线| 亚洲在线观看| av在线免费观看国产| 精品freesex老太交| 成人三级在线| av在线亚洲一区| 日本一本a高清免费不卡| 色爱综合区网| 中文欧美在线视频| 亚洲欧美丝袜中文综合| 日韩一区二区三区在线观看| 黄色一级片免费在线观看| 一级中文字幕一区二区| 久久一级免费视频| 国产亚洲女人久久久久毛片| 国产av一区二区三区传媒| 久久超级碰视频| mm1313亚洲国产精品无码试看| 在线日韩视频| 国产 欧美 日韩 一区| 国产精品久久久久久久| 欧洲亚洲一区| 香蕉人人精品| 久久本道综合色狠狠五月| 第四色中文综合网| 亚洲精品免费网站| 只有精品亚洲| 国产乱人伦真实精品视频| 欧美特大特白屁股xxxx| 91成人在线视频| 白浆视频在线观看| 欧美激情一级二级| 日本孕妇大胆孕交无码| 九九精品在线视频| 性xxxfreexxxx性欧美| 日韩视频精品在线| 日本www在线观看视频| 中文字幕国产精品| 在线免费观看黄| 日韩中文在线视频| 色的视频在线免费看| 中文字幕视频一区二区在线有码| 国产精品一级伦理| 一区二区国产精品视频| 第九色区av在线| 在线日韩av观看| av午夜在线| 色悠悠久久88| 高潮毛片在线观看| 久久99久久亚洲国产| 日本伦理一区二区| 午夜精品蜜臀一区二区三区免费| 2018av在线| 欧美中文在线免费| 日韩精品专区| 国产精品永久免费视频| 日韩城人网站| 91丨九色丨国产| 高清日韩中文字幕| 久久久7777| 精品国产欧美日韩| 日韩第一页在线观看| 中文字幕一区二区三区久久网站| 狠狠精品干练久久久无码中文字幕 | 亚洲天堂网在线观看| 成人高清网站| 久久影院资源网| 老色鬼在线视频| 国产精品久久久久福利| 成人动漫视频在线观看| 波多野结衣一区二区三区在线观看 | 欧美乱妇23p| 亚洲a视频在线观看| 日韩精品中文字| 蜜桃视频在线观看www社区| 欧美肥婆姓交大片| 欧美7777| 成人中文字幕在线观看| 麻豆成人入口| 先锋影音日韩| 伊人精品视频| 国产区二区三区| 国产成人99久久亚洲综合精品| 三叶草欧洲码在线| 亚洲欧洲色图综合| 日本高清www免费视频| 欧美系列亚洲系列| 国产成人手机在线| 亚洲最大在线视频| 麻豆蜜桃在线| 国产美女久久精品香蕉69| 在线视频亚洲欧美中文| 午夜午夜精品一区二区三区文| 午夜精品影院| 亚洲欧美另类动漫| 成人福利视频在线看| 粉嫩精品久久99综合一区| 亚洲一区二区美女| 中文字幕日韩国产| 精品视频偷偷看在线观看| 国产三区视频在线观看| 日韩av免费在线| 亚洲亚洲一区二区三区| 少妇特黄a一区二区三区| 99人久久精品视频最新地址| 国产aⅴ爽av久久久久| 久久一日本道色综合| 九九九在线视频| 在线亚洲免费视频| 无码国产色欲xxxx视频| 久久综合国产精品台湾中文娱乐网| 成人影院av| 国产精品一区二区欧美黑人喷潮水 | 九九热精品在线观看| 欧美色精品天天在线观看视频| 丰满人妻一区二区三区免费视频| 日韩中文字幕免费看| 中文字幕不卡三区视频| 成人动漫视频在线观看完整版| 日韩久久久久| 成人精品小视频| 97aⅴ精品视频一二三区| 久久国产在线观看| 6080午夜不卡| 免费高清完整在线观看| 欧洲s码亚洲m码精品一区| 成人知道污网站| 91亚洲精品国产| 国产不卡一区视频| 国产性xxxx| 欧美一区三区二区| 黄av在线播放| 亚洲综合最新在线| 久久久国产精品| 亚洲欧美日本一区二区| 国产精品超碰97尤物18| 亚洲一区二区激情| www.xxxx欧美| 四虎国产精品成人免费影视| 亚洲精品美女久久7777777| 日韩在线一二三区| 摸摸摸bbb毛毛毛片| 在线欧美日韩国产| 高h视频在线| 国产精品中文字幕在线观看| 国产探花一区二区| 男女无套免费视频网站动漫| 国产片一区二区| 中文天堂在线播放| 日韩在线观看免费av| 国产美女视频一区二区| 国内精品国产三级国产99| 国产电影一区二区三区| 麻豆亚洲av成人无码久久精品| 日韩免费高清视频| 国产乱码在线| 欧美xxxx黑人又粗又长精品| 久久精品一本| 91ts人妖另类精品系列| 在线电影一区二区三区| 污视频免费在线观看| 国产激情一区二区三区在线观看| 99在线观看免费视频精品观看| 女尊高h男高潮呻吟| 色婷婷一区二区三区四区| 91网在线播放| 91网免费观看| 一区二区三区国产盗摄 | 精品免费在线| 爽爽爽在线观看| 亚洲成av人影院在线观看网| 天天色综合久久| 国产精品啪视频| 欧美成人国产| 变态另类丨国产精品| 欧美色欧美亚洲另类二区| 成人黄色在线电影| 久久精品国产精品青草色艺| 免费的成人av| 久久久久久久久久久97| 亚洲欧美一区二区三区久久| 久久精品国产福利| 欧美日韩福利在线| 欧美国产乱子伦| 不卡视频免费在线观看| 日本亚洲欧洲色| 欧美在线视屏| 久久美女免费视频| 日韩精品中午字幕| av在线日韩| 久草免费福利在线| 亚洲国产精品成人综合| 后进极品白嫩翘臀在线视频| 日本久久91av| 激情综合在线| 国产精品69久久久久孕妇欧美| 精品久久五月天| 开心久久婷婷综合中文字幕| 国产 日韩 亚洲 欧美| 中文字幕日韩一区二区|