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

Vue.js設計與實現之設計一個完善的響應系統

開發 前端
在本文中簡單實現了可以進行依賴收集的響應式系統,使用WeakMap配合Map構建了新的存儲結構,能夠在響應式數據和副作用函數之間建立更加精確的聯系。

1.寫在前面

響應系統是Vue.js的重要組成部分,我們要實現一個簡易的響應式系統,必須先要了解什么是響應式數據和副作用函數。在實現過程中,我們需要考慮如何避免無限遞歸,為什么需要嵌套副作用函數,以及多個副作用函數之間會產生什么影響?

2.副作用函數

所謂副作用函數,指的是會產生副作用的函數,而副作用指的是函數effect的執行會直接或間接影響到其它函數的執行,那么就說effect函數產生了副作用,effect就是副作用函數。

<div id="app"></div>

<script>
//全局變量
let state = {
name:"onechuan",
age:18,
address:"北京"
}
function effect(){
app.innerHTML = "hello pingping," + state.name + "," + state.age + "," + state.address;
}
effect();

setTimeout(()=>{
//修改全局變量,產生副作用
state.address = "廣州";
},1000)
</script>

在上面的代碼片段中,副作用函數effect會設置id為app的標簽innerHTML屬性 app.innerHTML = "hello pingping," + state.name + "," + state.age + "," + state.address;,其中state.address的值為"北京"。而當state.address發生變化時,希望副作用函數effect能夠重新執行,state.address的值變為"廣州"。

當前在setTimeout函數中代碼修改了state.address的值,除了對象的值本身發生變化外,沒有其他任何變化,達不到要求的效果。如果希望值變化后副作用函數立即更新,那么state對象數據就必須是響應式的,那么什么是響應式的,應該如何讓state實現響應式呢?

3.響應式數據

對上面的要求進行分析,要想讓state變成響應式數據,需要滿足兩個條件:

  • 在副作用函數effect執行時,從對象state中讀取address的值,觸發讀取操作
  • 當修改state.address的值時,把對象state中的address的值進行修改,觸發設置操作

再次思考,響應式數據的實現就變成了攔截對象進行取值和設值操作。當從state對象中讀取address時,就將副作用函數effect存儲到容器中,當設置state對象中的address值的時候,從容器中取出effect函數并執行。

取值操作

設置操作

那么,到底應該如何實現對一個對象屬性的讀取和設置操作呢?在Vue.js2中采用的是Object.defineProperty函數實現的,而在Vue.js3中則是采用Proxy代理對象的方法實現的。我們根據上面的思路和流程圖,先簡易實現個最low的攔截取值設置操作。

<div id="app"></div>
<script>
//全局變量
let state = {
name:"onechuan",
age:18,
address:"北京"
}

// 存儲副作用函數的桶
const bucket = new Set();

// 對原始數據的代理
const obj = new Proxy(state,{
// 攔截讀取操作
get(target, key){
// 將副作用函數effect添加到存儲副作用函數的桶中
bucket.add(effect)
// 返回屬性值
return target[key]
},
// 攔截設置操作
set(target, key, newVal){
// 設置屬性值
target[key] = newVal
// 把副作用函數從桶里取出并執行
bucket.forEach(fn=>fn())
// 返回true代表設置操作成功
return true
}
})

function effect(){
const app = document.querySelector("#app");
app.innerHTML = obj.name + "," + obj.age + "," + obj.address;
}

effect();

setTimeout(()=>{
//修改全局變量,產生副作用
obj.address = "廣州";
},1000)
</script>

在瀏覽器中渲染得到:

1s后頁面更新渲染為:

看到上面的代碼片段,不禁想問為什么要將存儲副作用函數的容器類型設置為Set類型,這是因為對于同一個對象屬性進行多次代理就會出現死循環的情況,對此使用Set可以用于去重。

state是被代理的原始數據,而obj是采用Proxy進行代理后的對象數據,在其中實現了攔截和取值設值操作,在取值和設置過程中實現了副作用函數effect的存儲和取出執行的操作。

4.尚且完善的響應式系統

為什么說是尚且完善的響應式系統,這是因為在本段中將循序漸進介紹,如何實現一個功能尚且完善的響應式系統。可以實現通用式的副作用函數,匿名函數也能夠被收集到副作用函數容器中,而非命名的effect函數。

注冊副作用函數

