【Vue.js】875- Vue 3.0 進(jìn)階之自定義事件探秘
這是 Vue 3.0 進(jìn)階系列 的第二篇文章,該系列的第一篇文章是 Vue 3.0 進(jìn)階之指令探秘。本文阿寶哥將以一個(gè)簡單的示例為切入點(diǎn),帶大家一起一步步揭開自定義事件背后的秘密。
<div?id="app">div>
<script>
???const?app?=?Vue.createApp({
?????template:?' ',
?????methods:?{
???????sayHi()?{
?????????console.log('你好,我是阿寶哥!');
???????}
?????}
????})
???app.component('welcome-button',?{
?????emits:?['welcome'],
?????template:?`
???????
??????`
????})
????app.mount("#app")
script>
在以上示例中,我們先通過 Vue.createApp 方法創(chuàng)建 app 對象,之后利用該對象上的 component 方法注冊全局組件 —— ?welcome-button 組件。在定義該組件時(shí),我們通過 emits 屬性定義了該組件上的自定義事件。當(dāng)然用戶點(diǎn)擊 歡迎 按鈕時(shí),就會發(fā)出 welcome 事件,之后就會調(diào)用 sayHi 方法,接著控制臺就會輸出 你好,我是阿寶哥! 。
雖然該示例比較簡單,但也存在以下 2 個(gè)問題:
$emit方法來自哪里?自定義事件的處理流程是什么?
下面我們將圍繞這些問題來進(jìn)一步分析自定義事件背后的機(jī)制,首先我們先來分析第一個(gè)問題。
一、$emit 方法來自哪里?
使用 Chrome 開發(fā)者工具,我們在 sayHi 方法內(nèi)部加個(gè)斷點(diǎn),然后點(diǎn)擊 歡迎 按鈕,此時(shí)函數(shù)調(diào)用棧如下圖所示:

在上圖右側(cè)的調(diào)用棧,我們發(fā)現(xiàn)了一個(gè)存在于 componentEmits.ts 文件中的 emit 方法。但在模板中,我們使用的是 $emit 方法,為了搞清楚這個(gè)問題,我們來看一下 onClick 方法:

由上圖可知,我們的 $emit 方法來自 _ctx 對象,那么該對象是什么對象呢?同樣,利用斷點(diǎn)我們可以看到 _ctx 對象的內(nèi)部結(jié)構(gòu):

很明顯 _ctx 對象是一個(gè) Proxy 對象,如果你對 Proxy 對象還不了解,可以閱讀 你不知道的 Proxy 這篇文章。當(dāng)訪問 _ctx 對象的 $emit 屬性時(shí),將會進(jìn)入 get 捕獲器,所以接下來我們來分析 get 捕獲器:

