黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

從vue-router看前端路由的兩種實現

瀏覽:92日期:2022-09-30 09:57:59

隨著前端應用的業務功能越來越復雜、用戶對于使用體驗的要求越來越高,單頁應用(SPA)成為前端應用的主流形式。大型單頁應用最顯著特點之一就是采用前端路由系統,通過改變URL,在不重新請求頁面的情況下,更新頁面視圖。

“更新視圖但不重新請求頁面”是前端路由原理的核心之一,目前在瀏覽器環境中這一功能的實現主要有兩種方式:

利用URL中的hash(“#”) 利用History interface在 HTML5中新增的方法

vue-router是Vue.js框架的路由插件,下面我們從它的源碼入手,邊看代碼邊看原理,由淺入深觀摩vue-router是如何通過這兩種方式實現前端路由的。

模式參數

在vue-router中是通過mode這一參數控制路由的實現模式的:

const router = new VueRouter({ mode: ’history’, routes: [...]})

創建VueRouter的實例對象時,mode以構造函數參數的形式傳入。帶著問題閱讀源碼,我們就可以從VueRouter類的定義入手。一般插件對外暴露的類都是定義在源碼src根目錄下的index.js文件中,打開該文件,可以看到VueRouter類的定義,摘錄與mode參數有關的部分如下:

export default class VueRouter { mode: string; // 傳入的字符串參數,指示history類別 history: HashHistory | HTML5History | AbstractHistory; // 實際起作用的對象屬性,必須是以上三個類的枚舉 fallback: boolean; // 如瀏覽器不支持,’history’模式需回滾為’hash’模式 constructor (options: RouterOptions = {}) {let mode = options.mode || ’hash’ // 默認為’hash’模式 this.fallback = mode === ’history’ && !supportsPushState // 通過supportsPushState判斷瀏覽器是否支持’history’模式 if (this.fallback) { mode = ’hash’ } if (!inBrowser) { mode = ’abstract’ // 不在瀏覽器環境下運行需強制為’abstract’模式 } this.mode = mode // 根據mode確定history實際的類并實例化 switch (mode) { case ’history’:this.history = new HTML5History(this, options.base)break case ’hash’:this.history = new HashHistory(this, options.base, this.fallback)break case ’abstract’:this.history = new AbstractHistory(this, options.base)break default:if (process.env.NODE_ENV !== ’production’) { assert(false, `invalid mode: ${mode}`)} } } init (app: any /* Vue component instance */) {const history = this.history // 根據history的類別執行相應的初始化操作和監聽 if (history instanceof HTML5History) { history.transitionTo(history.getCurrentLocation()) } else if (history instanceof HashHistory) { const setupHashListener = () => {history.setupListeners() } history.transitionTo(history.getCurrentLocation(),setupHashListener,setupHashListener ) } history.listen(route => { this.apps.forEach((app) => {app._route = route }) }) } // VueRouter類暴露的以下方法實際是調用具體history對象的方法 push (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.history.push(location, onComplete, onAbort) } replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.history.replace(location, onComplete, onAbort) }}

可以看出:

作為參數傳入的字符串屬性mode只是一個標記,用來指示實際起作用的對象屬性history的實現類,兩者對應關系如下:

mode history hash abstract history HTML5History HashHistory AbstractHistory

在初始化對應的history之前,會對mode做一些校驗:若瀏覽器不支持HTML5History方式(通過supportsPushState變量判斷),則mode強制設為’hash’;若不是在瀏覽器環境下運行,則mode強制設為’abstract’

VueRouter類中的onReady(), push()等方法只是一個代理,實際是調用的具體history對象的對應方法,在init()方法中初始化時,也是根據history對象具體的類別執行不同操作

在瀏覽器環境下的兩種方式,分別就是在HTML5History,HashHistory兩個類中實現的。他們都定義在src/history文件夾下,繼承自同目錄下base.js文件中定義的History類。History中定義的是公用和基礎的方法,直接看會一頭霧水,我們先從HTML5History,HashHistory兩個類中看著親切的push(), replace()方法的說起。

HashHistory

看源碼前先回顧一下原理:

hash(“#”)符號的本來作用是加在URL中指示網頁中的位置:

www.example.com/index.html#…

#符號本身以及它后面的字符稱之為hash,可通過window.location.hash屬性讀取。它具有如下特點:

hash雖然出現在URL中,但不會被包括在HTTP請求中。它是用來指導瀏覽器動作的,對服務器端完全無用,因此,改變hash不會重新加載頁面 可以為hash的改變添加監聽事件:

window.addEventListener('hashchange', funcRef, false)

每一次改變hash(window.location.hash),都會在瀏覽器的訪問歷史中增加一個記錄

利用hash的以上特點,就可以來實現前端路由“更新視圖但不重新請求頁面”的功能了。

HashHistory.push()

我們來看HashHistory中的push()方法:

push (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo(location, route => { pushHash(route.fullPath) onComplete && onComplete(route) }, onAbort)}function pushHash (path) { window.location.hash = path}

transitionTo()方法是父類中定義的是用來處理路由變化中的基礎邏輯的,push()方法最主要的是對window的hash進行了直接賦值:

window.location.hash = route.fullPath

hash的改變會自動添加到瀏覽器的訪問歷史記錄中。

那么視圖的更新是怎么實現的呢,我們來看父類History中transitionTo()方法的這么一段:

transitionTo (location: RawLocation, onComplete?: Function, onAbort?: Function) { const route = this.router.match(location, this.current) this.confirmTransition(route, () => { this.updateRoute(route) ... })}updateRoute (route: Route) { this.cb && this.cb(route) }listen (cb: Function) { this.cb = cb}

可以看到,當路由變化時,調用了History中的this.cb方法,而this.cb方法是通過History.listen(cb)進行設置的。回到VueRouter類定義中,找到了在init()方法中對其進行了設置:

init (app: any /* Vue component instance */) { this.apps.push(app) history.listen(route => { this.apps.forEach((app) => { app._route = route }) })}

根據注釋,app為Vue組件實例,但我們知道Vue作為漸進式的前端框架,本身的組件定義中應該是沒有有關路由內置屬性_route,如果組件中要有這個屬性,應該是在插件加載的地方,即VueRouter的install()方法中混合入Vue對象的,查看install.js源碼,有如下一段:

export function install (Vue) { Vue.mixin({ beforeCreate () { if (isDef(this.$options.router)) {this._router = this.$options.routerthis._router.init(this)Vue.util.defineReactive(this, ’_route’, this._router.history.current) } registerInstance(this, this) }, })}

通過Vue.mixin()方法,全局注冊一個混合,影響注冊之后所有創建的每個 Vue 實例,該混合在beforeCreate鉤子中通過Vue.util.defineReactive()定義了響應式的_route屬性。所謂響應式屬性,即當_route值改變時,會自動調用Vue實例的render()方法,更新視圖。

總結一下,從設置路由改變到視圖更新的流程如下:

$router.push() --> HashHistory.push() --> History.transitionTo() --> History.updateRoute() --> {app._route = route} --> vm.render()HashHistory.replace()

replace()方法與push()方法不同之處在于,它并不是將新路由添加到瀏覽器訪問歷史的棧頂,而是替換掉當前的路由:

replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { this.transitionTo(location, route => { replaceHash(route.fullPath) onComplete && onComplete(route) }, onAbort)} function replaceHash (path) { const i = window.location.href.indexOf(’#’) window.location.replace( window.location.href.slice(0, i >= 0 ? i : 0) + ’#’ + path )}

可以看出,它與push()的實現結構上基本相似,不同點在于它不是直接對window.location.hash進行賦值,而是調用window.location.replace方法將路由進行替換。

監聽地址欄

以上討論的VueRouter.push()和VueRouter.replace()是可以在vue組件的邏輯代碼中直接調用的,除此之外在瀏覽器中,用戶還可以直接在瀏覽器地址欄中輸入改變路由,因此VueRouter還需要能監聽瀏覽器地址欄中路由的變化,并具有與通過代碼調用相同的響應行為。在HashHistory中這一功能通過setupListeners實現:

setupListeners () { window.addEventListener(’hashchange’, () => { if (!ensureSlash()) { return } this.transitionTo(getHash(), route => { replaceHash(route.fullPath) }) })}

該方法設置監聽了瀏覽器事件hashchange,調用的函數為replaceHash,即在瀏覽器地址欄中直接輸入路由相當于代碼調用了replace()方法

HTML5History

History interface是瀏覽器歷史記錄棧提供的接口,通過back(), forward(), go()等方法,我們可以讀取瀏覽器歷史記錄棧的信息,進行各種跳轉操作。

從HTML5開始,History interface提供了兩個新的方法:pushState(), replaceState()使得我們可以對瀏覽器歷史記錄棧進行修改:

window.history.pushState(stateObject, title, URL)window.history.replaceState(stateObject, title, URL) stateObject: 當瀏覽器跳轉到新的狀態時,將觸發popState事件,該事件將攜帶這個stateObject參數的副本 title: 所添加記錄的標題 URL: 所添加記錄的URL

這兩個方法有個共同的特點:當調用他們修改瀏覽器歷史記錄棧后,雖然當前URL改變了,但瀏覽器不會立即發送請求該URL(the browser won’t attempt to load this URL after a call to pushState()),這就為單頁應用前端路由“更新視圖但不重新請求頁面”提供了基礎。

我們來看vue-router中的源碼:

push (location: RawLocation, onComplete?: Function, onAbort?: Function) { const { current: fromRoute } = this this.transitionTo(location, route => { pushState(cleanPath(this.base + route.fullPath)) handleScroll(this.router, route, fromRoute, false) onComplete && onComplete(route) }, onAbort)}replace (location: RawLocation, onComplete?: Function, onAbort?: Function) { const { current: fromRoute } = this this.transitionTo(location, route => { replaceState(cleanPath(this.base + route.fullPath)) handleScroll(this.router, route, fromRoute, false) onComplete && onComplete(route) }, onAbort)}// src/util/push-state.jsexport function pushState (url?: string, replace?: boolean) { saveScrollPosition() // try...catch the pushState call to get around Safari // DOM Exception 18 where it limits to 100 pushState calls const history = window.history try { if (replace) { history.replaceState({ key: _key }, ’’, url) } else { _key = genKey() history.pushState({ key: _key }, ’’, url) } } catch (e) { window.location[replace ? ’replace’ : ’assign’](url) }}export function replaceState (url?: string) { pushState(url, true)}

代碼結構以及更新視圖的邏輯與hash模式基本類似,只不過將對window.location.hash直接進行賦值window.location.replace()改為了調用history.pushState()和history.replaceState()方法。

在HTML5History中添加對修改瀏覽器地址欄URL的監聽是直接在構造函數中執行的:

constructor (router: Router, base: ?string) { window.addEventListener(’popstate’, e => { const current = this.current this.transitionTo(getLocation(this.base), route => { if (expectScroll) {handleScroll(router, route, current, true) } }) })}

當然了HTML5History用到了HTML5的新特特性,是需要特定瀏覽器版本的支持的,前文已經知道,瀏覽器是否支持是通過變量supportsPushState來檢查的:

// src/util/push-state.jsexport const supportsPushState = inBrowser && (function () { const ua = window.navigator.userAgent if ( (ua.indexOf(’Android 2.’) !== -1 || ua.indexOf(’Android 4.0’) !== -1) && ua.indexOf(’Mobile Safari’) !== -1 && ua.indexOf(’Chrome’) === -1 && ua.indexOf(’Windows Phone’) === -1 ) { return false } return window.history && ’pushState’ in window.history})()

以上就是hash模式與history模式源碼的導讀,這兩種模式都是通過瀏覽器接口實現的,除此之外vue-router還為非瀏覽器環境準備了一個abstract模式,其原理為用一個數組stack模擬出瀏覽器歷史記錄棧的功能。當然,以上只是一些核心邏輯,為保證系統的魯棒性,源碼中還有大量的輔助邏輯,也很值得學習。此外在vue-router中還有路由匹配、router-view視圖組件等重要部分

兩種模式比較

在一般的需求場景中,hash模式與history模式是差不多的,但幾乎所有的文章都推薦使用history模式,理由竟然是:'#' 符號太丑...0_0 '

如果不想要很丑的 hash,我們可以用路由的 history 模式 ——官方文檔

當然,嚴謹的我們肯定不應該用顏值評價技術的好壞。根據MDN的介紹,調用history.pushState()相比于直接修改hash主要有以下優勢:

pushState設置的新URL可以是與當前URL同源的任意URL;而hash只可修改#后面的部分,故只可設置與當前同文檔的URL pushState設置的新URL可以與當前URL一模一樣,這樣也會把記錄添加到棧中;而hash設置的新值必須與原來不一樣才會觸發記錄添加到棧中 pushState通過stateObject可以添加任意類型的數據到記錄中;而hash只可添加短字符串 pushState可額外設置title屬性供后續使用 history模式的一個問題

我們知道對于單頁應用來講,理想的使用場景是僅在進入應用時加載index.html,后續在的網絡操作通過Ajax完成,不會根據URL重新請求頁面,但是難免遇到特殊情況,比如用戶直接在地址欄中輸入并回車,瀏覽器重啟重新加載應用等。

hash模式僅改變hash部分的內容,而hash部分是不會包含在HTTP請求中的:

http://oursite.com/#/user/id // 如重新請求只會發送http://oursite.com/

故在hash模式下遇到根據URL請求頁面的情況不會有問題。

而history模式則會將URL修改得就和正常請求后端的URL一樣

http://oursite.com/user/id

在此情況下重新向后端發送請求,如后端沒有配置對應/user/id的路由處理,則會返回404錯誤。官方推薦的解決辦法是在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。同時這么做以后,服務器就不再返回 404 錯誤頁面,因為對于所有路徑都會返回 index.html 文件。為了避免這種情況,在 Vue 應用里面覆蓋所有的路由情況,然后在給出一個 404 頁面。或者,如果是用 Node.js 作后臺,可以使用服務端的路由來匹配 URL,當沒有匹配到路由的時候返回 404,從而實現 fallback。

直接加載應用文件

Tip: built files are meant to be served over an HTTP server.

Opening index.html over file:// won’t work.

Vue項目通過vue-cli的webpack打包完成后,命令行會有這么一段提示。通常情況,無論是開發還是線上,前端項目都是通過服務器訪問,不存在 'Opening index.html over file://' ,但程序員都知道,需求和場景永遠是千奇百怪的,只有你想不到的,沒有產品經理想不到的。

本文寫作的初衷就是遇到了這樣一個問題:需要快速開發一個移動端的展示項目,決定采用WebView加載Vue單頁應用的形式,但沒有后端服務器提供,所以所有資源需從本地文件系統加載:

// AndroidAppWrapperpublic class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);webView = new WebView(this);webView.getSettings().setJavaScriptEnabled(true);webView.loadUrl('file:///android_asset/index.html');setContentView(webView); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true;}return false; }}

此情此景看來是必須 'Opening index.html over file://' 了,為此,我首先要進行了一些設置

在項目config.js文件中將assetsPublicPath字段的值改為相對路徑 ’./’ 調整生成的static文件夾中圖片等靜態資源的位置與代碼中的引用地址一致

這是比較明顯的需要改動之處,但改完后依舊無法順利加載,經過反復排查發現,項目在開發時,router設置為了history模式(為了美觀...0_0'),當改為hash模式后就可正常加載了。

為什么會出現這種情況呢?我分析原因可能如下:

當從文件系統中直接加載index.html時,URL為:

file:///android_asset/index.html

而首頁視圖需匹配的路徑為path: ’/’ :

export default new Router({ mode: ’history’, routes: [ { path: ’/’, name: ’index’, component: IndexView } ]})

我們先來看history模式,在HTML5History中:

ensureURL (push?: boolean) { if (getLocation(this.base) !== this.current.fullPath) { const current = cleanPath(this.base + this.current.fullPath) push ? pushState(current) : replaceState(current) }}export function getLocation (base: string): string { let path = window.location.pathname if (base && path.indexOf(base) === 0) { path = path.slice(base.length) } return (path || ’/’) + window.location.search + window.location.hash}

邏輯只會確保存在URL,path是通過剪切的方式直接從window.location.pathname獲取到的,它的結尾是index.html,因此匹配不到 ’/’ ,故 'Opening index.html over file:// won’t work' 。

再看hash模式,在HashHistory中:

export class HashHistory extends History { constructor (router: Router, base: ?string, fallback: boolean) { ... ensureSlash() } // this is delayed until the app mounts // to avoid the hashchange listener being fired too early setupListeners () { window.addEventListener(’hashchange’, () => { if (!ensureSlash()) {return } ... }) } getCurrentLocation () { return getHash() }}function ensureSlash (): boolean { const path = getHash() if (path.charAt(0) === ’/’) { return true } replaceHash(’/’ + path) return false}export function getHash (): string { const href = window.location.href const index = href.indexOf(’#’) return index === -1 ? ’’ : href.slice(index + 1)}

我們看到在代碼邏輯中,多次出現一個函數ensureSlash(),當#符號后緊跟著的是’/’,則返回true,否則強行插入這個’/’,故我們可以看到,即使是從文件系統打開index.html,URL依舊會變為以下形式:

file:///C:/Users/dist/index.html#/

getHash()方法返回的path為 ’/’ ,可與首頁視圖的路由匹配。

故要想從文件系統直接加載Vue單頁應用而不借助后端服務器,除了打包后的一些路徑設置外,還需確保vue-router使用的是hash模式。

以上就是從vue-router看前端路由的兩種實現的詳細內容,更多關于vue前端路由的兩種實現的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 天堂中文最新版在线官网在线 | 337p日本欧洲亚洲大胆艺术图 | 国产男女猛烈无遮挡a片漫画 | 粉嫩粉嫩的虎白女18在线软件 | 成人精品天堂一区二区三区 | 国产精品一区二区欧美黑人喷潮水 | 亚洲一区二区三区在线观看视频 | 国产精品无码一区二区桃花视频 | 午夜无码大尺度福利视频 | av中文字幕潮喷人妻系列 | 成人羞羞在线观看网站 | 亚洲欧美日韩国产综合精品二区 | 亚洲国产av高清无码 | 欧美视频亚洲图片 | 黄瓜视频91| 欧美日韩亚洲中文字幕一区二区三区 | 一本色道久久综合无码人妻 | 2022国产成人精品视频人 | 蜜桃av噜噜一区二区三区 | 亚洲成a∨人片在无码2023 | 天天躁狠狠躁狠狠躁夜夜躁68 | 国产成人精品亚洲 | 欧美特级a | 久久人人爽爽爽人久久久 | 性开放xxxhd视频 | 欧美日韩高清一区 | 欧美黄色性视频 | 无码国产激情在线观看 | 婷婷色亚洲 | 久久艹国产精品 | 又色又爽又高潮免费视频观看酒店 | 动漫卡通精品一区二区三区介绍 | 日韩精品一卡2卡3卡4卡乱码的功能 | 日韩精品第一 | 高h1v1翁妇肉乱怀孕 | 国产精品久久久久久福利一牛影视 | 国产a级免费视频 | 中文字幕在线观看免费 | 天堂俺去俺来也www 天堂俺去俺来也www久久婷婷 | 人人妻人人澡人人爽久久av | av片在线观看免费 | 蜜桃精品在线观看 | 久久精品国产欧美亚洲人人爽 | 亚洲国产精久久久久久久 | 91国偷自产一区二区使用方法 | 97久久精品人人澡人人爽古装 | 亚洲精品中文字幕乱码无线 | 午夜免费1000 | 亚洲线精品一区二区三区 | 欧美成人黄色 | 日韩三级av在线 | 香港三级精品三级在线专区 | 色偷偷88888欧美精品久久久 | 88国产精品 | 舒淇三级露全乳视频在 | 久久艹精品 | 国内大量揄拍人妻精品視頻 | 黄色大全在线观看 | 亚洲妓女综合网99 | 精品国产精品国产偷麻豆 | 老妇肥熟凸凹丰满刺激小说 | 亚州男人的天堂 | 亚洲欧美日韩一区在线观看 | 性xxxxx欧美老富婆 | 国产在线综合视频 | 日本中文在线视频 | aaaa级片| 极品少妇xxxx精品少妇偷拍 | 天天躁日日躁狠狠躁 | 欧美一区二区三区爽爽爽 | 国产乱配视频免费观看 | 爱情岛论坛亚洲品质自拍 | 久久岛国 | 天天躁夜夜躁狠狠躁2021牛牛 | 欧美人与性动交ccoo | 国产精品久久久久久婷婷动漫 | 免费观看性欧美大片无片 | 精品www日韩熟女人妻 | 国产成人精品一区二三区四区五区 | 亚洲精品自产拍在线观看亚瑟 | 亚洲女同恋hd | 国产麻豆精东果冻传媒 | 精品久久网站 | 日韩激情视频网站 | 一区二区视频观看 | 日韩三级成人 | 精人妻无码一区二区三区 | 激情一区二区 | 色护士极品影院 | 午夜色大片| 国产黄色三级网站 | 深夜福利啪啪片 | 久久久精品中文字幕 | 亚洲老妈激情一区二区三区 | 婷婷午夜激情 | 国产黑丝在线视频 | 欧美粗大猛烈 | 男女啪啪进出阳道猛进 | 黄色工厂这里只有精品 | 一区二区三区偷拍 | 亚洲美女自拍偷拍 | 亚洲丝袜av | 亚洲妇女捆绑hd | 成人综合网站 | 久久精品一区二区三区四区 | 亚欧色一区w666天堂 | 欧美天堂一区二区 | 久热中文字幕无码视频 | 精品视频9999 | 天天躁日日躁狠躁欧美 | 亚洲精品无码久久 | 国产精品xxx在线 | 国产1区2| 国产精品日 | 波多野结衣一区二区三区高清av | 日本丰满护士爆乳xxxx | 国产真实交换配乱吟91 | 中文在线中文a | 丰满少妇弄高潮了www | 午夜伦y4480影院中文字幕 | 亚洲国产美女精品久久久 | 91精品国模一区二区三区 | 日剧再来一次第十集 | 亚洲成a人片777777久久 | 亚洲精品无人区 | 中文字幕理伦片免费看 | 91五月色国产在线观看 | 爱草在线| 欧美日a | 免费黄色av片 | 亚洲91在线视频 | 国产精品人妻 | 欧美怡红院视频一区二区三区 | 亚洲国产成人精品久久久国产成人 | 久久99精品久久久久久园产越南 | 欧洲高潮视频在线看 | 亚洲欧洲av综合色无码 | 亚洲精品视频在线观看免费 | 亚洲午夜精品一区二区 | 中文字幕乱码人妻无码久久 | 成人男女做爰免费视频网老司机 | 91丝袜放荡丝袜脚交 | 中文字幕欧美久久日高清 | 欧美交换配乱吟粗大在线观看 | 欧美无遮挡很黄裸交视频 | av中文字幕在线播放 | 免费成人黄 | 在线观看成年人视频 | 香蕉av福利精品导航 | 成人毛片在线精品国产 | 精品国产乱码久久久久久口爆 | yy111111少妇无码理论片 | 97超视频在线观看 | 在线观看的毛片 | yy1111111少妇影院乱码 | 黄色三级网址 | 日本一区午夜艳熟免费 | 成人性生活毛片 | 中文在线а√在线 | 少妇高潮网站 | 日韩中出在线 | 欧美成人图区 | 97干婷婷| 一区二区三区在线观看视频 | 伊人网在线 | 日韩一级视频 | 96免费视频 | 国产精品一区久久久 | 免费网站日本a级淫片免费看 | 7色av| 私人av| 丝袜诱惑一区二区 | 日噜| 国内视频精品 | 波多野av在线 | 国内丰满少妇猛烈精品播 | 久久久久久久久久网 | av黄色影院 | 97视频人人澡人人爽 | 99国产欧美另类久久久精品 | 青草青草久热精品视频在线观看 | 国产视频一区二区在线 | 久久亚洲精品成人av无码网站 | 500篇短篇超级乱淫的小说 | 911久久| 精品久久久久久久久久久下田 | 在线观看免费黄色 | 国产乱人无码伦av在线a | 日韩性生活大片 | 国产成人精品亚洲777人妖 | 香蕉视频在线观看网址 | 中文字幕中文在线 | 黄色小视频免费网站 | 国产精品免费一区二区三区都可以 | 亚洲高清视频网站 | 国模无码大尺度一区二区三区 | 国产成人片无码视频在线观看 | 日韩免费三级 | 国产精品久久久久精k8 | 美女100%挤奶水视频吃胸 | 久久福利精品 | 岬奈奈美精品一区二区 | 麻豆一区二区 | 亚洲熟妇av乱码在线观看 | 成年午夜性影院 | 播五月婷婷 | 国产成a人亚洲精品无码久久网 | 婷婷色综合| 免费的很黄很污的视频 | 伦理片免费完整片在线观看 | 国产尤物精品视频 | 成年女人黄小视频 | 18禁免费观看网站 | 国产japanhdxxxx麻豆| 天天操天天插 | 亚洲精品成人网站在线观看 | 精品熟女少妇av免费久久 | 大陆女明星乱淫合集 | 日本毛片在线 | 国产二级一片内射视频插放 | 一区二区三区回区在观看免费视频 | 日本大片在线播放在线软件功能 | 公妇乱淫真实生活 | 国产免费自拍视频 | 久久国产区 | 国产乱淫精品一区二区三区毛片 | 思九九爱九九 | 国产xxxx做受性欧美88 | 91久久精品一区二区二区 | 久久精品国产精品亚洲蜜月 | 性一交一伦一理一色一情 | 欧美成人性生交大片免费看 | 国内精品久久久久久久 | 青青久在线视频免费观看 | 久久影院视频 | 精品一区二区三区东京热 | 国产免费视频一区二区裸体 | 无码专区—va亚洲v天堂麻豆 | xxxx日本黄色 | 草草网站影院白丝内射 | 日本在线视频一区 | 国产成人久久久77777 | 182tv在线观看免费午夜免费线路 | 午夜精品久久久久久99热明星 | 国产成人精品午夜福利 | 曰本极品少妇videossexhd 曰本一级黄色片 | 天天躁天天弄天天爱 | 中文字幕人妻无码专区 | 骚虎av在线 | 黄色一级片国产 | 色婷婷av777 色婷婷av99xx | 深夜福利院 | 国产精品乱码久久久久久1区2区 | 蜜桃av噜噜一区二区三区 | 全黄一级片 | 久久最新| 国产精品扒开腿做爽爽爽视频 | 51精品国产人成在线观看 | www.狠狠操.com | 午夜精品一二三区 | 久久久妇女国产精品影视 | 99re这里只有精品在线 | 无码精品国产va在线观看 | 超碰五月天| 日韩一区二区在线免费观看 | 亚洲精品高潮呻吟久久av | 免费成人蒂法网站 | 国产aⅴxxx片| 97人人模人人爽人人喊电影 | 在线观看国产亚洲 | 欧美视频区 | yy8男人的天堂 | 国产成人三级三级三级97 | 青青毛片 | 日韩国产精品一区 | 久操久热| 国产精品久久久久久久久久免费 | 欧美日韩在线观看精品 | 强开小婷嫩苞又嫩又紧视频韩国 | 免费爱爱网址 | 黄色应用在线观看 | 小12萝8禁在线喷水观看 | 精品视频国产香蕉尹人视频 | av大片在线看 | 六个黑人玩一个中国少妇视频 | 捆绑凌虐一区二区三区 | 国产精品久久天天躁 | 亚洲色图网友自拍 | 久久久三级视频 | 青青青青青手机视频在线观看视频 | 182tv午夜| www.爱操| 67194成人 | 成年人午夜免费视频 | 亚洲欧美第一 | 亚洲色成人www永久在线观看 | 男女啪啪做爰高潮www成人福利 | 成人免费无码av | 三级黄色在线视频 | 天天综合91 | 国产中文字幕在线视频 | 秋霞鲁丝片av无码少妇 | √最新版天堂资源网在线 | 欧美视频在线观看亚洲欧 | 黄色精品一区二区三区 | 亚洲欧美日本另类 | 国产精品国产三级国产aⅴ9色 | 人妻少妇中文字幕久久 | 成人免费视频7777777 | 人妻中文字幕在线网站 | 一个人看的www日本高清视频 | 亚洲综合色区中文字幕 | 影音先锋女人av鲁色资源网久久 | 欧美丝袜一区二区三区 | 国产精品人人做人人爽 | 小早川怜子xxxxaⅴ在线 | 老妇女性较大毛片 | 醉酒后少妇被疯狂内射视频 | 日韩在线免费视频观看 | 懂色a v| 国产精久久久久久妇女av | 国产成人艳妇aa视频在线 | 亚洲国产精品国自产拍av | 18禁女裸乳扒开免费视频 | 性欧美video另类hdbbw | 成人深夜在线 | 欧美在线不卡 | 亚洲一区二区乱码 | 欧美日韩一区二区在线观看 | 亚洲啪av永久无码精品放毛片 | 日本做爰高潮视频 | 6080私人午夜性爽快影院 | 久久精品一二三区白丝高潮 | 天海翼精品久久中文字幕 | 99精品视频在线观看免费 | 久久久久国产精品嫩草影院 | 久久综合久久久 | 黄色片特级 | 亚洲精品中文字幕 | 狠狠色噜噜狠狠狠狠97首创麻豆 | 亚洲欧美偷拍另类a∨色屁股 | 亚洲欧洲日本一区二区三区 | av高清免费| 国产精品v日韩精品v在线观看 | 亚洲精品大全 | 五月婷婷伊人网 | 张柏芝亚洲一区二区三区 | 污网站免费观看 | 一区二区三区黄 | 一区二区三区四区在线播放 | 超碰在线观看免费版 | 免费成人高清视频 | 天天鲁一鲁摸一摸爽一爽 | 99亚洲一区| 国产国产精品久久久久 | 天堂а在线中文在线新版 | 亚洲视频精品在线观看 | 亚洲中字在线 | 免费人妻无码不卡中文字幕18禁 | 婷婷综合少妇啪啪喷水 | 日韩黄色一级 | 99久久精品一区二区成人 | 久久人搡人人玩人妻精品首页 | 成人免费在线视频观看 | 欧美va天堂在线电影 | 黑人粗长大战亚洲女 | 69亚洲精品久久久蜜桃小说 | 亚洲精品无播放器在线播放 | 不卡中文| 韩国一区二区三区美女美女秀 | 97久久精品亚洲中文字幕无码 | 91超碰caoporm国产香蕉 | 国产成人手机高清在线观看网站 | 最新成人av | 大黑人交xxxxxhd性爽 | 精品夜夜爽欧美毛片视频 | 色噜噜一区二区三区 | 涩涩屋导航福利av导航 | 成人黄色一级视频 | 一级片在线免费 | 亚洲精品乱码久久 | 曰韩无码av一区二区免费 | 乌克兰美女浓毛bbw 九九久久精品国产 | 先锋av资源在线 | 一级欧美视频 | 国产在线视频第一页 | 97久久精品一区二区三区观看 | 国产v综合v亚洲欧美久久 | 缅甸午夜性猛交xxxx | av无码精品一区二区三区四区 | 长腿校花无力呻吟娇喘 | 久久久亚洲国产精品麻豆综合天堂 | 草草黑森林av导航 | 天天爽夜夜爽夜夜爽精品视频 | 夜色福利院在线观看免费 | 午夜成人亚洲理论片在线观看 | 久久99精品久久久久久hb无码 | 久久视频免费在线观看 | 成人无码精品一区二区三区 | 中文一区在线观看 | 亚洲va中文字幕无码久久 | 欧美一级高潮片 | 亚洲天堂视频一区 | 精品国产一区二区三区不卡蜜臂 | 6080yy精品一区二区三区 | 美女赤身免费网站 | 日韩在线黄色 | 九九热精品视频在线 | 在线观看亚洲色图 | 亚洲精品国产suv一区 | 国产乱妇乱子在线播视频播放网站 | 免费黄色小说视频 | 超碰天堂| 国产精品午夜影院 | av手机免费看 | 午夜成人爽爽爽视频在线观看 | 亚洲成人av中文字幕 | 亚洲va久久久噜噜噜久久男同 | 91国内产香蕉 | 欧美交换配乱吟粗大在线观看 | 午夜美女福利 | 五月天狠狠干 | 国产黄色网络 | 欧美成人一区在线观看 | 69亚洲精品久久久蜜桃小说 | 久久久久免费看 | 中文字幕第四页 | 少妇性荡欲午夜性开放视频剧场 | 夜夜久久久 | 午夜yyy黄a一区二区三区 | 久久中文av | 农村寡妇一区二区三区 | 免费视频网站在线观看入口 | 国产精品精华液网站 | 成人免费视频一区二区三区 | 日本一区二区精品视频 | 色五月丁香六月欧美综合 | 手机国产乱子伦精品视频 | 狠狠操五月天 | 欧美色噜噜| 日本特黄视频 | 柠檬福利精品视频导航 | 日本免费一二区 | 大胸少妇午夜三级 | 噜噜噜久久亚洲精品国产品91 | 222aaa| 一区二区三区免费观看视频 | 综合久久久久 | 韩国三级hd两男一女 | 热re99久久精品国99热线看 | 91在线网站 | 亚色图 | 美女作爱网站 | 成人自拍视频网站 | 久久国产精品首页 | 国产tv在线观看 | 午夜性刺激在线观看 | 九九九九九依人 | 高潮射精日本韩国在线播放 | 制服 丝袜 激情 欧洲 亚洲 | 97久久精品人人爽人人爽蜜臀 | 欧美自拍另类欧美综合图片区 | 亚洲第一色网 | 大学生a做爰免费观看 | 日韩a无v码在线播放免费 | 性色av无码免费一区二区三区 | 色图一区| 久久精品中文騷妇女内射 | 天堂六月婷婷 | 综合精品久久久 | 六月婷婷色 | 欧美亚洲专区 | 嫩模周妍希视频一区二区 | 国产精品久久久久无码人妻 | xxxx精品| 一起草视频在线播放 | 欧美亚洲一区 | 日本欧美另类 | 亚洲欧美伦理 | 嫩草大剧院 | 黄色在线观看免费视频 | 亚洲日韩一区二区 | 欧美不卡一二三 | 精品无码一区二区三区爱欲 | 精品在线不卡 | 精品一区精品二区 | 亚洲精品二 | 国产精品九九热 | 99久久精品费精品国产风间由美 | 亚洲 丝袜 另类 动漫 二区 | 久久亚洲中文字幕无码 | 亚洲aaaa级特黄毛片 | 久久av红桃一区二区小说 | 久久人人爽爽爽人久久久 | 中文字幕视频在线 | www.日韩精品 | 日韩人妻ol丝袜av一二区 | 西西人体做爰大胆gogo | 免费国产又色又爽又黄的软件 | 一区二区不卡视频 | 国产69精品久久久久9999 | 国产精品伦一区二区三级视频 | 色婷婷国产精品 | 日韩精品免费视频 | 国产a级精品毛片 | 免费久久一级欧美特大黄 | 一品二品三品中文字幕 | 久久综合伊人77777 | 人妻夜夜爽天天爽三区丁香花 | 国产真人真事毛片 | 少妇放荡的呻吟干柴烈火动漫 | 午夜天堂一区人妻 | 亚洲精品乱码久久久久蜜桃 | 欧美三级图片 | 中文字幕 视频一区 | 草久久久久 | 日韩av片无码一区二区不卡电影 | 久操av在线 | 伊人久久一区二区三区 | 小仙女av| 国产精品无码一区二区在线观一 | 高清三区| 屁屁影院一区二区三区 | 福利一区在线 | 日韩欧美中文在线观看 | 久久日本三级韩国三级 | 国外成人在线视频网站 | 国产精品网站视频 | 成人夜色视频 | 91精产国品一二三区在线观看 | 国产一区二区三区免费 | 自拍偷拍综合 | 好爽…又高潮了免费毛片 | 日批视频在线免费看 | 国产精品夜间视频香蕉 | 免费欧美一级视频 | 欧美成人四级hd版 | 久久久久久久久久一级 | 男人天堂伊人 | 欧美经典片免费观看大全 | 熟妇无码乱子成人精品 | 国产日韩欧美亚洲精品中字 | 粉嫩av国产一区二区三区 | 动漫美女爆羞羞动漫在线蜜桃 | 成年人网站黄色 | 国模无码视频一区二区三区 | 另类小说五月天 | 久久久久国产精品嫩草影院 | 日韩黄色三级 | 国产精品永久免费视频 | 人妻少妇久久久久久97人妻 | 欧美 亚洲 中文 国产 综合 | 本道久久综合无码中文字幕 | 国产成人成网站在线播放青青 | 不良网站在线免费观看 | 四影虎影免费在线观看 | 僵尸叔叔在线观看国语高清免费观看 | 色一情一乱一伦一区二区三区 | 性av网| 免费观看a级片 | 国产ts人妖另类 | 国产美女亚洲精品久久久毛片小说 | 亚洲欧美日韩在线不卡 | 精品一区二区三区无码视频 | 中文字幕国产在线观看 | 亚洲男人在线 | 欧美 日韩 国产 在线观看 | 亚洲国产视频一区 | 精品欧美日韩 | 国产精品www色诱视频 | 综合激情亚洲丁香社区 | 日本啪啪片 | 中文字幕av播放 | 精品视频国产香蕉尹人视频 | 97国产超薄黑色肉色丝袜 | 人人人妻人人澡人人爽欧美一区 | 日本久久www成人免 日本久久不卡 | 日本不卡免费在线 | 麻豆av一区 | 亚洲一区二区三区四区在线 | 精品人妻中文字幕有码在线 | 国产精品国产a | 午夜精品久久久久久久99老熟妇 | 国产88av| 黑人一区 | 极品久久 | 91精品国产高清一区二区三区蜜臀 | 国产精品户外野外 | 老司机午夜免费精品视频 | 欧美xxxx性 | 91户外露出一区二区 | 国模裸体无码xxxx视频 | 黄三级| 91精品国产亚一区二区三区老牛 | 粗大的内捧猛烈进出在线视频 | 377久久日韩精品免费 | 亚洲成人免费av | 色综合天天综合色综合av | 99久热 | 久久中文字幕在线 | 91久久国产涩涩涩涩涩涩 | 欧美黄色大片免费观看 | 亚洲韩欧美第25集完整版 | 亚洲成av人不卡无码影片 | 日韩亚洲在线观看 | 蜜桃传媒一区二区亚洲 | 久久桃色| 日本毛片高清免费视频 | 欧美精品偷自拍另类在线观看 | 国产精品自在线拍国产手青青机版 | 久久久久久亚洲精品不卡4k岛国 | 少妇一级淫免费播放 | 久久综合91 | 亚洲精品中文字幕乱码三区91 | 国产亚洲精品久久久久久无几年桃 |