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

離開頁面前,如何防止表單數據丟失?

開發 前端
本文將演示如何實現一個 FormPrompt 組件,當用戶嘗試離開具有未保存更改的頁面時,會發出警報,從而有效地提高整體用戶體驗。

本文介紹了如何實現一個FormPrompt組件,在用戶嘗試離開具有未保存更改的頁面時發出警告。文章討論了如何使用純JavaScript和beforeunload事件處理這類情況,以及使用React Router v5中的Prompt組件和useBeforeUnload以及unstable等React特定解決方案。向用戶添加一個確認對話框,詢問他們在具有未保存表單更改的情況下是否確認重定向是一種良好的用戶體驗實踐。通過顯示此提示,用戶將意識到他們有未保存的更改,并允許在繼續重定向之前保存或丟棄它們的工作。

下面是正文:

在今天的數字化環境中,為涉及表單提交的 Web 應用程序提供最佳用戶體驗非常重要。用戶常見的一個煩惱來源是由于意外離開頁面而丟失未保存的更改。

本文將演示如何實現一個 FormPrompt 組件,當用戶嘗試離開具有未保存更改的頁面時,會發出警報,從而有效地提高整體用戶體驗。我們將討論如何使用純 JavaScript 處理此類情況,使用 React Router v5 中的 Prompt 組件以及在 React Router v6 中使用 useBeforeUnload 和 unstable_useBlocker 鉤子的特定解決方案。

應用程序的最終版本可以在 CodeSandbox 上進行測試,代碼可在 GitHub 上獲得。

使用 beforeunload 事件檢測頁面離開

我們創建 FormPrompt 組件,在其中添加 beforeunload 事件的監聽器。此事件將在用戶離開頁面之前觸發。通過在事件上調用 preventDefault 方法,我們可以觸發瀏覽器的確認對話框。僅當表單具有未保存的更改(由 hasUnsavedChanges 屬性指示)時,才會激活此對話框。

// FormPrompt.js

import { useEffect } from "react";

export const FormPrompt = ({ hasUnsavedChanges }) => {
  useEffect(() => {
    const onBeforeUnload = (e) => {
      if (hasUnsavedChanges) {
        e.preventDefault();
        e.returnValue = "";
      }
    };
    window.addEventListener("beforeunload", onBeforeUnload);
    return () => {
      window.removeEventListener("beforeunload", onBeforeUnload);
    };
  }, [hasUnsavedChanges]);
};

作為示例,我們將在表單的 Contact 步驟中使用此組件:

// Steps/Contact.js

import { forwardRef } from "react";
import { useForm } from "react-hook-form";
import { useAppState } from "../state";
import { Button, Field, Form, Input } from "../Forms";
import { FormPrompt } from "../FormPrompt";

export const Contact = forwardRef((props, ref) => {
  const [state, setState] = useAppState();
  const {
    handleSubmit,
    register,
    formState: { isDirty },
  } = useForm({
    defaultValues: state,
    mode: "onSubmit",
  });

  const saveData = (data) => {
    setState({ ...state, ...data });
  };

  return (
    <Form onSubmit={handleSubmit(saveData)} nextStep={"/education"}>
      <FormPrompt hasUnsavedChanges={isDirty} />
      <fieldset>
        <legend>Contact</legend>
        <Field label="First name">
          <Input {...register("firstName")} id="first-name" />
        </Field>
        <Field label="Last name">
          <Input {...register("lastName")} id="last-name" />
        </Field>
        <Field label="Email">
          <Input {...register("email")} type="email" id="email" />
        </Field>
        <Field label="Password">
          <Input {...register("password")} type="password" id="password" />
        </Field>
        <Button ref={ref}>Next {">"}</Button>
      </fieldset>
    </Form>
  );
});

當在表單字段中輸入數據并在保存更改之前嘗試重新加載頁面或導航到外部URL時,瀏覽器將顯示確認對話框。

使用React Router 5防止頁面導航

這個組件已經足夠好用于我們的應用程序,因為它的所有頁面都是表單的一部分。然而,在實際情況下,這并不總是如此。為了使我們的示例更具代表性,我們添加一個名為 Home 的新路由,它將重定向到表單之外。 Home 組件很簡單,只顯示一個主頁問候語。

// Home.js

export const Home = () => {
  return <div>Welcome to the home page!</div>;
};

我們還需要對 App 組件進行一些調整,以適應這條新路由。

// App.js

