精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

性欧美xxxx大乳国产app| 91麻豆精品国产综合久久久| 91视频精品在这里| 国产精品中文在线| 欧美成人777| 国产主播性色av福利精品一区| 亚洲高清不卡在线| 色一情一乱一伦一区二区三欧美| 99久久婷婷国产一区二区三区| 激情自拍一区| 色综合影院在线| www.555国产精品免费| 韩国美女久久| 一区二区在线观看视频| 欧美日韩在线观看一区二区三区| 国产成人三级一区二区在线观看一| 国产日韩1区| 久久精品国产电影| 性欧美丰满熟妇xxxx性仙踪林| 3d动漫一区二区三区在线观看| 亚洲成人av电影在线| 在线视频91| 欧美男男同志| 国产精品一二三区| 国产精品免费一区二区三区都可以| 全网免费在线播放视频入口| 亚洲精品亚洲人成在线| 欧美精品一区二区三区久久久| 亚洲福利精品视频| 天堂资源在线| 亚洲午夜在线视频| 伊人久久大香线蕉精品| 国产玉足榨精视频在线观看| 懂色av一区二区在线播放| 国产一区二区视频在线观看| 欧美一级特黄视频| 激情综合自拍| 色综合色综合久久综合频道88| 男人天堂资源网| 精品欧美久久| 精品在线小视频| www.美色吧.com| 日本一区二区三区视频在线看| 欧美无乱码久久久免费午夜一区| 欧美亚洲一二三区| 2020国产在线| 亚洲综合精品久久| 91精品国产毛片武则天| 大地资源网3页在线观看| 国产清纯白嫩初高生在线观看91 | 好男人www社区| 女人高潮被爽到呻吟在线观看| 亚洲一区av在线| 国产免费内射又粗又爽密桃视频 | 欧美极品少妇全裸体| 美国黄色小视频| 欧美久久久久| 欧美夫妻性生活xx| www.youjizz.com亚洲| 今天的高清视频免费播放成人| 欧美激情精品久久久久久大尺度| 免费一级肉体全黄毛片| 国产精品啊v在线| 国内偷自视频区视频综合| 国产性70yerg老太| 在线欧美日韩| 91成人天堂久久成人| 国产精品第9页| 羞羞答答国产精品www一本| 热99久久精品| 一级黄色片免费看| 国产成人综合在线播放| 精品国产免费久久久久久尖叫| 污视频软件在线观看| 2021久久国产精品不只是精品| 精品欧美国产一区二区三区不卡| 日韩精品系列| 国产精品视频第一区| 色乱码一区二区三区熟女| 日本中文字幕中出在线| 欧美日韩精品在线视频| 天天干在线影院| 国产日韩欧美中文在线| 亚洲电影在线看| 久久久久久久毛片| 婷婷激情综合| 国内成人精品视频| 中文字幕+乱码+中文乱码www| 精品一区二区三区免费视频| 国产传媒一区二区三区| 日本又骚又刺激的视频在线观看| 中文字幕高清一区| www.国产在线视频| 日本美女久久| 精品久久久久久久一区二区蜜臀| 一本色道久久综合亚洲精品图片| 久久国产小视频| 久久久亚洲国产| 中文字幕欧美在线观看| 成人综合婷婷国产精品久久| 欧美日韩国产综合在线| 91高清在线观看视频| 黑丝美女久久久| 午夜大片在线观看| 欧美人与拘性视交免费看| 久久亚洲精品毛片| 欧美日韩综合一区二区三区| 国产激情一区二区三区四区| 欧美一二三区| 少女频道在线观看免费播放电视剧| 欧美三级欧美成人高清www| 黄色三级视频在线播放| 国产在线日韩精品| 久久久亚洲影院| 国产精品欧美久久久久天天影视| 91丨porny丨国产| 亚洲色欲久久久综合网东京热| 欧美美女被草| 亚洲小视频在线观看| 日本少妇全体裸体洗澡| 国内精品免费**视频| 欧洲av一区| 国模私拍一区二区国模曼安| 67194成人在线观看| 欧美黄色一级生活片| 99亚洲一区二区| 成人免费在线一区二区三区| 久久综合网导航| 欧美性色黄大片手机版| 少妇饥渴放荡91麻豆| 狠狠色丁香久久综合频道| 91免费精品视频| 欧美午夜电影一区二区三区| 欧美日韩一区二区在线播放| av漫画在线观看| 国产综合婷婷| 波多野结衣一区二区三区在线观看| 黄在线免费看| 91麻豆精品国产无毒不卡在线观看| 91视频免费在观看| 日日摸夜夜添夜夜添亚洲女人| 久久久99爱| 成人一级福利| 日韩成人黄色av| 国产成人无码精品| 97成人超碰视| 噜噜噜久久亚洲精品国产品麻豆| 久本草在线中文字幕亚洲| 欧美大片第1页| 亚洲精品久久久久久久久久久久久久 | 99人久久精品视频最新地址| 国产日韩一区二区| 精品三级久久| 亚洲嫩模很污视频| 五月婷婷激情视频| 国产亚洲精品7777| av五月天在线| 欧美xxxx中国| 亚洲最大的网站| 污视频在线免费观看网站| 日韩欧美一区二区免费| 久久久久久国产精品视频| 成人午夜在线视频| 337p粉嫩大胆噜噜噜鲁| 亚洲激情77| 国产欧美精品va在线观看| av在线电影网| 欧美一区二区免费| 久视频在线观看| 337p粉嫩大胆噜噜噜噜噜91av | 日韩精品亚洲视频| 国产99免费视频| 中文字幕日韩精品一区| 女教师高潮黄又色视频| 99综合在线| 日韩欧美一区二区三区四区五区| 国产精品一区二区免费福利视频| 欧美成年人网站| 免费国产精品视频| 日本久久一区二区| 希岛爱理中文字幕| 99久久精品国产麻豆演员表| 国产xxxxx视频| 午夜激情久久| 国产欧美日韩综合精品二区| 国产亚洲一区二区手机在线观看 | 国产91高潮流白浆在线麻豆| 一女被多男玩喷潮视频| 国内精品视频在线观看| 91中文字幕在线观看| 九九色在线视频| 亚洲偷欧美偷国内偷| 精品人妻午夜一区二区三区四区| 黄色精品一区二区| 香蕉久久久久久久| av一本久道久久综合久久鬼色| 国产又大又黄又粗的视频| 国产精品大片| 日韩中文字幕一区二区| 91亚洲无吗| 国产欧美日韩中文字幕在线| 国产嫩草在线视频| 日韩一区二区福利| 涩涩视频在线观看免费| 日韩欧美视频一区| 成人黄色免费网| 欧美日韩国产在线| 欧美色图亚洲天堂| 国产精品乱人伦中文| 欧洲一级黄色片| 国产精一区二区三区| 亚洲三级视频网站| 亚洲一区观看| 精品无码国产一区二区三区av| 999精品视频| 欧美连裤袜在线视频| 懂色av一区二区| 成人性生交大片免费看视频直播| 婷婷综合六月| 欧美一级大片在线观看| 国产三线在线| 欧美大片免费看| a毛片在线播放| 最新国产精品拍自在线播放| 久久电影中文字幕| 日韩电影网在线| 内射后入在线观看一区| 欧美一区2区视频在线观看| 在线观看黄色网| 欧美无人高清视频在线观看| 国产精品久久久久久人| 午夜精品久久一牛影视| 国语对白一区二区| 亚洲高清免费观看| 久久精品国产亚洲av麻豆色欲| 亚洲精品欧美专区| 亚洲xxxx3d动漫| 亚洲精品日韩一| 欧美成人精品欧美一级| 亚洲精品国产视频| 九九视频在线观看| 亚洲免费成人av| 免费一级a毛片夜夜看 | 久久综合九色综合欧美98| 理论片大全免费理伦片| 处破女av一区二区| 亚州av综合色区无码一区| av在线免费不卡| 五月开心播播网| 91亚洲资源网| 熟女少妇一区二区三区| 久久久精品国产免大香伊| 久久久久久久久久久久| 欧美激情一二三区| www.xx日本| 一区二区三区高清在线| 久久中文字幕在线观看| 欧美小视频在线观看| 欧美一区二区三区网站| 欧美三级一区二区| 97人妻人人澡人人爽人人精品| 日韩一区二区三区免费观看| 不卡视频在线播放| 亚洲精品美女视频| 猫咪在线永久网站| 日韩在线小视频| a视频在线观看| 9.1国产丝袜在线观看| 黑人巨大精品| 国产色视频一区| 懂色av一区二区| 四虎永久在线精品免费一区二区| 国产精品国产三级国产在线观看| 国产美女作爱全过程免费视频| 亚洲精品免费观看| 午夜免费福利在线| 国产美女av一区二区三区| 天天躁日日躁狠狠躁av| 久久久久久久久久久黄色| 麻豆一区在线观看| 亚洲成人综合网站| 国产情侣免费视频| 精品日韩在线一区| 国产专区在线| 久久99精品久久久久久噜噜 | yourporn在线观看中文站| 久热99视频在线观看| 成人ssswww在线播放| 国产欧美日韩丝袜精品一区| 国产精品zjzjzj在线观看| 亚洲v国产v| 亚洲日本免费| 亚洲精品性视频| 99精品欧美一区| 欧美成人777| 在线中文字幕一区二区| 亚洲精选一区二区三区| 在线视频中文亚洲| 91吃瓜在线观看| 国产日韩欧美在线| 婷婷成人在线| 成人午夜免费剧场| 久久精品99国产精品| 日本免费福利视频| 亚洲影视在线播放| 夜夜嗨aⅴ一区二区三区| 日韩精品免费电影| 性欧美1819sex性高清大胸| 国产精品白嫩美女在线观看| 国产乱论精品| 18视频在线观看娇喘| 久久婷婷av| a天堂视频在线观看| 亚洲一区二区三区中文字幕在线| 中文字幕免费播放| 亚洲欧美日韩中文视频| 91福利区在线观看| 99在线视频首页| 亚洲第一偷拍| 久热精品在线观看视频| 久久久久久久久一| 亚洲不卡在线视频| 亚洲韩国青草视频| 不卡av免费观看| 91久久国产综合久久蜜月精品| 欧美超碰在线| 91福利国产成人精品播放| 久久久久国产精品麻豆| 国产高潮久久久| 亚洲国产精品成人va在线观看| 欧美日韩经典丝袜| 91久久精品国产91久久性色tv| 中文字幕日韩欧美精品高清在线| 最新中文字幕免费视频| 日本一区二区三区免费乱视频| 亚洲天堂一区在线观看| 日韩成人久久久| 欧美日韩国产v| 欧美日韩一区二区三区在线视频| 午夜亚洲性色视频| 日韩av一二区| 日韩欧美在线免费| 国产最新视频在线观看| 国产精品久久久久久久久久三级| 国产一区二区亚洲| 一区二区三区免费播放| 国产精品欧美一级免费| 在线播放成人av| 久久九九免费视频| 亚州一区二区| 国产极品在线视频| 91美女视频网站| 激情视频网站在线观看| 在线日韩中文字幕| 高清一区二区| 亚洲一区二区三区av无码| www.欧美日韩| 在线视频一区二区三区四区| 亚洲欧美资源在线| 国产原创一区| 超碰人人爱人人| 99精品视频在线免费观看| 欧美日韩综合一区二区三区| 中文字幕亚洲欧美一区二区三区| 99er精品视频| 男人插女人视频在线观看| 91蝌蚪porny| 国产尤物视频在线观看| 欧美激情一二区| 亚洲传媒在线| 午夜剧场高清版免费观看 | 麻豆久久久久久久久久| 亚洲区在线播放| 亚洲精品一区二区在线播放∴| 欧美视频在线第一页| 26uuu欧美| 一二三区中文字幕| 久久久久久久久久婷婷| 精品日韩免费| zjzjzjzjzj亚洲女人| 色偷偷久久人人79超碰人人澡| 日本视频在线免费观看| 国产精品日本一区二区| 日韩电影在线一区二区| 国产高潮国产高潮久久久91| 亚洲欧洲国产伦综合| av日韩一区| 波多野结衣家庭教师在线| 中文字幕一区二区5566日韩| 手机在线观看免费av| 国产精品免费网站| 宅男噜噜噜66一区二区| 久久人妻无码aⅴ毛片a片app| 亚洲电影免费观看高清完整版在线观看| 一区在线影院| 久久成人福利视频| 国产精品久久久久久久浪潮网站| 天天舔天天干天天操| 91九色单男在线观看| 日韩中文字幕一区二区三区|