要實現這一點,只需要編寫一個通用函數,提供注冊副作用函數機制即可。

// 全局變量用于存儲當前被注冊的副作用函數
let activeEffect;
// effect用于注冊副作用函數
function effect(fn){
// 當調用effect注冊副作用函數時,將副作用函數fn賦值給activeEffect
activeEffect = fn;
// 執行副作用函數
fn();
}

effect(()=>{
app.innerHTML = state.name + "," + state.age + "," + state.address;
})

在上面代碼片段中,傳遞一個閉包即可實現注冊副作用函數的功能,當effect函數執行時,先將effect傳遞的閉包函數暫存到變量activeEffect,作為當前注冊的副作用函數。

//原始數據
let state = {
name:"onechuan",
age:18,
address:"北京"
}
// 存儲副作用函數的桶
const bucket = new Set();
// 對原始數據的代理
const obj = new Proxy(state,{
// 攔截讀取操作
get(target, key){
// 將activeEffect存儲的副作用函數收集到桶里
if(activeEffect){
bucket.add(activeEffect)
}
// 返回屬性值
return target[key]
},
// 攔截設置操作
set(target, key, newVal){
// 設置屬性值
target[key] = newVal
// 把副作用函數從桶里取出并執行
bucket.forEach(fn=>fn())
// 返回true代表設置操作成功
return true
}
})

effect(()=>{
app.innerHTML = state.name + "," + state.age + "," + state.address;
})

setTimeout(()=>{
//修改全局變量,產生副作用
obj.address = "廣州";
},1000)

當我們在響應式數據obj上設置一個不存在的屬性時,副作用函數并不會去對象上讀取這個屬性的值,也就是這個不存在的屬性并沒有與副作用函數建立響應聯系。原本不應該觸發副作用函數中的匿名函數,但是實際上卻觸發了effect函數的執行,這也印證了我們當前設計的系統還存在缺陷。

之所以出現上面的問題,這是因為在沒有副作用函數與被操作的目標字段之間建立明確的關系,這就是為什么在Vue.js3實際設計中沒有簡單使用Set類型的原因。為了解決這種問題,我們只需要在副作用函數與被操作字段間建立聯系即可,重新設計收集副作用函數的容器數據結構。

依賴收集的數據結構

要重新設計副作用函數的容器數據結構,需要我們分析effect函數的執行機制,這段代碼中存在三個重要部分:

  • 被操作(讀取)的代理對象obj (target對象)
  • 被操作(讀取)的屬性名稱address (target對象的鍵名)
  • 使用effect函數注冊的副作用函數effectFn

三者建立的關系是:

|-target
|- key
|- effectFn

對于上面的分析,我們得先重新設計存儲副作用函數的依賴收集容器的數據結構,創建WeakMap用于存儲對象,Set用于存儲副作用函數。

// 創建存儲副作用函數的桶
const bucket = new WeakMap();
// 全局變量用于存儲被注冊的副作用函數
let activeEffect;

// 響應式函數
const obj = new Proxy(state,{
// 攔截讀取操作
get(target, key){
// 沒有activeEffect
if(!activeEffect) return
// 根據目標對象從桶中獲得副作用函數
let depsMap = bucket.get(target);
// 判斷是否存在,不存在則創建一個Map
if(!depsMap) bucket.set(target, depsMap = new Map())
// 根據key從depsMap取的deps,存儲著與key相關的副作用函數
let deps = depsMap.get(key);
// 判斷key對應的副作用函數是否存在
if(!deps) depsMap.set(key, deps = new Set())
// 最后將激活的副作用函數添加到桶里
deps.add(activeEffect)
// 返回屬性值
return target[key]
},
// 攔截設值操作
set(target, key, newVal){
// 設置屬性值
target[key] = newVal;
// 根據target從桶中取的depMaps
const depMaps = bucket.get(target);
// 判斷是否存在
if(!depMaps) return
// 根據key值取得對應的副作用函數
const effects = depMaps.get(key);
// 執行副作用函數
effects && effects.forEach(fn=>fn())
}
})