import { useRef } from "react";
import {
  BrowserRouter as Router,
  Routes,
  Route,
  NavLink,
} from "react-router-dom";
import { AppProvider } from "./state";
import { Contact } from "./Steps/Contact";
import { Education } from "./Steps/Education";
import { About } from "./Steps/About";
import { Confirm } from "./Steps/Confirm";
import { Stepper } from "./Steps/Stepper";
import { Home } from "./Home";

export const App = () => {
  const buttonRef = useRef();

  const onStepChange = () => {
    buttonRef.current?.click();
  };

  return (
    <div className="App">
      <AppProvider>
        <Router>
          <div className="nav-wrapper">
            <NavLink to={"/"}>Home</NavLink>
            <Stepper onStepChange={onStepChange} />
          </div>
          <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/contact" element={<Contact ref={buttonRef} />} />
            <Route path="/education" element={<Education ref={buttonRef} />} />
            <Route path="/about" element={<About ref={buttonRef} />} />
            <Route path="/confirm" element={<Confirm />} />
          </Routes>
        </Router>
      </AppProvider>
    </div>
  );
};

我們可以看到當我們在表格中輸入信息并導航到主頁時,輸入的數據不會被保存,也不會出現任何確認對話框。這是因為導航由React Router處理,不會觸發 beforeunload 事件,使瀏覽器API在這種情況下無效。幸運的是,React Router v5提供了 Prompt 組件,以在離開未保存更改的頁面之前警告用戶。該組件接受兩個props: when 和 message 。 when 屬性是一個布爾值,用于確定是否應該顯示提示,而 message 屬性表示向用戶顯示的文本。

使用 Prompt 時,導航到主頁路由時行為正確,但是當用戶輸入表單數據并進入下一步時,確認對話框也會出現。這是不希望的,因為我們在導航到下一步時保存表單數據。

為了解決這個問題,我們需要驗證下一個 URL 是否是表單步驟之一,然后再檢查未保存的更改。可以使用 message 屬性來實現這一點,它也可以是一個函數。該函數的第一個參數是下一個位置。如果函數返回 true ,則允許轉換到下一個 URL;否則,它可以返回一個字符串來顯示提示。

// FormPrompt.js

import { useEffect } from "react";
import { Prompt } from "react-router-dom";

const stepLinks = ["/contact", "/education", "/about", "/confirm"];

export const FormPrompt = ({ hasUnsavedChanges }) => {
  useEffect(() => {
    const onBeforeUnload = (e) => {
      if (hasUnsavedChanges) {
        e.preventDefault();
        e.returnValue = "";
      }
    };
    window.addEventListener("beforeunload", onBeforeUnload);

    return () => {
      window.removeEventListener("beforeunload", onBeforeUnload);
    };
  }, [hasUnsavedChanges]);

  const onLocationChange = (location) => {
    if (stepLinks.includes(location.pathname)) {
      return true;
    }
    return "You have unsaved changes, are you sure you want to leave?";
  };

  return <Prompt when={hasUnsavedChanges} message={onLocationChange} />;
};

通過這些更改,我們可以安全地在表單步驟之間導航,并在嘗試離開未保存更改的表單時收到警告。

使用 React Router 6 防止頁面導航

件已被移除,而 unstable_usePrompt 鉤子在 6.7.0 版本中被添加。正如其名稱所示,該鉤子的實現可能會發生變化,尚未記錄文檔。但是,它應該適用于我們的使用情況。

我們可以使用這個鉤子來復制版本5中 Prompt 組件的行為,但首先,我們需要調整我們的 App 組件以使用新的數據路由器,因為它們是 unstable_usePrompt 鉤子工作所必需的。

// App.js

import { useRef } from "react";
import { createBrowserRouter, RouterProvider, Outlet } from "react-router-dom";
import { AppProvider } from "./state";
import { Contact } from "./Steps/Contact";
import { Education } from "./Steps/Education";
import { About } from "./Steps/About";
import { Confirm } from "./Steps/Confirm";
import { Stepper } from "./Steps/Stepper";
import { Home } from "./Home";

export const App = () => {
  const buttonRef = useRef();

  const onStepChange = () => {
    buttonRef.current?.click();
  };

  const router = createBrowserRouter([
    {
      element: (
        <>
          <Stepper onStepChange={onStepChange} />
          <Outlet />
        </>
      ),
      children: [
        {
          path: "/",
          element: <Home />,
        },
        {
          path: "/contact",
          element: <Contact ref={buttonRef} />,
        },
        { path: "/education", element: <Education ref={buttonRef} /> },
        { path: "/about", element: <About ref={buttonRef} /> },
        { path: "/confirm", element: <Confirm /> },
      ],
    },
  ]);

  return (
    <div className="App">
      <AppProvider>
        <RouterProvider router={router} />
      </AppProvider>
    </div>
  );
};

