国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

從理解路由到實現(xiàn)一套Router(路由)

共 29343字,需瀏覽 59分鐘

 ·

2024-06-25 09:20

點擊上方 前端Q,關(guān)注公眾號

回復(fù)加群,加入前端Q技術(shù)交流群

作者:betterwlf

https://juejin.cn/post/7150794643985137695


平時在Vue項目中經(jīng)常用到路由,但是也僅僅處于會用的層面,很多基礎(chǔ)知識并不是真正的理解。于是就趁著十一”小長假“查閱了很多資料,總結(jié)下路由相關(guān)的知識,查缺不漏,加深自己對路由的理解。

路由

在 Web 開發(fā)過程中,經(jīng)常遇到路由的概念。那么到底什么是路由呢?簡單來說,路由就是 URL 到函數(shù)的映射。

路由這個概念本來是由后端提出來的,在以前用模板引擎開發(fā)頁面的時候,是使用路由返回不同的頁面,大致流程是這樣的:

  1. 瀏覽器發(fā)出請求;
  2. 服務(wù)器監(jiān)聽到 80 或者 443 端口有請求過來,并解析 UR L路徑;
  3. 服務(wù)端根據(jù)路由設(shè)置,查詢相應(yīng)的資源,可能是 html 文件,也可能是圖片資源......,然后將這些資源處理并返回給瀏覽器;
  4. 瀏覽器接收到數(shù)據(jù),通過content-type決定如何解析數(shù)據(jù)

簡單來說,路由就是用來跟后端服務(wù)器交互的一種方式,通過不同的路徑來請求不同的資源,請求HTML頁面只是路由的其中一項功能。

服務(wù)端路由

當服務(wù)端接收到客戶端發(fā)來的 HTTP 請求時,會根據(jù)請求的 URL,找到相應(yīng)的映射函數(shù),然后執(zhí)行該函數(shù),并將函數(shù)的返回值發(fā)送給客戶端。

對于最簡單的靜態(tài)資源服務(wù)器,可以認為,所有 URL 的映射函數(shù)就是一個文件讀取操作。對于動態(tài)資源,映射函數(shù)可能是一個數(shù)據(jù)庫讀取操作,也可能進行一些數(shù)據(jù)處理,等等。

客戶端路由

服務(wù)端路由會造成服務(wù)器壓力比較大,而且用戶訪問速度也比較慢。在這種情況下,出現(xiàn)了單頁應(yīng)用。

單頁應(yīng)用,就是只有一個頁面,用戶訪問網(wǎng)址,服務(wù)器返回的頁面始終只有一個,不管用戶改變了瀏覽器地址欄的內(nèi)容或者在頁面發(fā)生了跳轉(zhuǎn),服務(wù)器不會重新返回新的頁面,而是通過相應(yīng)的js操作來實現(xiàn)頁面的更改。

前端路由其實就是:通過地址欄內(nèi)容的改變,顯示不同的頁面。

前端路由的優(yōu)點:

  • 前端路由可以讓前端自己維護路由與頁面展示的邏輯,每次頁面改動不需要通知服務(wù)端。
  • 更好的交互體驗:不用每次從服務(wù)端拉取資源。

前端路由的缺點: 使用瀏覽器的前進、后退鍵時會重新發(fā)送請求,來獲取數(shù)據(jù),沒有合理利用緩存。

前端路由實現(xiàn)原理: 本質(zhì)就是監(jiān)測 URL 的變化,通過攔截 URL 然后解析匹配路由規(guī)則。

前端路由的實現(xiàn)方式

  1. hash模式(location.hash + hashchange 事件)

hash 模式的實現(xiàn)方式就是通過監(jiān)聽 URL 中的 hash 部分的變化,觸發(fā)haschange事件,頁面做出不同的響應(yīng)。但是 hash 模式下,URL 中會帶有 #,不太美觀。

  1. history模式

history 路由模式的實現(xiàn),基于 HTML5 提供的 History 全局對象,它的方法有:

  • history.go():在會話歷史中向前或者向后移動指定頁數(shù)
  • history.forward():在會話歷史中向前移動一頁,跟瀏覽器的前進按鈕功能相同
  • history.back():在會話歷史記錄中向后移動一頁,跟瀏覽器的后腿按鈕功能相同
  • history.pushState():向當前瀏覽器會話的歷史堆棧中添加一個狀態(tài),會改變當前頁面url,但是不會伴隨這刷新
  • history.replaceState():將當前的會話頁面的url替換成指定的數(shù)據(jù),replaceState 會改變當前頁面的url,但也不會刷新頁面
  • window.onpopstate:當前活動歷史記錄條目更改時,將觸發(fā)popstate事件

history路由的實現(xiàn),主要是依靠pushState、replaceStatewindow.onpopstate實現(xiàn)的。但是有幾點要注意:

  • 當活動歷史記錄條目更改時,將觸發(fā) popstate 事件;
  • 調(diào)用history.pushState()history.replaceState()不會觸發(fā) popstate 事件
  • popstate 事件只會在瀏覽器某些行為下觸發(fā),比如:點擊后退、前進按鈕(或者在 JavaScript 中調(diào)用history.back()history.forward()、history.go()方法)
  • a 標簽的錨點也會觸發(fā)該事件

對 pushState 和 replaceState 行為的監(jiān)聽

如果想監(jiān)聽 pushState 和 replaceState 行為,可以通過在方法里面主動去觸發(fā) popstate 事件,另一種是重寫history.pushState,通過創(chuàng)建自己的eventedPushState自定義事件,并手動派發(fā),實際使用過程中就可以監(jiān)聽了。具體做法如下:

function eventedPushState(state, title, url{
    var pushChangeEvent = new CustomEvent("onpushstate", {
        detail: {
            state,
            title,
            url
        }
    });
    document.dispatchEvent(pushChangeEvent);
    return history.pushState(state, title, url);
}

document.addEventListener(
    "onpushstate",
    function(event{
        console.log(event.detail);
    },
    false
);

eventedPushState({}, """new-slug"); 

router 和 route 的區(qū)別

route 就是一條路由,它將一個 URL 路徑和一個函數(shù)進行映射。而 router 可以理解為一個容器,或者說一種機制,它管理了一組 route。

概括為:route 只是進行了 URL 和函數(shù)的映射,在當接收到一個 URL 后,需要去路由映射表中查找相應(yīng)的函數(shù),這個過程是由 router 來處理的。

動態(tài)路由和靜態(tài)路由

  • 靜態(tài)路由

靜態(tài)路由只支持基于地址的全匹配。

  • 動態(tài)路由

動態(tài)路由除了可以兼容全匹配外還支持多種”高級匹配模式“,它的路徑地址中含有路徑參數(shù),使得它可以按照給定的匹配模式將符合條件的一個或多個地址映射到同一個組件上。

動態(tài)路由一般結(jié)合角色權(quán)限控制使用。

動態(tài)路由的存儲有兩種方式:

  1. 將路由存儲到前端
  2. 將路由存儲到數(shù)據(jù)庫

動態(tài)路由的好處:

  • 靈活,無需手動維護
  • 存儲到數(shù)據(jù)庫,增加安全性

實現(xiàn)一個路由

一個簡單的Router應(yīng)該具備哪些功能

  • 以 Vue為例,需要有 <router-link>鏈接、<router-view>容器、component組件和path路由路徑:
<div id="app">
    <h1>Hello World</h1>
    <p>
        <!-- 使用 router-link 組件進行導(dǎo)航 -->
        <!-- 通過傳遞 to 來指定鏈接 -->
        <!-- <router-link> 將呈現(xiàn)一個帶有正確 href屬性的<a>標簽 -->
        <router-link to="/">Go to Home</router-link>
        <router-link to="/about">Go to About</router-link>
    </p>
    <!-- 路由出口 -->
    <!-- 路由匹配到的組件將渲染在這里 -->
    <router-view></router-view>
</div>
const routes = [{
    path: '/',
    component: Home
},
{
    path: '/about',
    component: About
}]
  • 以React為例,需要有<BrowserRouter>容器、<Route>路由、組件和鏈接:
<BrowserRouter>
    <Routes>
        <Route path="/" element={<App />}>
            <Route index element={<Home />} />
            <Route path="teams" element={<Teams />}>
                <Route path=":teamId" element={<Team />} />
                <Route path="new" element={<NewTeamForm />} />
                <Route index element={<LeagueStandings />} />
            </Route>
        </Route>
    </Routes>

</BrowserRouter>


<div>
    <h1>Home</h1>
    <nav>
        <Link to="/">Home</Link> | {""}
        <Link to="about">About</Link>
    </nav>
</div>
  • 綜上,一個簡單的 Router 應(yīng)該具備以下功能:
    • 容器(組件)
    • 路由
    • 業(yè)務(wù)組件 & 鏈接組件

不借助第三方工具庫,如何實現(xiàn)路由

不借助第三方工具庫實現(xiàn)路由,我們需要思考以下幾個問題:

  • 如何實現(xiàn)自定義標簽,如vue的<router-view>,React的<Router>
  • 如何實現(xiàn)業(yè)務(wù)組件
  • 如何動態(tài)切換路由

準備工作

1、根據(jù)對前端路由 history 模式的理解,將大致過程用如下流程圖表示:


2、如果不借助第三方庫,我們選擇使用 Web components 。Web Components由三項主要技術(shù)組成,它們可以一起使用來創(chuàng)建封裝功能的定制元素。
    • Custom elements(自定義元素) :一組JavaScript API,允許我們定義 custom elements及其行為,然后可以在界面按照需要使用它們。
    • Shadow DOM(影子DOM) :一組JavaScript API,用于將封裝的“影子”DOM樹附加到元素(與主文檔分開呈現(xiàn))并控制關(guān)聯(lián)的功能。通過這種方式,可以保持元素的功能私有。
    • HTML template(HTML模版)<template><slot>可以編寫不在頁面顯示的標記模板,然后它們可以作為自定義元素結(jié)構(gòu)的基礎(chǔ)被多次重用。

另外還需要注意 Web Components 的生命周期:

connectedCallback:當 custom element 首次被插入文檔DOM時,被調(diào)用

disconnectedCallback:當 custom element 從文檔DOM中刪除時,被調(diào)用

adoptedCallback:當custom element 被移動到新的文檔時,被調(diào)用

attributeChangedCallback:當 custom element 增加、刪除、修改自身屬性時,被調(diào)用

3、Shadow DOM

    • open:shadow root 元素可以從 js 外部訪問根節(jié)點
    • close :拒絕從 js 外部訪問關(guān)閉的 shadow root 節(jié)點
    • 語法:const shadow = this.attachShadow({mode:closed});
    • Shadow host:一個常規(guī)DOM節(jié)點,Shadow DOM 會被附加到這個節(jié)點上
    • Shadow tree:Shadow DOM 內(nèi)部的 DOM 樹
    • Shadow boundary:Shadow DOM 結(jié)束的地方,也是常規(guī)DOM開始的地方
    • Shadow root:Shadow tree 的根節(jié)點
    • Shadow DOM 特有的術(shù)語:
    • Shadow DOM的重要參數(shù)mode:
  1. 通過自定義標簽創(chuàng)建容器組件、路由、業(yè)務(wù)組件和鏈接組件標簽,使用

    CustomElementRegistry.define()注冊自定義元素。其中,Custom elements 的簡單寫法舉例:

    <my-text></my-text>

    <script>
        class MyText extends HTMLElement{
            constructor(){
                super();
                this.append(“我的文本”);
            }
        }
        window.customElements.define("my-text",MyText);
    </
    script>
    1. 組件的實現(xiàn)可以使用 Web Components,但是這樣有缺點,我們沒有打包引擎處理 Web Components組件,將其全部加載過來。

    為了解決以上問題,我們選擇動態(tài)加載,遠程去加載一個 html 文件。html文件里面的結(jié)構(gòu)如下:支持模版(template),腳本(template),腳本(script),樣式(style),非常地像vue。組件開發(fā)模版如下:

    <template>
        <div>商品詳情</div>
        <div id="detail">
            商品ID:<span id="product-id" class="product-id"></span>
        </div>
    </template>

    <script>
        this.querySelector("#product-id").textContent = history.state.id;
    </script>

    <style>
        .product-id{
            color:red;
        }
    </style>
    1. 監(jiān)聽路由的變化:

    popstate可以監(jiān)聽大部分路由變化的場景,除了pushStatereplaceState。

    pushStatereplaceState可以改變路由,改變歷史記錄,但是不能觸發(fā)popstate事件,需要自定義事件并手動觸發(fā)自定義事件,做出響應(yīng)。

    1. 整體架構(gòu)圖如下:

    8.  組件功能拆解分析如下:

    • 鏈接組件 — CustomLink(c-link)

    當用戶點擊<c-link>標簽后,通過event.preventDefault();阻止頁面默認跳轉(zhuǎn)。根據(jù)當前標簽的to屬性獲取路由,通過history.pushState("","",to)進行路由切換。

    //  <c-link to="/" class="c-link">首頁</c-link>
    class CustomLink extends HTMLElement {
        connectedCallback() {
            this.addEventListener("click", ev => {
                ev.preventDefault();
                const to = this.getAttribute("to");
                // 更新瀏覽器歷史記錄
                history.pushState("""", to)
            })

        }
    }
    window.customElements.define("c-link", CustomLink);
    • 容器組件 — CustomRouter(c-router)

    主要是收集路由信息,監(jiān)聽路由信息的變化,然后加載對應(yīng)的組件

    • 路由 — CustomRoute(c-route)

    主要是提供配置信息,對外提供getData 的方法

    // 優(yōu)先于c-router注冊
    //  <c-route path="/" component="home" default></c-route>
    class CustomRoute extends HTMLElement {
        #data = null;
        getData() {
            return {
                defaultthis.hasAttribute("default"),
                paththis.getAttribute("path"),
                componentthis.getAttribute("component")
            }
        }
    }
    window.customElements.define("c-route", CustomRoute);
    • 業(yè)務(wù)組件 — CustomComponent(c-component)

    實現(xiàn)組件,動態(tài)加載遠程的html,并解析

    完整代碼實現(xiàn)

    index.html:

    <div class="product-item">測試的產(chǎn)品</div>
    <div class="flex">
        <ul class="menu-x">
            <c-link to="/" class="c-link">首頁</c-link>
            <c-link to="/about" class="c-link">關(guān)于</c-link>
        </ul>
    </div>
    <div>
        <c-router>
            <c-route path="/" component="home" default></c-route>
            <c-route path="/detail/:id" component="detail"></c-route>
            <c-route path="/about" component="about"></c-route>
        </c-router>
    </div>

    <script src="./router.js"></script>

    home.html:

    <template>
        <div>商品清單</div>
        <div id="product-list">
            <div>
                <a data-id="10" class="product-item c-link">香蕉</a>
            </div>
            <div>
                <a data-id="11" class="product-item c-link">蘋果</a>
            </div>
            <div>
                <a data-id="12" class="product-item c-link">葡萄</a>
            </div>
        </div>
    </template>

    <script>
        let container = this.querySelector("#product-list");
        // 觸發(fā)歷史更新
        // 事件代理
        container.addEventListener("click"function (ev{
            console.log("item clicked");
            if (ev.target.classList.contains("product-item")) {
                const id = +ev.target.dataset.id;
                history.pushState({
                        id
                }, ""`/detail/${id}`)
            }
        })
    </script>

    <style>
        .product-item {
            cursor: pointer;
            color: blue;
        }
    </style>

    detail.html:

    <template>
        <div>商品詳情</div>
        <div id="detail">
            商品ID:<span id="product-id" class="product-id"></span>
        </div>
    </template>

    <script>
        this.querySelector("#product-id").textContent=history.state.id;
    </script>

    <style>
        .product-id{
            color:red;
        }
    </style>

    about.html:

    <template>
        About Me!
    </template>

    route.js:

    const oriPushState = history.pushState;

    // 重寫pushState
    history.pushState = function (state, title, url{
        // 觸發(fā)原事件
        oriPushState.apply(history, [state, title, url]);
        // 自定義事件
        var event = new CustomEvent("c-popstate", {
            detail: {
                state,
                title,
                url
            }
        });
        window.dispatchEvent(event);
    }

    // <c-link to="/" class="c-link">首頁</c-link>
    class CustomLink extends HTMLElement {
        connectedCallback() {
            this.addEventListener("click", ev => {
                ev.preventDefault();
                const to = this.getAttribute("to");
                // 更新瀏覽歷史記錄
                history.pushState("""", to);
            })
        }
    }
    window.customElements.define("c-link", CustomLink);

    // 優(yōu)先于c-router注冊
    // <c-toute path="/" component="home" default></c-toute>
    class CustomRoute extends HTMLElement {
        #data = null;
        getData() {
            return {
                defaultthis.hasAttribute("default"),
                paththis.getAttribute("path"),
                componentthis.getAttribute("component")
            }
        }
    }
    window.customElements.define("c-route", CustomRoute);

    // 容器組件
    class CustomComponent extends HTMLElement {
        async connectedCallback() {
            console.log("c-component connected");
            // 獲取組件的path,即html的路徑
            const strPath = this.getAttribute("path");
            // 加載html
            const cInfos = await loadComponent(strPath);
            const shadow = this.attachShadow({ mode"closed" });
            // 添加html對應(yīng)的內(nèi)容
            this.#addElement(shadow, cInfos);
        }
        #addElement(shadow, info) {
            // 添加模板內(nèi)容
            if (info.template) {
                shadow.appendChild(info.template.content.cloneNode(true));
            }
            // 添加腳本
            if (info.script) {
                // 防止全局污染,并獲得根節(jié)點
                var fun = new Function(`${info.script.textContent}`);
                // 綁定腳本的this為當前的影子根節(jié)點
                fun.bind(shadow)();
            }
            // 添加樣式
            if (info.style) {
                shadow.appendChild(info.style);
            }
        }
    }
    window.customElements.define("c-component", CustomComponent);

    // <c-router></c-router>
    class CustomRouter extends HTMLElement {
        #routes
        connectedCallback() {
            const routeNodes = this.querySelectorAll("c-route");
            console.log("routes:", routeNodes);

            // 獲取子節(jié)點的路由信息
            this.#routes = Array.from(routeNodes).map(node => node.getData());
            // 查找默認的路由
            const defaultRoute = this.#routes.find(r => r.default) || this.#routes[0];
            // 渲染對應(yīng)的路由
            this.#onRenderRoute(defaultRoute);
            // 監(jiān)聽路由變化
            this.#listenerHistory();
        }

        // 渲染路由對應(yīng)的內(nèi)容
        #onRenderRoute(route) {
            var el = document.createElement("c-component");
            el.setAttribute("path"`/${route.component}.html`);
            el.id = "_route_";
            this.append(el);
        }

        // 卸載路由清理工作
        #onUploadRoute(route) {
            this.removeChild(this.querySelector("#_route_"));
        }

        // 監(jiān)聽路由變化
        #listenerHistory() {
            // 導(dǎo)航的路由切換
            window.addEventListener("popstate", ev => {
                console.log("onpopstate:", ev);
                const url = location.pathname.endsWith(".html") ? "/" : location.pathname;
                const route = this.#getRoute(this.#routes, url);
                this.#onUploadRoute();
                this.#onRenderRoute(route);
            });
            // pushStat或replaceSate
            window.addEventListener("c-popstate", ev => {
                console.log("c-popstate:", ev);
                const detail = ev.detail;
                const route = this.#getRoute(this.#routes, detail.url);
                this.#onUploadRoute();
                this.#onRenderRoute(route);
            })
        }

        // 路由查找
        #getRoute(routes, url) {
            return routes.find(function (r{
                const path = r.path;
                const strPaths = path.split('/');
                const strUrlPaths = url.split("/");

                let match = true;
                for (let i = 0; i < strPaths.length; i++) {
                    if (strPaths[i].startsWith(":")) {
                        continue;
                    }
                    match = strPaths[i] === strUrlPaths[i];
                    if (!match) {
                        break;
                    }
                }
                return match;
            })
        }
    }
    window.customElements.define("c-router", CustomRouter);

    // 動態(tài)加載組件并解析
    async function loadComponent(path, name{
        this.caches = this.caches || {};
        // 緩存存在,直接返回
        if (!!this.caches[path]) {
            return this.caches[path];
        }
        const res = await fetch(path).then(res => res.text());
        // 利用DOMParser校驗
        const parser = new DOMParser();
        const doc = parser.parseFromString(res, "text/html");
        // 解析模板,腳本,樣式
        const template = doc.querySelector("template");
        const script = doc.querySelector("script");
        const style = doc.querySelector("style");
        // 緩存內(nèi)容
        this.caches[path] = {
            template,
            script,
            style
        }
        return this.caches[path];
    }

    往期推薦


    別想調(diào)試我的前端代碼!
    來自38歲大廠程序員的忠告!
    一種更好的前端組件結(jié)構(gòu):組件樹

    最后


    • 歡迎加我微信,拉你進技術(shù)群,長期交流學(xué)習(xí)...

    • 歡迎關(guān)注「前端Q」,認真學(xué)前端,做個專業(yè)的技術(shù)人...

    點個在看支持我吧

    瀏覽 66
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    感谢您访问我们的网站,您可能还对以下资源感兴趣:

    国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 成人在线中文| 日韩人妻无码一区| 欧美久久视频| 亚洲无码一区在线| 免费看污网站| 无码av网| 午夜成人大片| 欧美在线不卡综合| 大香蕉A片| 久久久久久亚洲AV无码专区 | 免费在线黄色视频| 人人色在线观看| 国产女人18水真多18精品| 爱搞在线观看wwww| 亚洲Japanese办公室制服| 中文字幕AV在线播放| 果冻传媒一区二区三区| 日韩久久视频| 97在线精品| 国产综合区| 丰满熟妇高潮呻吟无码| 婷婷伊人久操网| 国产小视频免费在线观看| 日本成人性爱视频网站一区| 黄色片免费观看| 九九超碰| 精品1234| 国产精品视频久久久| 青榴社区| 成人日皮视频| 九九视频网| 成人在线无码视频| 午夜视频18| 靠逼国产| 综合激情五月婷婷| 中文无码精品欧美日韩| 欧美大片视频| 欧美日韩在线免费观看| 秋霞午夜福利| 国产精品一二区| 人人干人人操人人摸| 永久免费一区二区| 2022黄片| 国产色情视频在线观看| 秋霞无码| 99做爱| 在线观看免费黄网站| 996精品视频| 日本欧美成人片AAAA| 豆花网无码视频观看| 人妻少妇偷人精品无码免费| 国产中文字幕亚洲综合欧美| 亚洲福利视频97| 国产成人高清| 99热国产在线| 清清草视频| 97在线免费视频| 亚洲AV无码成人精品国产五月天| 亚洲视频中文字幕在线观看| 大香蕉黄色网| 国产无码中文字幕| 性饥渴熟妇乱子伦| 亚洲电影无码| 日韩A片免费看| 国内精品久久久久久久| 国产日韩欧美一区| 骚熟妇| 97香蕉网| 色综合天天综合成人网| 99Re66精品免费视频| 黄色片视频| 丁香婷婷激情五月| 无码一区二区久久| 囯产精品99久久久久久WWW| 欧美sesese| 欧美久久性爱| 色五月在线观看| 中文区中文字幕免费看| 黄色电影视频网站| 免费做a爰片77777| 国产精品午夜福利视频| 久久精品www人人爽人人| 粉嫩小泬BBBB免费看-百度| 东方AV在线免费观看| 中文字幕你懂的| 深夜福利av| 中国免费一级无码成人片| 操人视频在线观看| 精品亚洲无码视频| 国产真实露脸乱子伦对白高清视频| 久操视频在线观看免费| 91精品国产aⅴ一区二区| 艳妇乳肉豪妇荡乳AV无码福利| 91成人无码看片在线观看网址 | 影音先锋男人天堂| www.豆花社区成人| 91视频网站免费观看| 黑人大肉棒| 影音先锋色AV| 免费看操逼逼| 亚洲一区二区三区在线视频| 丰满岳乱妇一区二区三区全文阅读 | 激情久久AV一区AV二区AV三区| 色噜噜一区二区三区| 中文字幕在线观看二区| 成人精品一区二区区别解析 | 国产成人精品一区二三区熟女在线 | 欧美成人综合| 人人爱人人操| 欧美性视频网站| 国产日本在线视频| 少妇熟女视频| 蝌蚪窝在线视频观看| 亚洲中文免费观看| 国产成人AV一区二区三区在线观看| 亚洲成人av无码| 成人免费黄色视频| 99无码人妻| 综合色婷婷| 97狠狠| 亚洲欧洲视频| 特级西西444www高清视频| 91人妻视频| 男人天堂中文字幕| 亚洲色婷婷久久精品AV蜜桃| AV-ThePorn| 亚洲综合人妻| 久久婷婷国产麻豆91天堂| 丁香社区五月天| 少妇高潮无码| 特级毛片www| 欧美不卡一区| 91啪啪| 中文字幕午夜福利| 久久中文字幕无码| 91蝌蚪在线视频| 日本aaaa片| 色吧| 99色色网| 日韩AV无码电影| AV毛片| 久久久亚洲AV无码精品色午夜| 婷婷好色五月天| 国产黄色Av| 国产精品永久久久久久久久久| 欧美V∧| 69AV在线播放| 欧美男人天堂| 色播五月天| 国产欧美二区综合中文字幕精品一 | 在线观看黄色| 欧美性爱XXXX黑人XYX性爽 | 5252a我爱haose01我愿 | 国产一级AA片| 欧美日韩中文字幕视频| 日韩电影| 三级片无码视频| 国产综合第一页| 亚洲无码门| 玖玖热在线视频| 麻豆秘在线观看国产| 久久久久久久久久国产精品| 日本特黄| 豆花成人视频| 亚洲男人天堂| 亚洲影院第一页| 亚洲最大黄色| 中文字幕视频2023| 天天视频狠狠狠狠| 国产操逼网址| 色噜噜一区二区三区| 秋霞福利网| 国产无码激情| www.cao| 思思热这里只有精品| 久久久123| 伊人影院久久| 黄色伊人网| 91热视频| 国产AV一区二区三区四区五区| 肏屄综合网| 日韩成人影视| 久久国产综合| 天堂综合网| 色婷婷久久久久swag精品| 啊啊啊在线| 激情综合网五月| 亚洲最大的成人网站| 青青操在线观看| 午夜成人福利在线观看| 91红桃视频| 夜夜夜叫天天天做| 天天人人精品| 国产黄色av| 欧美一级特黄AAAAAA片在线视频| 国产又黄又| 九色PORN视频成人蝌蚪自拍 | 青青青在线| 你懂得视频在线观看| 黄色永久网站| 亚洲国产精品久久人人爱| 超碰人人操| 色五月天导航| 日韩无码AV一区二区三区| 国产精品在线观看视频| 亚洲高清免费视频| 老司机福利在线视频| 成人性爱视频免费观看| 东北女人操逼视频| jizzjizz国产| 中国少妇xxx| 天天干天天天天| 91嫩逼| 国产熟妇搡BBBB搡BBBB毛片| 91一区二区在线观看| 午夜三级无码| 毛片3| 波多野结衣一区二区三区| 亚洲AV秘无码一区在线| 久久免费视频,久久免费视频 | 99热超碰在线| 久热久| 午夜视频18| 精东影业AV无码精品| 色天堂视频| 天天躁狠狠躁夜躁2024| 免费av观看| 国产乱子伦-区二区三区四区| 欧美色道| 大香蕉福利在线| 欧美人操逼视频| 亚洲无码视频网站| 日韩三级AV在线观看| 久久久精品在线| 中文字幕高清无码视频| 一级爱爱| 亚洲国产免费视频| 国内精品一区二区三区| 国产高清精品软件丝瓜软件| 久久久久久久久久久久久久久久久久免费精品分类视频 | 91黄色在线视频| 国产久久久久久久久| 操b视频在线观看| 中国老太卖婬HD播放| 东北A片| 91爱搞| 无码在线免费| 亚洲电影免费观看| 亚洲成人无码一区| 黄色欧美视频| 少妇搡BBBB搡BBB搡造水多,| 狠狠色婷婷777| 麻豆久久久| 在线看一区二区三区| 亚洲无人禁区| 天天操比| 丁香五月色| 老司机狠狠干| 小黄片在线免费观看| 欧美国产在线观看| 人人摸人人操人人射| 女人18片毛片60分钟黃菲菲| 成人精品在线| 插入综合网| www.97av| 女人天堂AV| 99热精品免费在线观看| 亚洲中文第一页| 国产一级A片免费视频| 五月伊人网| 逼逼75大秀| 吴梦梦一区二区三区| 婷婷手机在线| h在线| 肉色超薄丝袜脚交一区二区| 国产aaaaaaaaaaaaa| 中文字幕在线成人| 九九在线观看视频| 麻豆视频一区二区| 艾操网| 国产AVwww| 91啪啪| 天堂在线视频免费| 好男人av| 欧美成人视频网站| 性爱xxxxx| 乱子伦国产精品一区二区| 日韩做爱视频| 欧美激情视频一区| 丁香花小说完整视频免费观看| 色a视频| 日韩无码AV一区二区三区| 亚州无码视频| 黄片视频在线免费播放| av青青草| 在线观看日韩三级片av| 欧美性交网| 亚洲无码在线免费观看视频| 欧美色图亚洲另类| 88AV在线播放| 欧美激情伊人久久五月天| 国产欧美日韩在线播放| 成人天堂| 日韩AV免费在线播放| AV大全在线观看| 中文字幕免费视频在线播放| 欧美色图另类图片| 夜夜操天天干| 欧美日韩亚洲另类| 欧美色图综合网| 一级做a视频| 撒尿BBw搡BBwBBw| 欧美另类色图| 成人免费黄色网| 久久国产av| www.大香蕉伊人| 国产一区二区成人久久919色| 国产婷婷色一区二区| 亚欧洲精品在线视频| 色逼视频| 伊人精品| 99热精品在线播放| 四虎亚洲| 免费AA片| 国产人妻人伦精品1国产丝袜| 丰满熟妇人妻中文字幕| 黑人vs亚洲人在线播放| 婷婷久久综合久| 亚洲五月婷婷| 久久成人网豆花视频| 婷婷五月天AV| 欧美色女人| 欧美sese| www.有码99| 操逼网站在线观看| AV口爆| 日韩无码人妻一区二区| 国产女同在线观看| 婷婷五月天网| 性爱一级视频| 日韩在线视频91| 蝌蚪窝在线免费观看视频| 久久艹免费视频| 亚洲蜜桃av一区| 国产精品无码免费视频| 柠檬福利第一导航| 少妇厨房愉情理伦BD在线观看| 成人无码在线观看免费视频| 国产成人精品免费看视频| 91视频亚洲| 日韩啊啊啊| 99这里只有精品| 国产激情视频网站| 男女日逼视频| 高清无码在线视频观看| av免费网站| 亚洲一区二区成人| 日本免费黄色| www.久久久| 懂色av| 成人爱爱免费视频| 久草视频99| 一级二级三级无码| 国产精品外围| 亚洲Av无码成人专区擼| 91久久性奴调教| 免费看黄片的网站| 黄色片在线视频| 无码AⅤ一区二区三区| 中文字幕在线播放av| 男女日比视频| 亚洲Av秘无码一区二区| 中文字幕乱视频| www.豆花社区成人| 日韩欧美国产高清91| 国产激情一区二区三区| 欧美肏屄视频| 无码人妻一区二区三区免水牛视频 | 九一成人电影| 国产AV高清| 91人人操人人爽| 国产偷拍精品视频| 97午夜福利| 日本操屄视频| 无码视频观看| 午夜美女福利视频| 黄色视频网站免费| 成人福利视频在线观看| 欧美在线不卡综合| 激情五月天黄色| 先锋影音亚洲AV每日资源网站| 91人妻人人澡人人| 日韩熟妇人妻中文字幕| 精品大香蕉| 夸克看成人片一级A片| 日本在线播放| av在线免费观看网址| 亚洲日韩中文无码| 亚洲青青草| 精品无码不卡| 热无码| 成人网址大全| 久久精品视频久久| 日韩肏屄视频| 996热re视频精品视频| 黄色片在线看| 西西444| 亚洲高清无码免费在线观看| 妻子互换被高潮了三次| 精品无人区无码乱码毛片国产| 插吧插吧网| 91色逼| 最新久欠一区二区免费看| 亚洲精品人伦一区二区| 99成人在线视频| 欧美色图在线视频| 久久99国产精品| 91精品酒店视频| 操逼五月天| 欧美性生交18XXXXX无码 | 国产人妻人伦精品1国产丝袜 | 欧美国产精品一二三产品在哪买 | 中文爱爱视频| 午夜久久久| 午夜xxx| 久久久久亚洲AV色欲av| 亚洲男人天堂AV| 国产三级成人| 亚洲一卡二卡| 中文字幕在线视频第一页| 俺来也俺去也www色| 激情五月天色| 成人视频A片| 操逼视频免费| 羞羞视频com.入口| 天天干精品| 国内久久| 翔田千里無碼破解| 97天天操| 亚洲在线中文字幕| 中日韩在线| 亚洲成人黄色在线| 免费a在线| 欧美嗯啊| 国产凹凸视频在线观看| 日韩无码视频一区| 国产福利91| 梁祝艳谭A级毛片| 亚洲骚妇| 91麻豆福利视频| 黑人精品XXX一区一二区| 日本精品人妻无码77777| 蜜臀99久久精品久久久懂爱| 国产成人自拍视频在线| 国产色情性黄片Av网站| 一区二区三区四区在线播放| 在线操逼视频| 18禁黄网站| 思思热在线观看视频| 国产一区二区波多野结衣| 国产操逼网站| 99热免费观看| 久久国产精品精品国产色婷婷 | 亚洲成人h| 日韩欧美在线观看视频| 九九福利视频| 激情播播网| 男女网站在线观看| 久久久久久AV| 免费A在线| 翔田千里53歳在线播放| 91人人| 五月天成人网址| 欧美老妇另类BBwBBw| 韩国无码视频| 美女被操91| 中文字幕va| 黄色自拍视频| 在线免费无码| 特大妓女BBwBBWBBw| 国产一级特黄大片| 奇米影视色偷偷| 久久国产精品久久| 91色逼| 免费视频在线观看黄| 丁香六月| 啪啪毛片| 中文字幕乱码无码人妻系列蜜桃 | 青青草精品视频| 午夜神马影院| 亚洲色伦| 久久久久久久久久国产精品免费观看-百度 | 亚洲天堂无码在线观看| 日本高清视频免费观看| 女人BBBB| 美女三片| 黑人丰满大荫蒂| 成人欧美在线观看| 国产精品v欧美精品v日韩精品| 中文字幕浅井香舞被黑人俘虏| 91久操| 蜜臀久久99精品久久久久酒店更新时间 | 天天撸天天操| 国内自拍无码| 亚洲国产另类无码| 欧美精品xxx| 特级黄色毛片| 在线看国产| 另类老妇性BBwBBw图片| 天天干在线观看视频| 欧美自拍视频| 欧美色999| 中文字幕成人在线观看| 东北A片| 亚洲无码日| 99精品免费视频| 欧美人妻激情| 午夜视频在线看| 色就色欧美| 黄色视频在线观看亚洲一区二区三区免费 | 日本特黄AA片免费视频| 激情五月俺也去| 一级视频免费观看| 亚洲无码精品视频| av中文字幕在线播放| 欧美AA视频| 亚洲三级在线免费观看| 老太奶性BBwBBw侧所| 91香蕉视频18| 亚洲有码在线播放| 美女极度色诱图片www视频| 免费的黄色视频在线观看| A片在线免费播放| 在线观看a片| 超碰人人操人人| 午夜精品视频在线观看| 国产成人无码一区二区在线观看| 国产SUV精品一区二区| 香蕉漫画在线观看18| 无码第一页| 成人做爰69片免费观看| 日木毛片| 一区二区三区四区av| 中国毛片网站| 柠檬福利第一导航| 97无码人妻| 国产17c精品视频一二三区 | 口爆av| 亚洲国产熟妇无码日韩| 91亚洲精品国偷拍自产在线观看| 黑人在线播放| 国产欧美二区综合中文字幕精品一 | 欧美在线天堂| 亚洲黄色免费在线观看| 水蜜桃视频免费| 韩国免费一级a一片在线播放| 天天干天天操天天拍| 黄色大片av| 亚洲第一成人网站| 久热在线| 99热都是精品| 一级黄色毛片视频| 大香蕉在线看| 69av网站| 中日韩精品A片中文字幕| 亚洲无码在线观看免费| 一区二区三区免费观看| 国产怡红院| 影音先锋成人资源网| 2025av在线| 日韩在线观看网址| 伊人网站| 日日操视频| 欧美在线色图| 操逼com| 亚洲黄色毛片| 操BBB操BBB| 亚洲欧洲精品成人久久曰影片| 亚洲人妻电影一区| 无码中文字幕| 国产97视频| 欧美成在线| 亚洲一区在线免费观看| 欧美VA视频| 婷婷毛片| 天天色粽合合合合合合合| 色婷婷7777| 亚洲一级婬片A片AAAA网址| 抠骚逼| 麻豆性爱| 国产在线激情视频| 国产在线观看国产精品产拍| v在线| 中文字幕日本在线| 欧美日韩一级电影| 久久免费视频6| 国产午夜精品一区二区三区嫩A | 六月婷婷中文字幕| 成人久久综合| 91视频网站免费| 日韩毛片一区二区| 亚洲日韩精品欧美一区二区yw | 91免费小视频| www.俺来也| 再深点灬好爽灬轻点久久国产| 国产香蕉av| 美女福利视频| 天天综合在线观看| 97干网| 天天射天天日天天干| 婷婷激情六月| 欧美日韩伊人| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV | 婷婷好色五月天| 日本欧洲三级| 中文字字幕中文字幕乱码| 欧美成人精品无码网站| 久久一级片| 日韩一二区| 天天操网站| 国产爱搞| 午夜操逼视频| 91欧美视频| 黄色视频一级| 一级特黄AA片| 青娱乐自拍偷拍| 亚洲va欧洲va国产va不卡| 天天艹夜夜| 无码人妻A片一区二区青苹果| 神马午夜精品91| 国产AV无码专区| 国产乱子伦一区二区三区免看 | www亚洲| 人妖和人妖互交性XXXX视频| 日本熟妇HD| 熟女人妻一区二区三区免费看| 色一本| 91av天堂| 免费aa片| 在线成人小视频| a色视频| 午夜无码鲁丝片午夜精品一区二区 | 俺去也在线播放| 懂色AV无码中字幕一区| 狠狠干2022| 动漫3D成人H无码国漫| 香蕉91| 日韩在线免费看| 久操免费在线观看| 国产精品中文字幕在线观看| 妞干网国产| 亚洲色图15| 亚洲区一区二| 台湾精品一区二区三区| 国产av日韩av| 亚洲精品成人网站| 黑人在线视频| 免费看无码| 91综合视频在线播放| 亚洲精品国产精品国自产A片同性 丰满人妻一区二区三区四区不卡 国产1级a毛a毛1级a毛1级 | 免费在线观看AV网站| 好男人WWW社区在线视频夜恋| 一区二区三级片| 日本亚洲中文字幕| 中文字幕无码在线观看视频| 亚洲砖区区免费| 亚洲精品成人一二三区| 成人激情免费视频| 婷婷丁香五月亚洲| 六月婷婷中文字幕| 热久久这里只有精品| 91人妻人人澡人人澡人人精品| 在线观看日韩AV| 日韩欧美二区| 99精品免费| 91三级视频| 91在线视频精品| 欧美一级黄色电影| 五月婷婷影院| 国产成人视频| 亚洲精品字幕| 精品國產一區二區三區久久蜜月 | 日韩中文字幕无码| 日韩美毛片| 污视频在线| 在线免费AV片| 国产女人高潮的AV毛片| 亚洲精品无码中文| 仓井空一区二区三区| 天堂网av2014| h视频| 一级黄色操逼视频| 午夜网页| 嗯啊av| 无码视频在线观看免费| 成人网站免费在线| 亚洲AV网站| 99久久免费网| 亚洲黄色视频免费| 在线观看AⅤ| 大地资源第5页在线| 激情白浆| 在线天堂999| 人人看人人爱| 日韩无码精品电影| 国精品伦一区一区三区有限公司 | 99色综合| 欧美成人精品一区二区三区| 好叼操| 99免费视频| 亚洲无码在线观看免费| 免费A级| 久久综合大香蕉| 日韩美女久久| 亚洲免费观看高清完整版在线观 | 伊人激情影院| 国产欧美另类| 九一国产在线| www.豆花视频成人版| 免费色网站| 人妻无码电影推荐| 欧美一级内射| 国内精品一区二区| 日韩精品一区二区三区四在线播放| 成人精品永久免费视频99久久精品 | 亚洲日韩三级| 欧美性受XXXX黑人XYX性爽冫 | 国产中文| 国产精品视频一区二区三区在线观看| 欧洲无码一区二区三区| 91插插插插| 亚洲家庭乱伦| 特级婬片AAAAAAA级| 国产一| 婷婷国产亚洲精品网站| 北条麻妃无码在线| 免费操逼网址| 六月综合激情| 国产午夜精品一区二区三区四区| 亚洲免费视频网| 中文字幕在线网址| 撸一撸在线视频| 亚洲黄色视频网站| 亚洲成人免费福利| 理论毛片| 免费A片在线看| 黄色电影天堂| 成人做爰69片免费观看| 婷婷五月激情网| 欧美猛男的大鷄巴| 久草大香蕉在线视频| 国产成人片在线观看| 黄a在线| 欧洲亚洲视频| 爆操91| 欧美乱伦视频| 少妇搡BBBB搡BBB搡打电话| 无码国产99精品久久久久网站| www.日韩AV| 亚洲精品人妻在线| 大香蕉网视频| 成人无码免费毛片A片| 在线观看国产欧美| 特黄色A级片视频| 操操操综合网| 色婷婷亚洲婷婷| 日韩无码中文字幕| 欧美精品A级片| 国产日韩欧美久久| 91porn在线观看| 亚洲无码高清视频在线| 日本午夜福利电影| 无码秘蜜桃一区二区| 欧美一级做| 999成人电影| 欧美三级毛片| 在线免费AV片| 三级片在线观看视频| 99视频这里有精品| 高清无码视频免费看| 亚洲免费婷婷| 懂色av| 俺也色俺也干| 国产一区二区不卡亚洲涩情 | 最近中文字幕免费mv第一季歌词大全 | 日韩操逼网| 91国产精品视频在线| 九热精品| 亚洲字幕在线观看| 国产AV一区二区三区精品| 日本一级一片免费视频| 91一区在线观看| 北条麻妃一区二区三区在线播放 | 91精品国产综合久久久蜜臀主演| 国产爱搞| 人妻japanesewoman| 91青青视频| 亚洲成人无码精品| 国产精品三级在线观看| 中文字幕亚洲有码| 在线亚洲免费观看| 日本免费黄色小视频| 日韩高清在线播放| www.91自拍| 日韩大尺度Av| 欧美AAA黄片| 撸一撸AV| 肏屄免费视频| 亚洲高清无码久久| 456成人| 青青草手机在线观看| 日本五十路| 久久婷婷久久| 亚洲无码av中文字幕| 日韩欧美视频在线| 老骚老B老太太BBW| 亚洲少妇网| 亚洲色青| 国产成人av在线| 日本高清视频九区| 热re99久久精品国产99热 | 亚洲在线中文| 欧美特黄AAAAAAAAA片| www.天天干| 日韩精品成人在线视频| 开心激情网五月天| 91人妻论坛| 一本大道香蕉av久久精东影业| 国产精品视频导航| 99视频这里有精品| 天天射日日干| 三级黄片免费看| 亚韩av| 人人妻人人色| 无码人妻日韩精品一区二区三| 操碰在线观看| 无码秘人妻一区二区三-百度| 中文字幕精品视频| 久久网一区| 一级日逼视频| 青青草原在线| 久操视频一区二区三区| 亚洲美女网站免费观看网址| 日韩成人小说| 无码午夜| 在线免费黄色网址| 亚洲小视频在线播放| 人妻熟女字幕一区二区| 黄色免费高清视频| 九九韩剧网最新电视剧免费观看| 日本A∨| 精品中文字幕在线播放| 九色PORNY国产成人| 天天操免费视频| 性视频人人| 波多野结衣视频免费在线观看| 黄片一区二区三区| 91亚洲精品久久久久蜜桃| 操婷婷逼| 午夜a片| 2025av中文字幕| 美女性爱视频网站| 无码爱爱视频| 中文字幕在线观看完整av| 国产激情无码免费| 2019天天干| 国产无套在线| www.91madou| 大香伊人中文字幕精品| 成人色播播| 91免费网站在线观看| 国产一卡二卡三卡| 51成人免费| 人人干天天操| 强奷伦奷片91| 青青草原视频在线免费观看| AV午夜| 91日逼| 无码免费毛片| 黄色视频网站国产| 欧美色成人免费在线视频| www国产在线| 久久无码高清视频| 日本欧洲三级| 伊人影院久久| 成人伊人| 国产精品久久一区二区三区影音先锋 | 久久久www成人免费毛片| 黄色电影天堂| 国产精品久久久久久久久久乐趣播| 精品爆乳| 欧美一级特黄A片免费看| 懂色av粉嫩AV蜜臀AV| 91丨国产丨白浆| 婷婷五月天综合网| 久热在线资源福利站| 黄色电影a片| 中文字幕免费在线观看| 欧美狠狠插| 亚洲三级在线播放|