在上面的代碼片段中,所寫WeakMap、Map和Set的數據結構關系如下圖所示。三者的具體作用:

  • WeakMap用于存儲代理對象target,用于存儲和判斷當前對象是否已經被Proxy進行代理過。如果被代理過則直接返回WeakMap中的代理對象,如果沒有被代理過則使用Proxy進行代理后存儲,從而避免同一個對象被代理多次。
  • Map用于存儲經過Proxy代理的對象的屬性名
  • Set用于存儲Map中對應的每個屬性的副作用函數,可以用于去重,避免多次調用

為什么使用WeakMap作為存儲對象的容器呢?

這是因為WeakMap是弱引用的Map,不會影響到垃圾回收機制的正常工作,WeakMap多引用的對象執行完畢后,會將對象從內存中移除,從而避免內存泄漏。所以WeakMap經常用于存儲那些只有當key所引用對象存在時(沒有被回收)才有價值的信息。

在前面代碼片段中,如果target對象沒有任何引用了,說明用戶沒有使用它,此時垃圾回收機制就可以將其進行清除,從而避免內存溢出。

整理抽取代碼

將前面的代碼片段進行抽取函數,封裝得到track和trigger函數,使得我們的代碼邏輯更加清晰明了,也能帶給我們更大的靈活性。

// 全局變量用于存儲被注冊的副作用函數
let activeEffect;
// 創建存儲副作用函數的桶
const bucket = new WeakMap();
// 原始數據
const state = {
name:"pingping",
age:18,
address:"北京"
}

// 響應式函數
const obj = new Proxy(state,{
// 攔截讀取操作
get(target, key){
// 將副作用函數activeEffect添加到存儲副作用函數的WeakMap中
track(target, key)
// 返回屬性值
return target[key]
},
// 攔截設值操作
set(target, key, newVal){
// 設置屬性值
target[key] = newVal;
// 將副作用函數從WeakMap中取出并執行
trigger(target, key)
}
})

// 在get攔截函數中調用追蹤取值函數的變化
function track(target, key){
// 沒有activeEffect
if(!activeEffect) return
// 根據目標對象從桶中獲得副作用函數
let depsMap = bucket.get(target);
// 判斷是否存在,不存在則創建一個Map
if(!depsMap) bucket.set(target, depsMap = new Map())
// 根據key從depsMap取的deps,存儲著與key相關的副作用函數
let deps = depsMap.get(key);
// 判斷key對應的副作用函數是否存在
if(!deps) depsMap.set(key, deps = new Set())
// 最后將激活的副作用函數添加到桶里
deps.add(activeEffect)
}

// 在set攔截函數中調用trigger函數觸發變化
function trigger(target, key){
// 根據target從桶中取的depMaps
const depMaps = bucket.get(target);
// 判斷是否存在
if(!depMaps) return
// 根據key值取得對應的副作用函數
const effects = depMaps.get(key);
// 執行副作用函數
effects && effects.forEach(fn=>fn())
}
// effect用于注冊副作用函數
function effect(fn){
// 當調用effect注冊副作用函數時,將副作用函數fn賦值給activeEffect
activeEffect = fn;
// 執行副作用函數
fn();
}


effect(()=>{
console.log("打印");
document.body.innerText = obj.name + "," + obj.age + "," + obj.address;
})

// 設置一個不存在的屬性時
setTimeout(()=>{
obj.address = "廣州"
},1000)

5.寫在后面

在本文中簡單實現了可以進行依賴收集的響應式系統,使用WeakMap配合Map構建了新的存儲結構,能夠在響應式數據和副作用函數之間建立更加精確的聯系。之所以采用WeakMap存儲引用對象,是因為其是弱引用的,當某個對象不再被使用時會被垃圾回收機制清除。此外,還對響應式系統的代碼進行了功能抽取,對應封裝成調用函數track和trigger。

責任編輯:武曉燕 來源: 前端一碼平川
相關推薦

2022-04-09 17:53:56

Vue.js分支切換嵌套的effect

2022-04-04 16:53:56

Vue.js設計框架

2022-04-01 08:08:27

Vue.js框架命令式

2022-04-17 09:18:11

響應式數據Vue.js

2022-04-25 07:36:21

組件數據函數

2022-04-12 08:08:57

watch函數options封裝

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2022-04-16 13:59:34

Vue.jsJavascript

2022-04-11 08:03:30

Vue.jscomputed計算屬性

2022-04-14 09:35:03

Vue.js設計Reflect

2022-04-03 15:44:55

Vue.js框架設計設計與實現

2022-05-03 21:18:38

Vue.js組件KeepAlive