我們使用 createBrowserRouter 函數來創建路由器。請注意, Stepper 沒有單獨的路徑,所有其他路由都是它的子路由。它作為布局組件,在每個頁面上呈現。每個頁面的內容顯示在特殊的 Outlet 組件的位置。為了簡化 App 邏輯,我們還將主頁導航鏈接移動到 Stepper 中。

設置完成后,我們現在可以實現重定向阻止功能。我們首先通過在 FormPrompt 中使用在6.6版本中引入的 useBeforeUnload 鉤子來替換 onbeforeunload 邏輯。

// FormPrompt.js

import { useEffect, useCallback, useRef } from "react";
import { useBeforeUnload } from "react-router-dom";

const stepLinks = ["/contact", "/education", "/about", "/confirm"];

export const FormPrompt = ({ hasUnsavedChanges }) => {
  useBeforeUnload(
    useCallback(
      (event) => {
        if (hasUnsavedChanges) {
          event.preventDefault();
          event.returnValue = "";
        }
      },
      [hasUnsavedChanges]
    ),
    { capture: true }
  );

  return null;
};

這個改變簡化了我們組件的邏輯。現在,我們可以添加一個自定義的 usePrompt 鉤子,并像版本5中的 Prompt 組件一樣使用它。

// FormPrompt.js

import { useEffect, useCallback, useRef } from "react";
import {
  useBeforeUnload,
  unstable_useBlocker as useBlocker,
} from "react-router-dom";

const stepLinks = ["/contact", "/education", "/about", "/confirm"];

export const FormPrompt = ({ hasUnsavedChanges }) => {
  const onLocationChange = useCallback(
    ({ nextLocation }) => {
      if (!stepLinks.includes(nextLocation.pathname) && hasUnsavedChanges) {
        return !window.confirm(
          "You have unsaved changes, are you sure you want to leave?"
        );
      }
      return false;
    },
    [hasUnsavedChanges]
  );

  usePrompt(onLocationChange, hasUnsavedChanges);
  useBeforeUnload(
    useCallback(
      (event) => {
        if (hasUnsavedChanges) {
          event.preventDefault();
          event.returnValue = "";
        }
      },
      [hasUnsavedChanges]
    ),
    { capture: true }
  );

  return null;
};

function usePrompt(onLocationChange, hasUnsavedChanges) {
  const blocker = useBlocker(hasUnsavedChanges ? onLocationChange : false);
  const prevState = useRef(blocker.state);

  useEffect(() => {
    if (blocker.state === "blocked") {
      blocker.reset();
    }
    prevState.current = blocker.state;
  }, [blocker]);
}

useBlocker 鉤子接受布爾值或阻止函數作為其參數,類似于 Prompt 組件中的 message 屬性。該函數的一個參數是下一個位置,我們使用它來確定用戶是否正在離開我們的表單。如果是這種情況,我們利用瀏覽器的 window.confirm 方法顯示一個對話框,詢問用戶確認重定向或取消它。最后,我們在 usePrompt 鉤子中抽象出阻止邏輯并管理阻止器的狀態。

我們可以通過導航到聯系步驟,填寫一些字段并單擊主頁導航項來測試 FormPrompt 是否按預期工作。我們會看到一個確認對話框,詢問我們是否要離開該頁面。

總結

總之,為未保存的表單更改實現確認對話框是增強用戶體驗的重要實踐。本文演示了如何創建一個 FormPrompt 組件,當用戶嘗試離開具有未保存更改的頁面時,該組件會向用戶發出警告。我們探討了如何使用純JavaScript處理這種情況,使用 beforeunload 事件以及在React中使用React Router v5中的 Prompt 組件和React Router v6中的 useBeforeUnload 和 unstable_useBlocker 鉤子。通過將此功能合并到您的表單中,你可以幫助用戶避免失去未保存的工作而感到沮喪。

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

責任編輯:姜華 來源: 大遷世界
相關推薦

2016-09-27 19:28:37

2020-03-10 10:37:48

數據丟失數據泄露網絡安全

2009-07-02 15:12:39

2011-07-22 09:51:51

iPhone FROM 表單

2009-07-03 14:41:03

2016-12-13 13:54:10

EasyUI form數據加載

