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

【Vue.js】875- Vue 3.0 進(jìn)階之自定義事件探秘

共 11836字,需瀏覽 24分鐘

 ·

2021-02-21 09:13

這是 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、typeparent 等屬性。因此我們猜測 _ 屬性的值是組件實(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 組件模板

"$emit('welcome')">歡迎</button>

const?_Vue?=?Vue
return?function?render(_ctx,?_cache,?$props,?$setup,?$data,?$options)?{
??with?(_ctx)?{
????const?{?createVNode:?_createVNode,?openBlock:?_openBlock,
??????createBlock:?_createBlock?}?=?_Vue

????return?(_openBlock(),?_createBlock("button",?{
??????onClick:?$event?=>?($emit('welcome'))
????},?"歡迎",?8?/
*?PROPS?*/,?["onClick"]))
??}
}

觀察以上結(jié)果,我們可知通過 v-on: 綁定的事件,都會轉(zhuǎn)換為以 on 開頭的屬性,比如 onWelcomeonClick。為什么要轉(zhuǎn)換成這種形式呢?這是因?yàn)樵?emit 函數(shù)內(nèi)部會通過 toHandlerKeycamelize 這兩個(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在线资源站| 午夜日逼网站|