通過 [[FunctionLocation]] 屬性,我們找到了 get 捕獲器的定義,具體如下所示:
//?packages/runtime-core/src/componentPublicInstance.ts
export?const?RuntimeCompiledPublicInstanceProxyHandlers?=?extend(
??{},
??PublicInstanceProxyHandlers,
??{
????get(target:?ComponentRenderContext,?key:?string)?{
??????//?fast?path?for?unscopables?when?using?`with`?block
??????if?((key?as?any)?===?Symbol.unscopables)?{
????????return
??????}
??????return?PublicInstanceProxyHandlers.get!(target,?key,?target)
????},
????has(_:?ComponentRenderContext,?key:?string)?{
??????const?has?=?key[0]?!==?'_'?&&?!isGloballyWhitelisted(key)
??????//?省略部分代碼
??????return?has
????}
??}
)
觀察以上代碼可知,在 get 捕獲器內(nèi)部會繼續(xù)調(diào)用 PublicInstanceProxyHandlers 對象的 get 方法來獲取 key 對應(yīng)的值。由于 PublicInstanceProxyHandlers 內(nèi)部的代碼相對比較復(fù)雜,這里我們只分析與示例相關(guān)的代碼:
//?packages/runtime-core/src/componentPublicInstance.ts
export?const?PublicInstanceProxyHandlers:?ProxyHandler<any>?=?{
??get({?_:?instance?}:?ComponentRenderContext,?key:?string)?{
????const?{?ctx,?setupState,?data,?props,?accessCache,?type,?appContext?}?=?instance
???
????//?省略大部分內(nèi)容
????const?publicGetter?=?publicPropertiesMap[key]
????//?public?$xxx?properties
????if?(publicGetter)?{
??????if?(key?===?'$attrs')?{
????????track(instance,?TrackOpTypes.GET,?key)
????????__DEV__?&&?markAttrsAccessed()
??????}
??????return?publicGetter(instance)
????},
????//?省略set和has捕獲器
}
在上面代碼中,我們看到了 publicPropertiesMap 對象,該對象被定義在 componentPublicInstance.ts 文件中:
//?packages/runtime-core/src/componentPublicInstance.ts
const?publicPropertiesMap:?PublicPropertiesMap?=?extend(Object.create(null),?{
??$:?i?=>?i,
??$el:?i?=>?i.vnode.el,
??$data:?i?=>?i.data,
??$props:?i?=>?(__DEV__???shallowReadonly(i.props)?:?i.props),
??$attrs:?i?=>?(__DEV__???shallowReadonly(i.attrs)?:?i.attrs),
??$slots:?i?=>?(__DEV__???shallowReadonly(i.slots)?:?i.slots),
??$refs:?i?=>?(__DEV__???shallowReadonly(i.refs)?:?i.refs),
??$parent:?i?=>?getPublicInstance(i.parent),
??$root:?i?=>?getPublicInstance(i.root),
??$emit:?i?=>?i.emit,
??$options:?i?=>?(__FEATURE_OPTIONS_API__???resolveMergedOptions(i)?:?i.type),
??$forceUpdate:?i?=>?()?=>?queueJob(i.update),
??$nextTick:?i?=>?nextTick.bind(i.proxy!),
??$watch:?i?=>?(__FEATURE_OPTIONS_API__???instanceWatch.bind(i)?:?NOOP)
}?as?PublicPropertiesMap)
在 publicPropertiesMap 對象中,我們找到了 $emit 屬性,該屬性的值為 $emit: i => i.emit,即 $emit 指向的是參數(shù) i 對象的 emit 屬性。下面我們來看一下,當(dāng)獲取 $emit 屬性時(shí),target 對象是什么:

由上圖可知 target 對象有一個(gè) _ 屬性,該屬性的值是一個(gè)對象,且該對象含有 vnode、type 和 parent 等屬性。因此我們猜測 _ 屬性的值是組件實(shí)例。為了證實(shí)這個(gè)猜測,利用 Chrome 開發(fā)者工具,我們就可以輕易地分析出組件掛載過程中調(diào)用了哪些函數(shù):

在上圖中,我們看到了在組件掛載階段,調(diào)用了 createComponentInstance 函數(shù)。顧名思義,該函數(shù)用于創(chuàng)建組件實(shí)例,其具體實(shí)現(xiàn)如下所示:
//?packages/runtime-core/src/component.ts
export?function?createComponentInstance(
??vnode:?VNode,
??parent:?ComponentInternalInstance?|?null,
??suspense:?SuspenseBoundary?|?null
)?{
??const?type?=?vnode.type?as?ConcreteComponent
??const?appContext?=
????(parent???parent.appContext?:?vnode.appContext)?||?emptyAppContext
??const?instance:?ComponentInternalInstance?=?{
????uid:?uid++,
????vnode,
????type,
????parent,
????appContext,
????//?省略大部分屬性
????emit:?null?as?any,?
????emitted:?null,
??}
??if?(__DEV__)?{?//?開發(fā)模式
????instance.ctx?=?createRenderContext(instance)
??}?else?{?//?生產(chǎn)模式
????instance.ctx?=?{?_:?instance?}
??}
??instance.root?=?parent???parent.root?:?instance
??instance.emit?=?emit.bind(null,?instance)
??return?instance
}
在以上代碼中,我們除了發(fā)現(xiàn) instance 對象之外,還看到了 instance.emit = emit.bind(null, instance) 這個(gè)語句。這時(shí)我們就找到了 $emit 方法來自哪里的答案。弄清楚第一個(gè)問題之后,接下來我們來分析自定義事件的處理流程。
二、自定義事件的處理流程是什么?
要搞清楚,為什么點(diǎn)擊 歡迎 按鈕派發(fā) welcome 事件之后,就會自動調(diào)用 sayHi 方法的原因。我們就必須分析 emit 函數(shù)的內(nèi)部處理邏輯,該函數(shù)被定義在 runtime-core/src/componentEmits.t 文件中:
//?packages/runtime-core/src/componentEmits.ts
export?function?emit(
??instance:?ComponentInternalInstance,
??event:?string,
??...rawArgs:?any[]
)?{
??const?props?=?instance.vnode.props?||?EMPTY_OBJ
?//?省略大部分代碼
??let?args?=?rawArgs
??//?convert?handler?name?to?camelCase.?See?issue?#2249
??let?handlerName?=?toHandlerKey(camelize(event))
??let?handler?=?props[handlerName]
??if?(handler)?{
????callWithAsyncErrorHandling(
??????handler,
??????instance,
??????ErrorCodes.COMPONENT_EVENT_HANDLER,
??????args
????)
??}
}
其實(shí)在 emit 函數(shù)內(nèi)部還會涉及 v-model update:xxx 事件的處理,關(guān)于 v-model 指令的內(nèi)部原理,阿寶哥會寫單獨(dú)的文章來介紹。這里我們只分析與當(dāng)前示例相關(guān)的處理邏輯。
在 emit 函數(shù)中,會使用 toHandlerKey 函數(shù)把事件名轉(zhuǎn)換為駝峰式的 handlerName:
//?packages/shared/src/index.ts
export?const?toHandlerKey?=?cacheStringFunction(
??(str:?string)?=>?(str???`on${capitalize(str)}`?:?``)
)
在獲取 handlerName 之后,就會從 props 對象上獲取該 handlerName 對應(yīng)的 handler 對象。如果該 handler 對象存在,則會調(diào)用 callWithAsyncErrorHandling 函數(shù),來執(zhí)行當(dāng)前自定義事件對應(yīng)的事件處理函數(shù)。callWithAsyncErrorHandling 函數(shù)的定義如下:
//?packages/runtime-core/src/errorHandling.ts
export?function?callWithAsyncErrorHandling(
??fn:?Function?|?Function[],
??instance:?ComponentInternalInstance?|?null,
??type:?ErrorTypes,
??args?:?unknown[]
):?any[]?{
??if?(isFunction(fn))?{
????const?res?=?callWithErrorHandling(fn,?instance,?type,?args)
????if?(res?&&?isPromise(res))?{
??????res.catch(err?=>?{
????????handleError(err,?instance,?type)
??????})
????}
????return?res
??}
??//?處理多個(gè)事件處理器
??const?values?=?[]
??for?(let?i?=?0;?i?????values.push(callWithAsyncErrorHandling(fn[i],?instance,?type,?args))
??}
??return?values
}
通過以上代碼可知,如果 fn 參數(shù)是函數(shù)對象的話,在 callWithAsyncErrorHandling 函數(shù)內(nèi)部還會繼續(xù)調(diào)用 callWithErrorHandling 函數(shù)來最終執(zhí)行事件處理函數(shù):
//?packages/runtime-core/src/errorHandling.ts
export?function?callWithErrorHandling(
??fn:?Function,
??instance:?ComponentInternalInstance?|?null,
??type:?ErrorTypes,
??args?:?unknown[]
)?{
??let?res
??try?{
????res?=?args???fn(...args)?:?fn()
??}?catch?(err)?{
????handleError(err,?instance,?type)
??}
??return?res
}
在 callWithErrorHandling 函數(shù)內(nèi)部,使用 try catch 語句來捕獲異常并進(jìn)行異常處理。如果調(diào)用 fn 事件處理函數(shù)之后,返回的是一個(gè) Promise 對象的話,則會通過 Promise 對象上的 catch 方法來處理異常。了解完上面的內(nèi)容,再回顧一下前面見過的函數(shù)調(diào)用棧,相信此時(shí)你就不會再陌生了。

現(xiàn)在前面提到的 2 個(gè)問題,我們都已經(jīng)找到答案了。為了能更好地掌握自定義事件的相關(guān)內(nèi)容,阿寶哥將使用 Vue 3 Template Explorer 這個(gè)在線工具,來分析一下示例中模板編譯的結(jié)果:
App 組件模板
"sayHi"></welcome-button>
const?_Vue?=?Vue
return?function?render(_ctx,?_cache,?$props,?$setup,?$data,?$options)?{
??with?(_ctx)?{
????const?{?resolveComponent:?_resolveComponent,?createVNode:?_createVNode,?
??????openBlock:?_openBlock,?createBlock:?_createBlock?}?=?_Vue
????const?_component_welcome_button?=?_resolveComponent("welcome-button")
????return?(_openBlock(),?_createBlock(_component_welcome_button,
?????{?onWelcome:?sayHi?},?null,?8?/*?PROPS?*/,?["onWelcome"]))
??}
}
welcome-button 組件模板
觀察以上結(jié)果,我們可知通過 v-on: 綁定的事件,都會轉(zhuǎn)換為以 on 開頭的屬性,比如 onWelcome 和 onClick。為什么要轉(zhuǎn)換成這種形式呢?這是因?yàn)樵?emit 函數(shù)內(nèi)部會通過 toHandlerKey 和 camelize 這兩個(gè)函數(shù)對事件名進(jìn)行轉(zhuǎn)換:
//?packages/runtime-core/src/componentEmits.ts
export?function?emit(
??instance:?ComponentInternalInstance,
??event:?string,
??...rawArgs:?any[]
)?{
?//?省略大部分代碼
??//?convert?handler?name?to?camelCase.?See?issue?#2249
??let?handlerName?=?toHandlerKey(camelize(event))
??let?handler?=?props[handlerName]
}
為了搞清楚轉(zhuǎn)換規(guī)則,我們先來看一下 camelize 函數(shù):
//?packages/shared/src/index.ts
const?camelizeRE?=?/-(\w)/g
export?const?camelize?=?cacheStringFunction(
??(str:?string):?string?=>?{
????return?str.replace(camelizeRE,?(_,?c)?=>?(c???c.toUpperCase()?:?''))
??}
)
觀察以上代碼,我們可以知道 camelize 函數(shù)的作用,用于把 kebab-case (短橫線分隔命名) 命名的事件名轉(zhuǎn)換為 camelCase (駝峰命名法) 的事件名,比如 "test-event" 事件名經(jīng)過 camelize 函數(shù)處理后,將被轉(zhuǎn)換為 "testEvent"。該轉(zhuǎn)換后的結(jié)果,還會通過 toHandlerKey 函數(shù)進(jìn)行進(jìn)一步處理,toHandlerKey 函數(shù)被定義在 shared/src/index.ts 文件中:
//?packages/shared/src/index.ts
export?const?toHandlerKey?=?cacheStringFunction(
??(str:?string)?=>?(str???`on${capitalize(str)}`?:?``)
)
export?const?capitalize?=?cacheStringFunction(
??(str:?string)?=>?str.charAt(0).toUpperCase()?+?str.slice(1)
)
對于前面使用的 "testEvent" 事件名經(jīng)過 toHandlerKey 函數(shù)處理后,將被最終轉(zhuǎn)換為 "onTestEvent" 的形式。為了能夠更直觀地了解事件監(jiān)聽器的合法形式,我們來看一下 runtime-core 模塊中的測試用例:
//?packages/runtime-core/__tests__/componentEmits.spec.ts
test('isEmitListener',?()?=>?{
??const?options?=?{
????click:?null,
????'test-event':?null,
????fooBar:?null,
????FooBaz:?null
??}
??expect(isEmitListener(options,?'onClick')).toBe(true)
??expect(isEmitListener(options,?'onclick')).toBe(false)
??expect(isEmitListener(options,?'onBlick')).toBe(false)
??//?.once?listeners
??expect(isEmitListener(options,?'onClickOnce')).toBe(true)
??expect(isEmitListener(options,?'onclickOnce')).toBe(false)
??//?kebab-case?option
??expect(isEmitListener(options,?'onTestEvent')).toBe(true)
??//?camelCase?option
??expect(isEmitListener(options,?'onFooBar')).toBe(true)
??//?PascalCase?option
??expect(isEmitListener(options,?'onFooBaz')).toBe(true)
})
了解完事件監(jiān)聽器的合法形式之后,我們再來看一下 cacheStringFunction 函數(shù):
//?packages/shared/src/index.ts
const?cacheStringFunction?=?extends?(str:?string)?=>?string>(fn:?T):?T?=>?{
??const?cache:?Record<string,?string>?=?Object.create(null)
??return?((str:?string)?=>?{
????const?hit?=?cache[str]
????return?hit?||?(cache[str]?=?fn(str))
??})?as?any
}
以上代碼也比較簡單,cacheStringFunction 函數(shù)的作用是為了實(shí)現(xiàn)緩存功能。
三、阿寶哥有話說
3.1 如何在渲染函數(shù)中綁定事件?
在前面的示例中,我們通過 v-on 指令完成事件綁定,那么在渲染函數(shù)中如何綁定事件呢?
<div?id="app">div>
<script>
??const?{?createApp,?defineComponent,?h?}?=?Vue
??
??const?Foo?=?defineComponent({
????emits:?["foo"],?
????render()?{?return?h("h3",?"Vue?3?自定義事件")},
????created()?{
??????this.$emit('foo');
????}
??});
??const?onFoo?=?()?=>?{
????console.log("foo?be?called")
??};
??const?Comp?=?()?=>?h(Foo,?{?onFoo?})
??const?app?=?createApp(Comp);
??app.mount("#app")
script>
在以上示例中,我們通過 defineComponent 全局 API 定義了 Foo 組件,然后通過 h 函數(shù)創(chuàng)建了函數(shù)式組件 Comp,在創(chuàng)建 Comp 組件時(shí),通過設(shè)置 onFoo 屬性實(shí)現(xiàn)了自定義事件的綁定操作。
3.2 如何只執(zhí)行一次事件處理器?
在模板中設(shè)置
"sayHi"></welcome-button>
const?_Vue?=?Vue
return?function?render(_ctx,?_cache,?$props,?$setup,?$data,?$options)?{
??with?(_ctx)?{
????const?{?resolveComponent:?_resolveComponent,?createVNode:?_createVNode,?
??????openBlock:?_openBlock,?createBlock:?_createBlock?}?=?_Vue
????const?_component_welcome_button?=?_resolveComponent("welcome-button")
????return?(_openBlock(),?_createBlock(_component_welcome_button,?
??????{?onWelcomeOnce:?sayHi?},?null,?8?/*?PROPS?*/,?["onWelcomeOnce"]))
??}
}
在以上代碼中,我們使用了 once 事件修飾符,來實(shí)現(xiàn)只執(zhí)行一次事件處理器的功能。除了 once 修飾符之外,還有其他的修飾符,比如:
<a?@click.stop="doThis">a>
<form?@submit.prevent="onSubmit">form>
<a?@click.stop.prevent="doThat">a>
<form?@submit.prevent>form>
<div?@click.capture="doThis">...div>
<div?@click.self="doThat">...div>
在渲染函數(shù)中設(shè)置
"app"></div>
感谢您访问我们的网站,您可能还对以下资源感兴趣:
国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频
久久影音先锋|
自慰一区|
中文字幕乱伦日本|
夜夜嗨老熟女AV一区二区三区|
国产又色又爽又黄又免费|
精品人妻无码一区二区三区四川人|
狼色AV|
伊人久久大香色综合久久|
国产精品激情|
国产综合激情|
亚州激情|
激情av在线|
日韩爱爱网站|
亚洲精品视频免费在线观看|
亚洲国产欧美在线|
精品国产免费无码久久噜噜噜AV|
精品国产一区二区三区性色AV
|
美女久久久久|
大肉大捧视频免费观看|
麻豆蜜桃91无码|
91大神在线资源观看无广告|
午夜操|
丁香五月天堂|
蜜桃精品在线观看|
aaa久久|
h片网站在线观看|
牛牛在线精品视频|
色中色av|
日韩AⅤ无码一区二区三区|
夜夜骑夜夜操|
中文字幕在线网站|
夜夜草视频|
九色一区|
免费黄色视频观看|
青青草国产亚洲精品久久|
四虎www|
最新亚洲无码在线观看|
成人黃色A片免费看|
在线观看免费人成视频|
国产婬片一级A片AAA毛片AⅤ
|
国产A片电影|
香蕉视频日韩|
国产一级二级片|
国产精品资源在线观看|
91精品视频在线免费观看|
动漫人物插画动漫人物的视频软件
|
色情综合|
国产69视频在线观看|
极品久久久久|
欧美AAA黄片|
骚骚肥肥一区二区三区|
麻豆网站91|
亚洲无码少妇|
人人妻人人爱人人|
激情视频小说|
超碰免费人人|
大香蕉久久伊人|
欧美性生交18XXXXX无码
|
成人亚洲天堂|
中文字幕一区三区人妻视频|
精品国产一级A片黄毛网站|
肉色超薄丝袜脚交一区二区|
特一级黄A片|
亚洲经典免费视频|
综合黄色|
高清无码成人视频|
中文字幕人妻丝袜二区电影|
四虎福利|
国产精品日韩高清北条麻衣
|
香蕉视频日韩|
亚洲一级二级三级片|
国产一级a一片成人AV|
日韩图色|
婷婷国产精品|
免费色网站|
日韩激情AV|
成人免费视频国产免费麻豆,|
性爱福利视频|
粉粉嫩嫩的18虎白女|
成人午夜无码福利视频|
伊人久久大|
黄色三级在线观看|
一区二区三区不卡视频|
岛国av在线|
少妇人妻偷人精品无码视频新浪|
米奇电影777无码|
熟女人妻一区二区三区免费看|
欧美后门菊门交4|
亚洲无码一区二区三区妃光|
亚洲日韩在线视频观看|
亚洲欧美v在线视频|
国产A片电影|
99re6热在线精品视频|
久激情内射婷内射蜜桃欧美一级|
亚洲福利一区|
AV免费在线播放|
91女人18毛片水多的意思|
91新视频|
一区二区三区日韩|
天天躁狠狠躁夜躁2024|
亚洲一二期视频|
乱人伦欲国语对白|
亚洲天堂国产视频|
91精品国产一区二区三区|
国产午夜视频在线|
操操干|
国产黄色精品视频|
俺去也视频|
日韩一区二区在线观看|
中文字幕av高清片,中文在线观看|
99re2|
思思热在线视频播放|
偷自拍|
大香蕉久久伊人|
91超碰在线播放|
欧美口爆视频|
亚洲精品成人视频|
亚洲精品AⅤ一区二|
五月婷婷综合网|
成人做爱免费网站|
亚洲精品成人无码熟妇在线|
国产av日韩av|
五月婷婷六月婷婷|
骚熟妇|
特级西西44www无码|
中文字幕+乱码+中文乱码www
|
午夜国产视频|
丁香婷婷色五月激情综合三级三级片欧美日韩国
|
欧美国产视频|
日韩a级片|
影音先锋日韩资源|
97中文字幕|
人妻无码中文久久久久专区|
五月天在线电影|
AV无码一区|
日韩AV乱伦|
无套免费视频欧美|
丁香五月AV|
一区二区无码视频|
怡春院熟女精品AV|
女人BBBB|
性爱视频久久|
国产操逼电影|
一级黄色视频在线观看|
婷婷五月丁香六月|
东北成人毛片|
青青操青青干|
天堂av在线免费观看|
日韩高清无码一区二区三区|
亚洲精品蜜桃|
小日本91在线观看|
色五月天导航|
老鸭窝成人视频|
综合久久中文字幕|
又紧又嫩又爽无遮挡免费|
天天干天天操天天射|
中文字幕一区二区蜜桃|
午夜无码久久|
69人妻人人澡人人爽久久|
四虎成人精品无码永久在线的客服|
日韩无码A片|
丁香五月激情综合|
青草成人在线|
囯产精品一区二区三区AV做线|
在线观看中文字幕AV|
影音先锋资源站|
五月婷婷欧美|
国产成人精品无码片区在线观91|
超碰人人人人人人人人|
五月天久久精品|
国产精品久久久久久久久久久久久久
|
精品蜜桃秘一区二区三区在线播放|
亚洲中文娱乐|
伊人大香蕉在线视频|
欧美精品一区二区少妇免费A片|
亚洲在线视频网站|
xxxx色|
999国产视频|
国产视频无码|
大鸡巴黄色视频免费观看|
日本少妇性爱视频|
色香蕉影院|
七十路の高齢熟女千代子|
欧美A级视频|
五月天丁香成人|
国产精品久久久大香蕉|
午夜成人鲁丝片午夜精品|
日本亚洲欧美|
91在线无码精品国产三年|
2020无码|
欧美性色网|
日韩免费一区|
色伊人久操视频|
人人妻人人操人人干|
亚洲中文字幕免费在线观看|
亚洲综合免费观看高清|
日本高清视频网站网wwwwww|
动漫人物插画动漫人物的视频软件
|
波多野结衣亚洲视频|
亚洲色图在线视频|
亚洲色图p|
欧美日韩在线观看中文字幕|
艳妇乳肉豪妇荡乳AV无码福利|
久久人妻熟女中文字幕av蜜芽
|
中文字幕+乱码+中文乱码91在线观看
|
亚洲A视频|
久久99精品久久久久婷婷|
无码国产99精品久久久久网站|
亚洲av偷拍|
无码av在线播放|
懂色一区二区三区免费|
男人操女人免费网站|
嫩BBB揍BBB揍BBB|
操B在线|
成人在线视频一区|
大香蕉伊人丁香五月|
高清无码视频直接看|
久久99网站|
国产精品秘ThePorn|
亚洲波多野结衣|
免费黄色视频网站大全|
久操视频在线免费观看|
黑人操逼|
91色人妻|
国产香蕉精品视频|
中文字幕日韩有码|
国产在线观看自拍|
成人在线一区二区三区|
夜夜嗨AⅤ一区二区三区|
无码人妻在线播放|
www.777av|
天天射视频|
久久久少妇|
国产日韩欧美综合精品在线观看
|
日日99|
国产一区二区成人久久919色|
日本一级a片|
四虎av在线播放|
国产激情在线|
日本A∨|
无码中文字幕高清|
亚洲无码在线观看网站|
欧美疯狂做受XXXXX高潮|
91精品无码|
日日騒av无码|
国产成人黄色|
国产a√|
98无码人妻精品一区二区三区|
五月激情丁香婷婷|
亚洲一区二区三区在线|
2025中文在线观看最好看的电影|
精品91在线视频|
欧美黄色毛片|
日韩在线观看免费|
东京热第一页|
91网站在线观看视频|
黄片午夜|
亚洲天堂人妻少妇|
青青青亚州视频在线|
大鸡吧在线视频|
A片在线免费播放|
国产操逼图|
在线观看91|
www.91超碰在线|
热久久9|
久热久|
黑人一区二区三区四区|
青娱乐网|
在线成人视频网站大香蕉在线网站
|
a片视频免费观看|
一级午夜|
亚洲中文在线视频|
人人妻人人爱人人|
黄色日韩|
亚洲AAA电影|
久热青草|
caoporen|
精品人妻一区二区免费蜜桃|
国产精品AV在线|
日韩极品视频在线|
中文字幕高清无码在线观看|
无码国产精品一区二区|
韩国成人精品三级|
日韩黄色AV|
黄片中文|
www四虎com|
AV三级片网站|
在线视频一区二区三区四区|
伊人网在线观看|
91三级片在线观看|
超碰91在线观看|
欧美午夜精品久久久久免费视|
国产黄色性爱视频|
成人免费毛片视频|
日韩美女免费视频|
51福利视频|
国精品无码一区二区三区在线|
人人色视频|
无码AV高清|
99热这里只有精|
欧美一级二级三级|
欧美日韩一区在线观看|
日韩一级a片|
影音先锋三级资源|
成人H动漫精品一区二区三区蘑菇
高清无码视频在线免费观看
|
人人摸人人操人人|
亚洲精品日韩综合观看成人91|
欧美黄色大片|
亚洲欧美婷婷五月色综合|
国产伦精一品二品三品app|
欧美午夜精品久久久|
国产午夜成人免费看片无遮挡|
欧美精品一区二区三区使用方法|
国产成人综合电影|
天堂网在线视频|
欧美国产中文|
99无码视频|
免费国产乱伦|
久久久久大香蕉|
波多野结衣福利视频|
亚洲一区AV|
91一区二区在线播放精品|
日韩中文字幕在线观看视频|
日韩免费Av|
波多野结衣av中文字幕|
欧洲毛片基地c区|
免费AV在线播放|
国产成人女人在线观看|
99久久99久久久精品棕色圆|
精品一区二区三区蜜桃臀www
|
日韩免费A片|
日韩黄色片在线观看|
99re热|
91嫖妓站街埯店老熟女|
蜜桃传媒一区|
亚洲美女网站免费观看网址|
91在线无码精品秘入口|
亚洲综合二区|
免费人妻视频|
久久国产精品精品国产色婷婷
|
成人自拍视频在线观看|
一级黄片在线|
九九色影院|
天天爱天天插|
精品中文字幕在线观看|
国产成人主播|
精品福利在线观看|
五月停亭六月,六月停亭的英语
|
亚洲国产成人精品女人久久|
91小仙女jK白丝袜呻吟|
草草操|
欧美一级婬片免费视频黄|
免费黄视频在线观看|
高清无码视频免费观看|
精品一二三四|
成人黄色免费|
久久久免费观看视频|
青青草原在线视频|
影音先锋av无码|
国产乱码在线|
欧美国产日本|
一级片电影网站|
国产欧美性爱|
在线久操|
操逼欧美|
亚洲免费视频网|
免费看日韩毛片|
逼特逼视频在线|
天天撸免费视频|
国产一级a毛一级a毛观看视频网站
|
怡春院综合|
黄色成人网站在线观看免费|
日韩资源站|
国产成人av在线播放|
日韩一级内射|
日韩成人免费视频|
男人资源网|
久久双飞|
一区在线观看视频|
AV无码一区|
日韩超碰|
亚洲中文字墓|
成人免看一级a一片|
亚洲AV无码免费|
日韩黄色电影网|
色老板在线观看永久免费视频|
囯产一级a一级a免费视频|
国产精品色在线回看|
怡春院亚洲|
国产AV一卡|
人妻互换一二三区免费|
国产精品秘ThePorn|
久久久久久久久久国产精品免费观看-百度
|
蜜臀久久精品久久久久|
999精品视频|
日韩精品在线免费|
国产成人精品亚洲男人的天堂|
黄片高清无码|
午夜福利区|
上海熟搡BBB搡BBBB|
久久婷婷网|
无码av网|
精品中文字幕在线观看|
91超碰免费在线|
欧美又粗又大AAA片|
中文字幕99|
少妇人妻在线|
蜜桃视频一区二区三区|
黄色片一区二区|
日韩无码A级片|
五月丁香六月婷|
日韩免费中文字幕A片|
青青热视频|
91亚洲在线|
大蕉网|
成人区123|
日韩日屄视频|
久操久干|
人妻人玩|
中文字幕一区二区三区四区五区六区
|
91天天操|
大香蕉99|
黄片网站在线看|
久操免费在线观看|
性爱无码视频|
国产美女全裸网站|
日韩av综合|
国产你懂的|
九九99热|
看A片在线|
亚洲成人无码视频|
亚洲无码视频一区二区|
中文字幕在线播放第一页|
亚洲一区二区成人网站戴套|
88AV在线播放|
欧美日韩人妻高清中文|
人人摸人人搞|
免费视频一区二区三区四区
|
操老骚逼视频|
国产精品久久久久久久久久|
先锋影音资源网站|
人人干人妻|
悠悠AV导航|
欧美亚洲日本|
国产操骚逼|
亚洲一区二区网站|
你懂的在线播放|
人人操国产|
A视频免费在线观看|
国产性色|
操在线视频|
99热这里只有精品999|
亚洲成人中文字幕|
色爽av|
日韩欧美人妻无码精品|
青青操国产乱伦|
91香蕉在线观看|
成年人免费视频在线观看|
人妻在线无码|
亚洲天堂免费视频|
免费看黄A级毛片成人片|
狠狠2021|
人人操人人看人人摸|
人人射人人操|
67194国产|
国产—级a毛—a毛免费视频|
乱伦五月天|
呦小BBBB小小BBBB|
在线观看日韩视频|
99热思思|
日日碰狠狠|
日韩高清无码专区|
日本aaaa片|
亚洲乱论|
亚洲AV成人无码网天堂|
无码窝在线观看|
国产真实乱婬A片久久久老牛|
天天爽夜夜爽精品成人免费|
亚洲AV成人片无码网站网蜜柚|
亚洲久久在线|
成人无码影院日韩,成人年…|
成人免费毛片视频|
麻豆91精品人妻成人无码|
91看片看婬黄大片|
免费国产精品视频|
国产日韩欧美综合精品在线观看
|
a天堂8|
在线无码免费观看|
久久久久久久成人|
国产午夜精品一区二区三区四区|
三级无码av|
三级乱伦|
婷婷九月|
亚洲AV无码成人精品区在线欢看
|
色色色热|
日日操天天操|
日韩AAA在线|
中文av字幕|
av在线免费观看网站|
青青草原免费在线视频|
亚洲AV无码一区毛片AV|
人人操人妻|
草在线视频|
日本一本在线|
操逼网123首页|
日本高清视频九区|
无码免费一区二区|
超碰93|
看一级黄色视频|
国模一区二区三区|
日韩激情无码|
豆花视频成人精品视频|
超碰一区|
亚洲熟妇AV日韩熟妇在线|
日无码在线|
91青青草|
久久久久国产视频|
五月婷婷激情综合|
91碰|
霸道总裁雷总各种姿势白浆爱情岛论坛
|
视频二区中文字幕|
蜜臀av在线播放|
五月天婷婷在线视频|
国产乱码精品一区二区三区的特点
|
激情综合婷婷久久|
国产成人精品一区二区三区视频|
成人操b视频|
久久欧洲成人精品无码区|
成人无码一区|
www.17c嫩嫩草色蜜桃网站
|
欧美日韩亚洲一区二区三区|
中文字幕浅井香舞被黑人俘虏|
欧美国产综合|
久久久久免费|
日韩黄色片网站|
色婷婷国产精品视频|
苍井空精毛片精品久久久|
91激情电影|
鸡巴网站|
极品无码|
亚洲成人观看|
尹人在线视频|
首屈一指视频在线观看|
人妖和人妖互交性XXXX视频|
久久人搡人人玩人妻精AV香蕉|
h网站在线观看|
操逼视频在线看|
韩国三级av|
亚洲操逼电影|
国产在线拍揄自揄拍无码男男|
日日视频|
无码一区二区三区四季|
五月丁香|
人人澡人人澡人人澡|
成人超碰|
丁香婷婷六月|
成功精品影院|
国产精品女人777777|
艹B视频|
操一炮在线视频|
日本黄色A片|
色444|
91在线无码精品秘入口三人|
中文字幕日韩成人|
欧美亚洲国产一区二区三区|
久久精品三级视频|
你懂的久久|
日AV在线无|
这里有精品|
国产三级黄片|
国产无码区|
黄页免费视频|
啊啊啊av|
日韩欧美一区二区在线观看|
狠狠色噜噜狠狠狠888|
国产99999|
欧美特级AAA|
欧美一级a|
特黄网站|
污视频免费在线观看|
夜夜骑夜夜|
狠狠躁18三区二区一区免费人
|
久久久一区二区三区四区|
亚洲成人免费在线观看|
亚洲精品不卡|
黄色无遮挡|
色色影音先锋|
亚洲人成人无码.www粉色|
99精品网站|
成人精品亚洲人成在线|
91爱看|
波多野结衣无码流出|
亚洲天堂网站|
欧美日韩黄片|
国产无码激情视频|
AV在线无码|
亚洲欧美日韩一区二区|
久热国产精品|
无码探花|
你懂的网站在线观看|
中国熟女HD|
亚洲欧美久久久|
在线观看一区二区三区四区|
无码免费毛片|
水果派红桃AV解说|
精品一区二|
久久成人在线视频|
欧美亚洲三级片|
做爱视频网站18|
无套影院|
亚洲AV无码成人精品区天堂小说|
中文无码在线观看|
天天骑夜夜操|
日本三级视频|
麻豆视频国产|
2025AV在线|
人妻黑人一区二区三区|
中文字幕免费一区|
久久欧洲成人精品无码区|
波多野结衣成人视频|
国产成人精品视频免费|
狠狠躁夜夜躁人爽|
中文字幕日韩高清|
AV无码在线免费观看|
九九热re99re6在线精品|
日韩无码视频网站|
欧美黄色性爱|
激情五月激情综合网|
天堂在线中文网|
十八禁网站在线播放|
91嫖妓站街埯店老熟女|
久久青青草在线视频|
女人18片毛片60分钟翻译|
午夜一区二区三区免费|
成人五月天黄色电影|
欧美在线看片|
成人综合激情|
国产婷婷五月天|
岛国av片|
怕怕怕视频|
国语A片|
欧美成人一区二区三区片|
视频在线a|
韩日不卡视频|
日韩精品你懂的|
亚洲日韩中文无码|
欧美一区三区视频z|
日韩成人黄色视频|
亚洲一二期视频|
亚日韩在线|
91人妻一区二区三区无不码超满|
亚洲色婷婷久久精品AV蜜桃|
AV在线小说|
日韩精品成人在线视频|
一区二区中文|
奇米色播|
中文字幕无码免费|
亚洲综合片|
日韩成人无码电影网站|
欧美MV日韩MV国产网站|
AV黄色网|
婷婷色中文网|
成人一区视频|
九九九AV|
69福利网|
欧美在线视频一区|
天天日天天拍|
黄色网页在线免费观看|
91无码在线视频|
成人看片黄a免费看视频|
欧美视频在线一区|
AV三级片在线观看|
欧美操操|
国产综合视频|
青娱乐青青草|
三级免费无限AV|
国产欧美综合视频|
最新av资源|
人人爽爽人人|
日本在线不卡视频|
日韩黄色电影网|
成av人片一区二区三区久久|
蜜臀AV午夜精品|
无码二区三区|
国产黄色视频在线观看免费|
十八禁无码网站在线观看|
www.激情|
四川乱子伦95视频国产|
欧美成人a|
成人欧美一区二区三区黑人免费|
成人无码精品|
国产精品久久久久久久久久|
成人aV免费观看|
俩小伙3p老熟女露脸|
日韩七区|
日韩一区二区视频在线观看|
一级黄色电影免费在线观看|
日韩A∨|
日韩爆乳一区二区三区|
亚l洲视频在线观看|
无码不卡在线|
超碰啪啪|
蜜桃av秘无码一区二区|
色色天堂|
不卡无码中文字幕一区|
欧美熟女一区二区|
日韩操比视频|
少妇久久久久久久久久|
逼特逼在线视频|
AV网站免费在线观看|
黑人狂躁女人高潮视频|
国产在线观看AV|
欧美视频在线观看免费|
欧美视频在线观看|
综合天堂网|
中文字幕www一区|
玖玖资源在线观看|
另类性爱视频|
AV2014天堂网|
99热在线观看精品免费|
自拍AV在线|
91成人影片|
91亚洲精品久久久久蜜桃|
大鸡吧操逼|
玩弄大荫蒂视频|
波多野结衣在线观看一区二区|
日韩在线视频免费播放|
亚洲欧美日本在线观看|
国产欧美精品一区二区|
丁香激情五月|
欧美性视频网站|
国产高潮视频在线观看|
国产在线观看你懂的|
91AV一区二区|
日本少妇BBW|
婷婷无码视频|
3级毛片|
一级免费a片|
影音先锋色资源站|
欧美日韩久久久|
日本一区二区三区在线观看网站
|
91精品国产91久久久久久吃药|
国产三级无码视频|
午夜蜜桃|
国产又爽又黄免费视频免费|
中文字幕不卡+婷婷五月|
激情性爱婷婷色五月|
黄片中文|
波多野结衣国产区42部|
www.热久久|
蜜臀久久久久久999|
77777色|
性欧美成人播放77777|
黄色草莓视频|
久久精品一二三|
欧美色视频在线观看|
性色网|
懂色中国闺密偷情懂色AV|
色五月婷婷视频|
av在线三级|
成人精品一区二区三区中文字幕|
成人免费在线观看|
www.婷婷|
西西www444无码免费视频|
伊人大香蕉婷婷|
aaaaaa在线观看免费高清|
久久成人小电影|
国产人妖视频|
久久精品禁一区二区三区四区五区|
亚洲青娱乐在线|
亚洲国产成人一区二区|
天堂а√在线中文在线新版|
这里都是精品|
免费观看色情视频|
国产av影音|
中文无码在线观看中文字幕av中文
|
免费毛片网|
天天干天天爽|
亚洲欧洲在线播放|
亚洲第一色婷婷|
粉嫩小泬BBBB免费看-百度|
99久久婷婷国产综合精品电影|
轻轻操内射无码|
国产熟妇搡BBBB搡BBBB搡|
日本免费黄|
国产成人无码区亚洲A片356p
|
欧美久久一区二区三区四区视频
|
福利精品|
51妺妺嘿嘿午夜成人A片|
理论三级片|
亚洲免费小电影|
日韩av在线电影|
免费的黄色视频|
无码任你躁久久久久|
波多野结衣无码网站|
国产精品秘久久久久久一两个一起|
欧美亚洲激情|
无码视频免费观看|
亚洲中文字幕免费观看视频|
丁香五月激情在线|
中文字幕+乱码+中文乱码电影|
午夜精品秘一区二区三区|
婷婷五月天在线电影|
翔田千里在线观看|
日本特黄AA片免费视频|
精品中文字幕在线观看|
五月婷婷日韩|
91影音先锋|
成人动漫一区二区|
亚洲无码一区二区三区四区|
国产一区免费观看|
91麻豆一区|
色欲av伊人久久大香线蕉影院|
91人妻人人操|
黄色高清视频在线观看|
www.中文无码|
国产一级a毛一级a毛视频在线网站|
精品一区二区三区四区|
337P大胆粉嫩银噜噜噜|
亚洲AV无码精品久久一区二区
|
91人人人人|
色呦呦中文字幕|
中文字幕在线看成人电影|
国产精品一区二区三区不卡|
久久免费视频1|
成人免费版欧美州|
中文字幕性|
欧美色逼逼|
中国字幕在线观看韩国电影|
妓女不卡|
动漫一区二区三区|
亚洲欧美国产毛片在线|
国产无码专区|
苍井空一区二区三区四区|
日韩人妻码一区二区三区|
五月天丁香社区|
国产女同在线观看|
一级日逼视频|
91亚洲在线|
中文大香蕉视频|
A级片网站|
国产女人18毛片精品18水|
国产激情艹逼|
国产香蕉视频在线播放|
97色色五月天|
亚洲男人天堂|
99re在线精品|
少妇白洁在线观看|
丁香五月综合|
黄色视频网站观看|
蜜桃网站在线观看|
婷婷色图|
免费A片在线|
91视频在线免费看|
北条麻妃视频在线观看|
熟女人妻人妻の视频|
欧美黄片一区|
91丨露脸丨熟女|
久草网在线观看|
北条麻妃中文字幕在线观看|
青青青在线视频|
国产在线接入|
91久久精品一区二区三|
亚洲三级无码|
精品无码免费视频|
日韩人妻无码一区二区三区|
色交视频|
国产精品成|
久久精品成人|
激情av天堂|
另类老妇性BBwBBw图片|
超碰99在线观看|
免费操逼网址|
国产农村妇女精品一二区|
亚洲资源在线观看|
亚洲色成人网站www永久四虎
|
黄色av天堂|
国产乱伦影片|
亚洲字幕在线观看|
丁香五月网|
中文字幕第27页|
欧美成人性爱网站|
国产精品无毛五区六区|
a√天堂资源中文8|
中文字幕AV无码|
麻豆视频在线看|
久久精品一区二区三区不卡牛牛
|
91麻豆国产|
成年人免费黄色视频|
国产传媒_色哟哟|
亚欧精品久久久久久久久久久|
东京热视频网址|
五月开心激情网|
欧美视频综合|
国产精品久久久久久久久久久久久久久|
91精品人妻一区二区三区|
操逼免费观看视频|
成人做爰100片免费观看视频|
影音先锋av在线资源站|
午夜日逼网站|