2012-06-05 10:15:43

jQuery

2021-09-14 18:33:39

React 數據交互

2020-06-17 14:40:49

用戶頁面前端

2010-06-10 18:08:58

2009-07-02 11:29:22

JSP技術表單數據存儲

2012-07-10 14:15:42

前端開發

2010-12-21 15:56:43

桌面文件權限管理防止數據丟失

2009-08-26 10:41:21

防止數據丟失

2025-06-30 07:20:00

Web開發API

2025-09-25 13:51:13

2020-10-21 11:37:12

Redis數據庫命令

2009-11-06 13:40:07

2016-07-05 09:38:08

2023-07-11 15:02:34

數據丟失人工智能
點贊
收藏

51CTO技術棧公眾號

三级在线观看一区二区| 亚洲精品一二三**| 国产蜜臀97一区二区三区| 国产狼人综合免费视频| 天天鲁一鲁摸一摸爽一爽| 亚洲精品成a人ⅴ香蕉片| 亚洲国产一二三| 欧美中文娱乐网| 91一区二区视频| 伊人激情综合| 色多多国产成人永久免费网站| 日本成人xxx| 伊人久久av| 一区二区三区国产豹纹内裤在线| 九九九九九九精品| 国产视频在线观看免费| 香蕉久久久久久久av网站| 久久久国产91| 精品人妻一区二区三区视频| 国产精品一区二区三区四区在线观看| 五月天亚洲婷婷| 日韩最新中文字幕| 欧美一区二区三区少妇| 精久久久久久久久久久| 午夜美女久久久久爽久久| 国产午夜精品理论片| 国产中文字幕一区二区三区 | 国产成人免费看| 99tv成人| 国产一区二区三区高清在线观看| 国产成人av片| 国产精品成人3p一区二区三区| 欧美视频二区36p| 米仓穗香在线观看| 1区2区3区在线观看| 久久亚洲精精品中文字幕早川悠里 | 精品999在线播放| 欧美视频亚洲图片| 成人精品一区二区三区电影| 日韩欧美在线视频观看| 国产精品国产亚洲精品看不卡| 成人日批视频| 亚洲同性gay激情无套| 亚洲欧美日本国产有色| 嫩草在线播放| 26uuu另类欧美| 久久66热这里只有精品| 色一情一乱一乱一区91av| 国产激情一区二区三区桃花岛亚洲| 国产日韩在线看片| 艳妇乳肉豪妇荡乳av| 日韩成人av影视| 国产z一区二区三区| 久久久精品福利| 亚洲午夜极品| 欧美精品九九久久| 精品一区二区三区人妻| 欧美日韩免费| 欧美激情一区二区三区久久久| 久久激情免费视频| 中文乱码免费一区二区三区下载| 久久精品一偷一偷国产| 91免费公开视频| 久久网站免费观看| xvideos成人免费中文版| 老司机深夜福利网站| 97久久夜色精品国产| 久久国产精品久久久久久| 国产极品国产极品| 影音国产精品| 欧美一区深夜视频| 国产乱码在线观看| 久久99精品久久久久久国产越南| 成人午夜一级二级三级| 国产av精国产传媒| caoporn国产一区二区| 鲁鲁视频www一区二区| av中文字幕在线| 亚洲人成精品久久久久久| 国产女教师bbwbbwbbw| 黄色激情在线播放| 在线观看网站黄不卡| 成年人三级黄色片| 91国内精品白嫩初高生| 日韩精品免费在线播放| 亚洲第一视频区| 欧美日本不卡| 日本久久久久亚洲中字幕| 亚洲免费视频二区| 国产很黄免费观看久久| 久久96国产精品久久99软件| 1024免费在线视频| 一区二区高清视频在线观看| 青青草原av在线播放| 日韩电影精品| 亚洲国产成人av在线| 人妻视频一区二区| 最新欧美人z0oozo0| 5252色成人免费视频| 在线免费观看一级片| 成人免费视频国产在线观看| 日本一区二区三区视频在线播放 | 日本一二区不卡| 欧美黑人xxx| 夜夜躁日日躁狠狠久久av| 国产成人在线视频网站| 日本高清视频一区二区三区| 四虎亚洲成人| 欧美性猛交xxxx黑人交| 日本三级日本三级日本三级极| 国内精品久久久久久久影视简单| 精品中文字幕在线2019| 无码人妻av一区二区三区波多野| 国产精品1区2区3区在线观看| 欧美日本韩国在线| 日韩av官网| 欧美人动与zoxxxx乱| 五级黄高潮片90分钟视频| 欧美成人嫩草网站| 国产精品看片资源| 香蕉视频免费看| 一区二区三区中文在线观看| 538任你躁在线精品免费| 亲子伦视频一区二区三区| 九九热精品视频国产| 中文字幕乱码视频| 26uuu国产一区二区三区| 99热这里只有精品免费| 色综合.com| 中文字幕欧美精品在线| 黄色片免费观看视频| 成人自拍视频在线观看| 成人在线观看毛片| 日韩精品第二页| 一区二区三区在线播放欧美| 影音先锋亚洲天堂| av资源网一区| 国产精品久久久久9999爆乳| 欧美久久亚洲| 久久久999精品免费| 中国黄色一级视频| 国产午夜亚洲精品理论片色戒| 国模吧无码一区二区三区 | 日韩福利视频| 成人一区福利| 亚洲色图35p| 国产精品乱子伦| 91在线看国产| 国产99久久九九精品无码| 久久精品色播| 91av免费观看91av精品在线| 亚洲欧洲综合在线| 欧美视频在线免费看| 欧洲一级黄色片| 国产精品美女| 欧美一进一出视频| 欧美精品总汇| 中文字幕无线精品亚洲乱码一区 | 久久国产精品视频在线观看| av成人男女| 97久久精品国产| 婷婷五月综合激情| 欧美日韩亚洲网| 性猛交ⅹxxx富婆video| 蜜臀av性久久久久蜜臀aⅴ | 老司机在线看片网av| 欧美欧美午夜aⅴ在线观看| 国产精品麻豆免费版现看视频| 久久激五月天综合精品| 黄色污污在线观看| 97久久综合精品久久久综合| 2019中文字幕在线免费观看| 国产一区二区三区不卡在线| 欧美日韩免费高清一区色橹橹| 小泽玛利亚一区| 成人妖精视频yjsp地址| 免费在线激情视频| 日韩大片在线| 国产91亚洲精品一区二区三区| 成入视频在线观看| 国产亚洲精品综合一区91| 国产免费黄色网址| 亚洲第一激情av| 久久久久亚洲av成人无码电影| 久久精品国产亚洲一区二区三区| 久久久天堂国产精品| 青青视频一区二区| 国产精品亚洲综合天堂夜夜| 日日夜夜天天综合入口| 亚洲乱码av中文一区二区| 亚洲视频久久久| 亚洲一区二区三区四区五区黄| 国产精品揄拍100视频| 紧缚捆绑精品一区二区| 免费看黄在线看| 日韩在线理论| 精品久久精品久久| 日韩五码电影| 欧美亚洲伦理www| 国产三区在线观看| 日韩福利在线播放| 国产精品乱码久久久| 欧美日韩精品在线| 成人免费毛片东京热| 久久先锋影音av| 国产伦理在线观看| 日本欧美久久久久免费播放网| 激情视频小说图片| 国内精品视频在线观看| 超碰97国产在线| 欧美韩国日本| 日av在线播放中文不卡| 污网站在线免费看| 色777狠狠综合秋免鲁丝| 亚洲日本中文字幕在线| 日韩欧美专区在线| 一炮成瘾1v1高h| 91久久精品一区二区三| 中文字幕一区二区三区手机版| 中文字幕亚洲在| 久久久视频6r| 91免费视频网址| 熟妇高潮一区二区| 国模大尺度一区二区三区| 欧美性猛交久久久乱大交小说| 亚洲激情黄色| a级片一区二区| 91精品秘密在线观看| 五月天丁香综合久久国产| 在线日本制服中文欧美| 精品乱色一区二区中文字幕| 成人爽a毛片免费啪啪红桃视频| 国产这里只有精品| 伦一区二区三区中文字幕v亚洲| 日韩av片电影专区| 国产在线精彩视频| 久久频这里精品99香蕉| 蜜臀av在线| 欧美日韩国产999| 国产视频中文字幕在线观看| 久久天天躁狠狠躁夜夜爽蜜月| av电影在线观看| 中文字幕亚洲一区| 成年网站在线| 在线电影中文日韩| 成人av一区| 中文在线资源观看视频网站免费不卡| 男男电影完整版在线观看| 国产偷国产偷亚洲清高网站| 色欲av伊人久久大香线蕉影院| 精品久久久久久久久久久久久久久久久| japanese国产| 精品国免费一区二区三区| 成人毛片视频免费看| 精品久久久久久无| 爽爽视频在线观看| 亚洲欧美在线一区| 国产三级视频在线播放线观看| 亚洲午夜色婷婷在线| 成人在线免费观看| 深夜福利91大全| 91福利国产在线观看菠萝蜜| 色综合天天综合网国产成人网| 调教一区二区| 国内揄拍国内精品少妇国语| 岛国在线视频网站| 国产成人a亚洲精品| 国产一区精品福利| 亚洲在线视频观看| 成人爽a毛片| 日本免费一区二区三区| 99国产精品一区二区| 国产成人生活片| av不卡在线看| 色多多视频在线播放| 韩国欧美一区二区| 四虎成人免费视频| 国产亚洲一区二区三区| 四虎影院中文字幕| 亚洲成人tv网| 波多野结衣mp4| 日韩午夜小视频| 亚洲 欧美 激情 另类| 中文字幕精品在线| 日本高清成人vr专区| 欧美主播福利视频| 未满十八勿进黄网站一区不卡| 国产精品12| 成人在线电影在线观看视频| 中文字幕日韩精品无码内射| 日日夜夜免费精品| 99精品视频免费版的特色功能| 26uuu色噜噜精品一区二区| 你懂得在线观看| 黄网动漫久久久| 国产精品久久久久久久久久久久久久久久久久 | 女人天堂亚洲aⅴ在线观看| a级黄色小视频| 久草热8精品视频在线观看| 波多野结衣影院| 亚洲图片你懂的| 亚洲男人天堂网址| 欧美成人在线直播| av国产在线观看| 91国产美女视频| 国产精品一区二区三区av | 成人激情视频小说免费下载| 欧美调教在线| 青青在线免费视频| 三级不卡在线观看| 999精品免费视频| 亚洲色图在线看| 亚洲精品国产精品乱码视色| 亚洲国产精久久久久久| 国产美女在线观看| 国产精品444| 欧美一级全黄| 日本wwwcom| 国产精品99久久久久久似苏梦涵| 丁香花五月婷婷| 欧美日韩午夜剧场| 亚洲欧美另类综合| 日韩亚洲欧美中文高清在线| 欧美成人精品一区二区男人小说| 国产精品jizz视频| 99精品综合| 亚洲这里只有精品| 国产日本欧美一区二区| 欧美精品二区三区| 精品国产一二三区| 色呦呦在线播放| 91老司机在线| 久久免费av| 视频免费1区二区三区| 中文字幕欧美日本乱码一线二线| 亚洲成人第一网站| 亚洲女人天堂网| 亚洲同志男男gay1069网站| 久久精品午夜一区二区福利| 在线国产精品一区| 美女黄色一级视频| 亚洲午夜国产一区99re久久| 精品人妻午夜一区二区三区四区| 日韩在线欧美在线国产在线| 岛国一区二区| 亚洲一区二区三区精品视频| 秋霞av亚洲一区二区三| 极品人妻videosss人妻| 91黄色免费网站| 福利视频在线导航| 国产精品免费视频久久久| 欧美亚洲高清| 午夜啪啪小视频| 樱桃视频在线观看一区| www.成人精品| 97激碰免费视频| 一区二区美女| 午夜视频你懂的| 亚洲欧洲无码一区二区三区| 国产麻豆免费观看| 欧美裸身视频免费观看| 国内自拍欧美| 成人羞羞国产免费网站| 国产欧美日韩一区二区三区在线观看 | 亚洲国产老妈| 稀缺小u女呦精品呦| 福利微拍一区二区| www.黄在线观看| 91精品国自产在线观看| 亚洲少妇诱惑| 国产福利在线导航| 日韩视频一区二区在线观看| sis001亚洲原创区| 欧美日韩亚洲免费| 九九在线精品视频| 国产一级视频在线| 国产亚洲一区二区在线| 日韩护士脚交太爽了| 亚洲理论电影在线观看| 国产日产亚洲精品系列| 国产免费黄色大片| 2020久久国产精品| 99re6这里只有精品| 国产成人av无码精品| 欧美中文一区二区三区| 宅男网站在线免费观看| 另类欧美小说| 国产不卡在线播放| www.com亚洲| 欧美乱妇高清无乱码| 国产伦精品一区二区三区千人斩 | xvideos国产精品| 啪啪国产精品| 五月激情五月婷婷| 欧美日韩免费一区| 超碰在线caoporn| 美女黄毛**国产精品啪啪| 国产剧情在线观看一区二区| 伊人手机在线视频| 九九热这里只有精品免费看|