2025-09-03 02:46:00

Vue.js響應式變量

2022-04-26 05:55:06

Vue.js異步組件

2022-04-19 23:01:54

Vue.jsDOM節點DOM樹

2022-04-20 09:07:04

Vue.js的事件處理

2017-08-30 17:10:43

前端JavascriptVue.js

2021-01-22 11:47:27

Vue.js響應式代碼

2018-01-31 15:45:07

前端Vue.js組件

2019-10-15 09:05:07

域插槽組件前端
點贊
收藏

51CTO技術棧公眾號

原创国产精品91| 求av网址在线观看| 国内小视频在线看| 日韩电影一区二区三区四区| 亚洲免费资源在线播放| 国产91精品在线播放| 国产精品91av| 亚洲午夜精品久久久| 丝袜久久网站| 午夜在线电影亚洲一区| 99九九视频| 男人与禽猛交狂配| 欧美亚洲人成在线| 中文一区在线播放| 国产精品高潮呻吟久久av野狼| 成人性生活免费看| 成人三级小说| 久久久久9999亚洲精品| 欧美尤物巨大精品爽| 亚洲中文字幕无码一区| 久久久123| 国产 欧美在线| 色综合色综合久久综合频道88| 992kp免费看片| 巨大荫蒂视频欧美大片| 奇米影视在线99精品| 国产亚洲精品久久久久久牛牛 | 国产剧情在线观看一区| 亚洲国产欧美在线| 国产精品久久亚洲| 99免费在线观看| 国产乱人伦丫前精品视频| 一区二区三区免费看视频| http;//www.99re视频| 精品乱码一区内射人妻无码| 日韩激情图片| 777a∨成人精品桃花网| 日本女人高潮视频| 性少妇videosexfreexxx片| 欧美日韩国产欧| 亚洲成avwww人| 成人性做爰片免费视频| 麻豆av电影在线观看| 久久福利一区| 日日骚久久av| 真实乱偷全部视频| a级大胆欧美人体大胆666| 97久久精品人人澡人人爽| 日本精品在线视频| 久久久久久久久久久久久久av| 宅男在线一区| 欧美福利视频一区| 欧美一区二区视频在线播放| 午夜激情小视频| 日本成人在线视频网站| 欧美有码在线视频| 久草视频在线观| 国产欧美丝祙| 色偷偷88888欧美精品久久久| 亚洲自拍偷拍一区二区| 午夜精品久久久久久毛片| 在线视频一区二区三| 中国黄色录像片| 中文字幕在线播放网址| 26uuu另类欧美亚洲曰本| 国产精品香蕉国产| 久久精品视频8| 日韩国产一区二区三区| 中文字幕亚洲一区| 黄色录像a级片| 亚洲精品一区av| 欧美性精品220| 好吊色视频988gao在线观看| 精品无人乱码| 成人午夜看片网址| 国产欧美一区二区白浆黑人| 免费看日韩毛片| 91精品秘密在线观看| 亚洲精品在线不卡| 日韩精品国产一区| 国产一区在线电影| 亚洲精品一区二区三区不| 男人天堂av电影| 成人资源在线播放| 欧美色爱综合网| 毛片在线视频播放| 99久久精品免费观看国产| 一区二区在线观看免费视频播放| 性欧美精品一区二区三区在线播放| 欧美一级视频免费| 国产精品456露脸| 国产主播欧美精品| a级片在线播放| 美女视频黄久久| 日本久久中文字幕| 国产一区二区网站| 青青国产91久久久久久| 亚洲综合色av| 99久久精品国产一区二区成人| 欧美aaaaa成人免费观看视频| 91亚洲午夜在线| 一区二区三区免费在线视频| 丁香啪啪综合成人亚洲小说 | 亚洲国产精品成人久久蜜臀| 久久新电视剧免费观看| www.久久草| 高h视频在线| 久久九九全国免费| 色呦呦网站入口| 黄在线免费观看| 精品电影在线观看| 久久国产成人精品国产成人亚洲| 色在线视频网| 一区二区在线观看视频在线观看| 国内性生活视频| av手机在线观看| 欧美日本韩国一区二区三区视频| 亚洲国产高清av| 成人精品高清在线视频| 欧美网站一区二区| 波多结衣在线观看| 黑色丝袜福利片av久久| 亚洲国产精品人久久电影| 亚洲视频 中文字幕| 国语产色综合| 91av在线免费观看| 少妇高潮av久久久久久| 综合天堂久久久久久久| 欧美老妇交乱视频| 国产黄色片视频| 久久99精品国产麻豆婷婷洗澡| 成人av在线网址| 99在线精品视频免费观看软件| 久久久不卡网国产精品一区| 99热久久这里只有精品| 国产资源在线观看入口av| 精品人伦一区二区三区蜜桃网站| 日日摸日日碰夜夜爽av| 亚洲视频国产| 日韩高清av一区二区三区| 国产全是老熟女太爽了| 极品中文字幕一区| 日本精品久久久久影院| 天天操天天干天天| 国产日韩欧美综合在线| 色乱码一区二区三区熟女| 日韩精品麻豆| 欧美不卡一区二区三区四区| 中文字幕 亚洲一区| 国模吧视频一区| 国产mv免费观看入口亚洲| 少妇人妻一区二区| 亚洲国产成人av网| 国产香蕉精品视频| 国产成人3p视频免费观看| 91av在线看| 欧美日韩国产中文字幕在线| 欧美性xxxxx极品| 欧美激情aaa| 久久亚洲精选| 99蜜桃在线观看免费视频网站| 国产一二三区在线观看| 欧美一区二区三区不卡| 30一40一50老女人毛片| 国产精品综合色区在线观看| 九色91在线视频| 成人国产免费电影| 色系网站成人免费| 在线观看视频在线观看| 国产精品美女久久久久久不卡| 2019av中文字幕| 激情小视频在线观看| 欧美亚洲一区三区| 中文字幕五月天| 成人av网址在线观看| 亚洲综合第一| 欧美日韩国产v| 精品国产乱码久久久久久图片| 国产精彩视频在线| 久久久午夜电影| 视频在线观看免费高清| 亚欧日韩另类中文欧美| 国产精品久久久久久久电影| 久久99精品久久| 亚洲风情亚aⅴ在线发布| 毛片视频网站在线观看| 国产精品视频观看| 日av中文字幕| 蜜桃久久久久| 日韩中文字幕亚洲| 国产免费一区二区三区四区五区| 国产999精品久久| 啊啊啊一区二区| 久久亚洲专区| 国产精品美女在线| 日韩专区一区二区| 亚洲成人av免费| 亚洲午夜久久久久久久国产| 亚洲影视综合| 久久精品国产一区二区三区日韩 | 色偷偷成人一区二区三区91| 亚洲区一区二区三| 老牛影视一区二区三区| 在线播放 亚洲| 五月国产精品| 亚洲自拍偷拍视频| 日产精品一区| 在线看福利67194| 亚洲黄色在线观看视频| 欧美视频第二页| 国产成人无码精品亚洲| 亚洲欧洲精品一区二区三区| 在线观看岛国av| 日韩欧美中文| 精品国产一区二区三区日日嗨| 9999在线视频| 伊人青青综合网站| 日韩有码第一页| 欧美一区二区三区免费视频| 黄色污污网站在线观看| 亚洲图片欧美色图| 日韩aaaaa| 狠狠网亚洲精品| 国产精品视频二| 水蜜桃久久夜色精品一区| 久久婷婷开心| 欧美男体视频| 国内自拍欧美激情| 日本韩国一区| 精品国产伦理网| 国产成人精品亚洲精品色欲| 在线不卡中文字幕| 中文字幕在线一| 一区二区三区日韩| 99热在线观看精品| 国产日韩欧美不卡在线| 97超碰在线免费观看| 99re这里只有精品6| youjizz.com国产| 高清不卡一区二区在线| 国产精品一级无码| 国产成人综合视频| 小日子的在线观看免费第8集| 久久国产免费看| 免费看黄在线看| 加勒比久久综合| 欧美理论一区二区| 久久69成人| 欧美激情影音先锋| 欧美偷拍视频| 亚洲另类xxxx| 99在线观看精品视频| 91精品国产综合久久福利| 国产孕妇孕交大片孕| 亚洲成人av一区二区三区| 九九热这里有精品视频| 久久久久久久电影| 国精产品一区一区三区免费视频| 久久日韩粉嫩一区二区三区| 精品国产av无码| 国产女人aaa级久久久级 | 日本在线中文字幕一区二区三区| 国产xxx69麻豆国语对白| 国产黄色在线观看| 久久亚洲春色中文字幕| 色综合888| 亚洲人成网站免费播放| 亚洲a视频在线| 欧美xxxxxxxxx| 日韩欧美在线番号| 夜夜躁日日躁狠狠久久88av | 最新热久久免费视频| 五月天婷婷色综合| 亚洲成av人片在线观看无码| 日本高清www免费视频| 一道本成人在线| 一本到在线视频| 精品久久久久久久人人人人传媒 | 久久久午夜精品| 又嫩又硬又黄又爽的视频| av色综合久久天堂av综合| 九九热精品国产| 日韩高清在线不卡| а 天堂 在线| 99在线热播精品免费| 久久久久久久毛片| 亚洲女女做受ⅹxx高潮| 日日夜夜综合网| 欧美视频一区二| 韩国av永久免费| 日韩欧美激情一区| 国产精品久久久久久久一区二区 | 午夜小视频在线播放| 中文字幕不卡在线视频极品| 污片在线免费观看| 日本免费久久高清视频| 亚洲精品在线a| 日本一区视频在线播放| 色天天色综合| 制服诱惑一区| 97精品国产一区二区三区| 国产免费内射又粗又爽密桃视频| 97精品97| 久久精品免费一区二区| 国产美女精品在线| 欧美大尺度做爰床戏| 粉嫩蜜臀av国产精品网站| 欧美丰满美乳xxⅹ高潮www| 亚洲国产一区二区视频| 伊人久久中文字幕| 在线免费亚洲电影| 午夜精品久久久久久久99老熟妇| 欧美一级一区二区| 青青草av免费在线观看| 欧美国产在线视频| 久久精品97| 免费成人深夜夜行视频| 欧美色123| 91网址在线观看精品| 国产午夜精品理论片a级大结局| 免费观看一级视频| 777欧美精品| jzzjzzjzz亚洲成熟少妇| 色香阁99久久精品久久久| 色黄视频在线观看| 日韩美女在线看| 欧美成人午夜77777| 毛片在线视频观看| 精品亚洲免费视频| 极品尤物一区二区| 色视频成人在线观看免| 中文区中文字幕免费看| 日韩第一页在线| 久久99亚洲网美利坚合众国| 91在线免费观看网站| 99久久精品网站| 真人抽搐一进一出视频| 国产伦精品一区二区三区免费| 人妻激情偷乱频一区二区三区| 18欧美乱大交hd1984| 亚洲手机在线观看| 一个色综合导航| 日本一道高清亚洲日美韩| 欧美尤物一区| 一个色综合网| 亚洲无在线观看| 日韩理论片一区二区| 日韩av女优在线观看| 欧美va亚洲va| 精灵使的剑舞无删减版在线观看| 91日韩久久| 欧美精品一区二区三区精品| 国产精品8888| 国产曰批免费观看久久久| 午夜精品一区二区三区视频| 欧美精品丝袜中出| av网站导航在线观看免费| 91嫩草免费看| 99热免费精品| www激情五月| 亚洲欧美日本在线| 国产叼嘿视频在线观看| 久久久久久久久久av| 欧美日韩大片免费观看| 久久国产乱子伦免费精品| 国产精品亚洲午夜一区二区三区 | 国产精品久久7| 亚洲日产国产精品| 污污的视频免费| 国产精品久久久久久久岛一牛影视 | 亚洲人吸女人奶水| 亚洲精品国产suv一区| 午夜剧场成人观在线视频免费观看| 视频精品导航| 宅男av一区二区三区| 国产电影一区二区三区| 久久精品国产亚洲AV无码麻豆| 日韩精品极品视频| 免费高清视频在线一区| 免费成人进口网站| 成人ar影院免费观看视频| 日韩在线 中文字幕| 最新的欧美黄色| 亚洲精品a区| 玩弄japan白嫩少妇hd| 亚洲视频一区二区在线观看| 天天操天天射天天| 国产精品第二页| 欧美日韩第一区| 一级黄色性视频| 狠狠综合久久av一区二区小说| 福利在线观看| 国产精品入口免费| 日韩av中文字幕一区二区三区| 日本 欧美 国产| 亚洲精品98久久久久久中文字幕| 全球最大av网站久久| 9色porny| 中文字幕高清一区| 天天干天天干天天干|