成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定?下面本篇文章給大家介紹一下Vue.js數(shù)據(jù)雙向綁定的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助!

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

前端(vue)入門(mén)到精通課程,老師在線(xiàn)輔導(dǎo):聯(lián)系老師
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

在我們使用vue的時(shí)候,當(dāng)數(shù)據(jù)發(fā)生了改變,界面也會(huì)跟著更新,但這并不是理所當(dāng)然的,我們修改數(shù)據(jù)的時(shí)候vue是如何監(jiān)聽(tīng)數(shù)據(jù)的改變以及當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候vue如何讓界面刷新的?

當(dāng)我們修改數(shù)據(jù)的時(shí)候vue是通過(guò)es5中的Object.defineProperty方法來(lái)監(jiān)聽(tīng)數(shù)據(jù)的改變的,當(dāng)數(shù)據(jù)發(fā)生了改變通過(guò)發(fā)布訂閱模式統(tǒng)計(jì)訂閱者界面發(fā)生了刷新,這是一種設(shè)計(jì)模式。【學(xué)習(xí)視頻分享:vue視頻教程、web前端視頻】

下圖,從new Vue開(kāi)始創(chuàng)建Vue實(shí)例,會(huì)傳入el和data,data會(huì)被傳入一個(gè)觀(guān)察者對(duì)象,利用Object.definproperty將data里數(shù)據(jù)轉(zhuǎn)化成getter/setter進(jìn)行數(shù)據(jù)劫持,data里的每個(gè)屬性都會(huì)創(chuàng)建一個(gè)Dep實(shí)例用來(lái)保存watcher實(shí)例

而el則傳入compile,在compile里進(jìn)行指令的解析,當(dāng)解析到el中使用到data里的數(shù)據(jù)會(huì)觸發(fā)我們的getter,從而將我們的watcher添加到依賴(lài)當(dāng)中。當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候會(huì)觸發(fā)我們的setter發(fā)出依賴(lài)通知,通知watcher,watcher接受到通知后去向view發(fā)出通知,讓view去更新

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

數(shù)據(jù)劫持

html部分創(chuàng)建一個(gè)id為app的div標(biāo)簽,里面有span和input標(biāo)簽,span標(biāo)簽使用了插值表達(dá)式,input標(biāo)簽使用了v-model

<div class="container" id="app">     <span>內(nèi)容:{{content}}</span>     <input type="text" v-model="content"> </div>
登錄后復(fù)制

js部分引入了一個(gè)vue.js文件,實(shí)現(xiàn)數(shù)據(jù)雙向綁定的代碼就寫(xiě)在這里面,然后創(chuàng)建Vue實(shí)例vm,把數(shù)據(jù)掛載到div標(biāo)簽上

const vm=new Vue({     el:'#app',         data:{         content:'請(qǐng)輸入開(kāi)機(jī)密碼'     } })
登錄后復(fù)制

new了一個(gè)Vue實(shí)例很明顯需要用到構(gòu)造函數(shù),在vue的源碼里定義類(lèi)是使用了function來(lái)定義的,這里我使用ES6的class來(lái)創(chuàng)建這個(gè)Vue實(shí)例

然后設(shè)置constructor,形參設(shè)為obj_instance,作為new一個(gè)Vue實(shí)例的時(shí)候傳入的對(duì)象,并把傳進(jìn)來(lái)的對(duì)象里的data賦值給實(shí)例里的$data屬性

在javascript里對(duì)象的屬性發(fā)生了變化,需要告訴我們,我們就可以把更改后的屬性更新到dom節(jié)點(diǎn)里,因此初始化實(shí)例的時(shí)候定義一個(gè)監(jiān)聽(tīng)函數(shù)作為調(diào)用,調(diào)用的時(shí)候傳入需要監(jiān)聽(tīng)的數(shù)據(jù)

class Vue{//創(chuàng)建Vue實(shí)例   constructor(obj_instance){     this.$data=obj_instance.data     Observer(this.$data)   } } function Observer(data_instance){//監(jiān)聽(tīng)函數(shù)    }
登錄后復(fù)制

打印一下這個(gè)實(shí)例vm

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

實(shí)例已經(jīng)創(chuàng)建出來(lái)了但是還需要為$data里的每一個(gè)屬性進(jìn)行監(jiān)聽(tīng),要實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)就用到了Object.definePropertyObject.defineProperty可以修改對(duì)象的現(xiàn)有屬性,語(yǔ)法格式為Object.defineProperty(obj, prop, descriptor)

  • obj:要定義屬性的對(duì)象
  • prop:要定義或修改的屬性的名稱(chēng)
  • descriptor:要定義或修改的屬性描述符

監(jiān)聽(tīng)對(duì)象里的每一個(gè)屬性,我們使用Object.keys和foreach遍歷對(duì)象里的每一個(gè)屬性并且對(duì)每一個(gè)屬性使用Object.defineProperty進(jìn)行數(shù)據(jù)監(jiān)聽(tīng)

function Observer(data_instance){   Object.keys(data_instance).forEach(key=>{     Object.defineProperty(data_instance,key,{       enumerable:true,//設(shè)置為true表示屬性可以枚舉       configurable:true,//設(shè)置為true表示屬性描述符可以被改變       get(){},//訪(fǎng)問(wèn)該屬性的時(shí)候觸發(fā),get和set函數(shù)就是數(shù)據(jù)監(jiān)聽(tīng)的核心       set(){},//修改該屬性的時(shí)候觸發(fā)     })   }) }
登錄后復(fù)制

Object.defineProperty前需要將屬性對(duì)應(yīng)的值存起來(lái)然后在get函數(shù)里面返回出來(lái),不然到了get函數(shù)以后屬性的值已經(jīng)沒(méi)了,返回給屬性的值就變成了undefined

let value=data_instance[key] Object.defineProperty(data_instance,key,{   enumerable:true,   configurable:true,   get(){     console.log(key,value);     return value   },   set(){} })
登錄后復(fù)制

點(diǎn)擊一下$data里的屬性名就會(huì)觸發(fā)get函數(shù)

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

然后設(shè)置set函數(shù),為set設(shè)置形參,這個(gè)形參表示新傳進(jìn)來(lái)的屬性值,然后將這個(gè)新的屬性值賦值給變量value,不需要return返回什么,只做修改,返回是在訪(fǎng)問(wèn)get的時(shí)候返回的,修改之后get也會(huì)訪(fǎng)問(wèn)最新的value變量值

set(newValue){     console.log(key,value,newValue);     value = newValue }
登錄后復(fù)制

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

但是當(dāng)前只為$data的第一層屬性設(shè)置了get和set,如果還有更深的一層如

obj:{     a:'a',     b:'b' }
登錄后復(fù)制

這種的并沒(méi)有設(shè)置get和set,我們需要一層一層的往屬性里面進(jìn)行數(shù)據(jù)劫持,因此使用遞歸再次監(jiān)聽(tīng)自己,并在遍歷之前進(jìn)行條件判斷,沒(méi)有子屬性了或者沒(méi)有檢測(cè)到對(duì)象就終止遞歸

function Observer(data_instance){   //遞歸出口   if(!data_instance || typeof data_instance != 'object') return   Object.keys(data_instance).forEach(key=>{     let value=data_instance[key]     Observer(value)//遞歸-子屬性的劫持     Object.defineProperty(data_instance,key,{       enumerable:true,       configurable:true,       get(){         console.log(key,value);         return value       },       set(newValue){         console.log(key,value,newValue);         value = newValue       }     })   }) }
登錄后復(fù)制

還有一個(gè)細(xì)節(jié),如果我們將$data的content屬性從字符串改寫(xiě)成一個(gè)對(duì)象,這個(gè)新的對(duì)象并沒(méi)有g(shù)et和set

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

因?yàn)槲覀冊(cè)谛薷牡臅r(shí)候根本沒(méi)有設(shè)置get和set,因此在set里要調(diào)用監(jiān)聽(tīng)函數(shù)

set(newValue){     console.log(key,value,newValue);     value = newValue     Observer(newValue) }
登錄后復(fù)制

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

模板解析

劫持?jǐn)?shù)據(jù)后就要把Vue實(shí)例里的數(shù)據(jù)應(yīng)用帶頁(yè)面上,得要加一個(gè)臨時(shí)內(nèi)存區(qū)域,將所有數(shù)據(jù)都更新后再渲染頁(yè)面以此減少dom操作

創(chuàng)建一個(gè)解析函數(shù),設(shè)置2個(gè)參數(shù),一個(gè)是Vue實(shí)例里掛載的元素,另一個(gè)是Vue實(shí)例,在函數(shù)里獲取獲取元素保存在實(shí)例了的$el里,獲取元素后放入臨時(shí)內(nèi)存里,需要用到[createDocumentFragment]創(chuàng)建一個(gè)新的空白的文檔片段

然后把$el的子節(jié)點(diǎn)一個(gè)一個(gè)加到fragment變量里,頁(yè)面已經(jīng)沒(méi)有內(nèi)容了,內(nèi)容都被臨時(shí)存在fragment里了

class Vue{   constructor(obj_instance){     this.$data=obj_instance.data     Observer(this.$data)     Compile(obj_instance.el,this)   } } function Compile(ele,vm){   vm.$el=document.querySelector(ele)   const fragment=document.createDocumentFragment()   let child;   while (child=vm.$el.firstChild){     fragment.append(child)   }   console.log(fragment);   console.log(fragment.childNodes); }
登錄后復(fù)制

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

現(xiàn)在直接把需要修改的內(nèi)容應(yīng)用到文檔碎片里面,應(yīng)用后重新渲染,只需修改了fragment的childNodes子節(jié)點(diǎn)的文本節(jié)點(diǎn),文本節(jié)點(diǎn)的類(lèi)型是3,可以創(chuàng)建一個(gè)函數(shù)并調(diào)用來(lái)修改fragment里的內(nèi)容

節(jié)點(diǎn)里面可能還會(huì)有節(jié)點(diǎn),因此判定節(jié)點(diǎn)類(lèi)型是否為3,不是就遞歸調(diào)用這個(gè)解析函數(shù)

節(jié)點(diǎn)類(lèi)型為3就進(jìn)行修改操作,但也不行把整個(gè)節(jié)點(diǎn)的文本都修改,只需修改插值表達(dá)式的內(nèi)容,因此要使用正則表達(dá)式匹配,將匹配的結(jié)果保存到變量里,匹配的結(jié)果是一個(gè)數(shù)組,而索引為1的元素才是我們需要提取出來(lái)的元素,這個(gè)元素就是去除了{(lán){}}和空格得到的字符串,然后就可以直接用Vue實(shí)例來(lái)訪(fǎng)問(wèn)對(duì)應(yīng)屬性的值,修改完后return出去結(jié)束遞歸

function Compile(ele,vm){   vm.$el=document.querySelector(ele) //獲取元素保存在實(shí)例了的$el里   const fragment=document.createDocumentFragment() //創(chuàng)建文檔碎片   let child;   while (child=vm.$el.firstChild){//循環(huán)將子節(jié)點(diǎn)添加到文檔碎片里     fragment.append(child)   }      fragment_compile(fragment)   function fragment_compile(node){ //修改文本節(jié)點(diǎn)內(nèi)容     const pattern = /{{s*(S*)s*}}/ //檢索字符串中正則表達(dá)式的匹配,用于匹配插值表達(dá)式     if(node.nodeType===3){       const result = pattern.exec(node.nodeValue)       if(result){         console.log('result[1]')         const value=result[1].split('.').reduce(//split將對(duì)象里的屬性分布在數(shù)組里,鏈?zhǔn)降剡M(jìn)行排列;reduce進(jìn)行累加,層層遞進(jìn)獲取$data的值           (total,current)=>total[current],vm.$data         )         node.nodeValue=node.nodeValue.replace(pattern,value) //replace函數(shù)將插值表達(dá)式替換成$data里的屬性的值       }       return      }     node.childNodes.forEach(child=>fragment_compile(child))   }   vm.$el.appendChild(fragment) //將文檔碎片應(yīng)用到對(duì)應(yīng)的dom元素里面 }
登錄后復(fù)制

頁(yè)面的內(nèi)容又出來(lái)了,插值表達(dá)式替換成了vm實(shí)例里的數(shù)據(jù)

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

訂閱發(fā)布者模式

雖然進(jìn)行了數(shù)據(jù)劫持,和將數(shù)據(jù)應(yīng)用到頁(yè)面上,但是數(shù)據(jù)發(fā)生變動(dòng)還不能及時(shí)更新,還需要實(shí)現(xiàn)訂閱發(fā)布者模式

首先創(chuàng)建一個(gè)類(lèi)用來(lái)收集和通知訂閱者,生成實(shí)例的時(shí)候需要有一個(gè)數(shù)組存放訂閱者的信息,一個(gè)將訂閱者添加到這個(gè)數(shù)組里的方法和一個(gè)通知訂閱者的方法,調(diào)用這個(gè)方法就回去遍歷訂閱者的數(shù)組,讓訂閱者調(diào)用自身的update方法進(jìn)行更新

class Dependency{   constructor(){     this.subscribers=[] //存放訂閱者的信息   }   addSub(sub){     this.subscribers.push(sub) //將訂閱者添加到這個(gè)數(shù)組里   }   notify(){     this.subscribers.forEach(sub=>sub.update()) //遍歷訂閱者的數(shù)組,調(diào)用自身的update函數(shù)進(jìn)行更新   } }
登錄后復(fù)制

設(shè)置訂閱者類(lèi),需要用到Vue實(shí)例上的屬性,需要Vue實(shí)例和Vue實(shí)例對(duì)應(yīng)的屬性和一個(gè)回調(diào)函數(shù)作為參數(shù),將參數(shù)都賦值給實(shí)例

然后就可以創(chuàng)建訂閱者的update函數(shù),在函數(shù)里調(diào)用傳進(jìn)來(lái)的回調(diào)函數(shù)

class Watcher{   constructor(vm,key,callback){//將參數(shù)都賦值給Watcher實(shí)例     this.vm=vm     this.key=key     this.callback=callback   }   update(){     this.callback()    } }
登錄后復(fù)制

替換文檔碎片內(nèi)容的時(shí)候需要告訴訂閱者如何更新,所以訂閱者實(shí)例在模板解析把節(jié)點(diǎn)值替換內(nèi)容的時(shí)候創(chuàng)建,傳入vm實(shí)例,exec匹配成功后的索引值1和回調(diào)函數(shù),將替換文本的執(zhí)行語(yǔ)句復(fù)制到回調(diào)函數(shù)里,通知訂閱者更新的時(shí)候就調(diào)用這個(gè)回調(diào)函數(shù)

回調(diào)函數(shù)里的nodeValue要提前保存,不然替換的內(nèi)容就不是插值表達(dá)式而是替換過(guò)的內(nèi)容

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

然后就要想辦法將訂閱者存儲(chǔ)到Dependency實(shí)例的數(shù)組里,我們可以在構(gòu)造Watcher實(shí)例的時(shí)候保存實(shí)例到訂閱者數(shù)組里

Dependency.temp=this //設(shè)置一個(gè)臨時(shí)屬性temp
登錄后復(fù)制

將新的訂閱者添加到訂閱者數(shù)組里且還要將所有的訂閱者都進(jìn)行同樣的操作,那么就可以在觸發(fā)get的時(shí)候?qū)⒂嗛喺咛砑拥接嗛喺邤?shù)組里,為了正確觸發(fā)對(duì)應(yīng)的屬性get,需要用reduce方法對(duì)key進(jìn)行同樣的操作

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

可以看到控制臺(tái)打印出了Wathcer實(shí)例,每個(gè)實(shí)例都不同,都對(duì)應(yīng)不同的屬性值

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

Dependency類(lèi)還沒(méi)創(chuàng)建實(shí)例,里面的訂閱者數(shù)組是不存在的,所以要先創(chuàng)建實(shí)例再將訂閱者添加到訂閱者數(shù)組里

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

修改數(shù)據(jù)的時(shí)候通知訂閱者來(lái)進(jìn)行更新,在set里調(diào)用dependency的通知方法,通知方法就會(huì)去遍數(shù)組,訂閱者執(zhí)行自己的update方法進(jìn)行數(shù)據(jù)更新

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

但是update調(diào)用回調(diào)函數(shù)缺少設(shè)定形參,依舊使用split和reduce方法獲取屬性值

update(){     const value =this.key.split('.').reduce(         (total,current)=>total[current],this.vm.$data     )     this.callback(value) }
登錄后復(fù)制

在控制臺(tái)修改屬性值都修改成功了,頁(yè)面也自動(dòng)更新了

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

完成了文本的綁定就可以綁定輸入框了,在vue里通過(guò)v-model進(jìn)行綁定,因此要判斷哪個(gè)節(jié)點(diǎn)有v-model,元素節(jié)點(diǎn)的類(lèi)型是1,可以使用nodeName來(lái)匹配input元素,直接在判斷文本節(jié)點(diǎn)下面進(jìn)行新的判斷

if(node.nodeType===1&&node.nodeName==='INPUT'){     const attr=Array.from(node.attributes)     console.log(attr); }
登錄后復(fù)制

節(jié)點(diǎn)名字nodeName為v-model,nodeValue為name,就是數(shù)據(jù)里的屬性名

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

因此對(duì)這個(gè)數(shù)組進(jìn)行遍歷,匹配到了v-model根據(jù)nodeValue找到對(duì)應(yīng)的屬性值,把屬性值賦值到節(jié)點(diǎn)上,同時(shí)為了在數(shù)據(jù)更新后訂閱者知道更新自己,也要在INPUT節(jié)點(diǎn)里新增Watcher實(shí)例

attr.forEach(i=>{     if(i.nodeName==='v-model'){         const value=i.nodeValue.split('.').reduce(             (total,current)=>total[current],vm.$data         )         node.value=value         new Watcher(vm,i.nodeValue,newValue=>{             node.value=newValue         })     } })
登錄后復(fù)制

修改屬性值,頁(yè)面也作出修改

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

最后剩下用視圖改變數(shù)據(jù),在v-model的節(jié)點(diǎn)上使用addEventListener增加input監(jiān)聽(tīng)事件就行了

node.addEventListener('input',e=>{     const arr1=i.nodeValue.split('.')     const arr2=arr1.slice(0,arr1.length - 1)     const final=arr2.reduce(         (total,current)=>total[current],vm.$data     )     final[arr1[arr1.length - 1]]=e.target.value })
登錄后復(fù)制

聊聊Vue中如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

(學(xué)習(xí)視頻分享:web前端開(kāi)發(fā)、編程基礎(chǔ)視頻)

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
亚洲精品无码鲁网中文电影| 亚洲AⅤ永久无码中文字幕| 久久人妻少妇嫩草AV无码专区| 亚洲精品国偷自产在线99正片| 亚洲成AⅤ人的天堂在线观看女人| 日韩一区二区三区北条麻妃| 裸体跳舞XXXX裸体跳舞| 国产综合久久亚洲综合| 俄罗斯人和欧洲人的性格差异| 2012电影在线观看神马影院| 亚洲欧美精品伊人久久| 无人区码二码三码四码区别| 色欲蜜臀AV在线播放| 欧美色欧美亚洲高清在线观看 | 精品 亚洲 无码 自拍 另类| 高清欧美性猛交XXXX黑人猛交| 综合 欧美 亚洲日本| 要灬要灬再深点受不了好舒服| 亚洲AV成人精品一区二区三区 | 国自产拍亚洲免费视频| 夫妇交换聚会群4P疯狂大战| 国产精品无码MV在线观看| 粉嫩av一区二区三区| 波多野结衣AV一区二区三区中文| 99国内精品久久久久久久| 中文字幕JUL975老公不在| 亚洲熟妇无码一区二区三区| 亚洲国产成人精品青青草原| 小荡货奶真大水多好紧视频| 无码人妻精一区二区三区| 色AV综合AV无码AV网站| 日韩人妻无码一区二区三区99| 欧美肉体裸交做爰XXXⅩ性玉| 少妇被粗大的猛进出69影院| 日韩欧美视频一区| 性VODAFONEWIFI另类| 欲求不満な人妻は毎晩隣人に| 伊人久久大香线蕉AV五月天宝贝| 亚洲最大的成人网站| YYYY1111少妇影院在线观| wwwxxx亚洲| 超薄肉色丝袜一区二区| 厨房掀起少妇裙子挺进去| 丰满岳乱妇在线观看中字| 极品美女扒开粉嫩小泬的视频| 欧美白人乱大交XXXX潮喷| 欧美黑人粗暴多交高潮水最多| 男朋友把舌头都伸进我的嘴巴里了 | 777777亚洲午夜成人| 中文字幕人妻AV一区二区| 中文字幕被公侵犯的漂亮人妻| 成人综合婷婷国产精品久久| 丰满少妇A级毛片| 精品视频无码一区二区三区| 久久精品人人做人人爽老司机 | 灌溉系统NPC游戏双男主| 国产夫妻CCCXXX久久久| 国产成人精品综合久久久| 国产乱人伦AV在线无码| 国产AV日韩A∨亚洲AV电影 | 极品丰满熟妇人妻无码| 极品尤物一区二区三区| 人妻波多野结衣爽到喷水| 少妇BBWBBW高潮| 野花日本大全免费观看3中文版| 丰满人妻无奈张开双腿AV| 久久综合给合久久狠狠狠97色| 免费观看的国产大片APP下载| 欧美日韩精品视频一区二区| 亚洲A∨无码男人的天堂| XXXXX18日本人HDXX| 精品久久久无码人妻中文字幕| 老师掀起裙子让我挺进| 欧美 日韩 国产 成人 在线观| 日韩精品无码一区二区三区视频| 亚洲色欲久久久综合网东京热| 高清VIDEOSGRATIS欧| 妺妺窝人体色7777777| 日本巨大的奶头在线观看| 挺进绝色老师的紧窄小肉六视频 | 亚洲欧洲日产国码中文字幕| 公交车上拨开少妇内裤进入| 男男19禁啪啪无遮挡免费| 亚洲AV永久无码一区| 中文字幕精品无码| 国外精产品W灬源码16| 日韩欧美人妻一区二区三区 | 亚洲第一无码AV播放器下载| 成人一区二区不卡久久久| 美女高潮无遮挡免费视频| 日本高清视频网站WWW| 一区二区三区精品视频日本 | 国产精品爱久久久久久久小说| 极品教师高清免费观看 | 夫妇交换聚会群4P疯狂大战| 女生输了给对方玩一个月| 亚洲熟妇无码av叧娄本色| 国产精品一区二区国产馆蜜桃| 人妻跪趴高撅肥臀| 亚洲AⅤ永久无码精品三区在线| 波多野结衣一区二区三区AV高清| 麻豆WWW传媒入口| 亚洲精品AV中文字幕在线| AⅤ日本亚洲欧洲免费| 国产精品久久久久久久久免费| 久久久国产99久久国产久| 性色AV性色生活片| 2021亚洲无码| 国产精品香港三级国产AV| 日韩A无V码在线播放| 亚洲精品无码MⅤ在线观看| 国产精品嫩草影院AV| 少妇激情A∨一区二区三区| 阿娇13分钟视频无删减MP4| 欢迎来到精灵の森林1到四集| 无码高潮爽到爆的喷水视频| 综合欧美亚洲日本一区| 久久嫩草影院免费看| 亚洲精品成人无码| 国产午夜福利精品一区二区三区| 男女裸体下面进入的免费视频| 亚洲国产欧美在线综合| 好大好深好猛好爽视频免费| 欧美黑人巨大XXXX黑人猛| 张柏芝性XXXXXⅩ| 国产精品久久久久久久| 少妇精品久久久久www| 粗大的内捧猛烈进出小视频| 人与畜禽CORPORATION| 亚洲中文字幕在线无码一区二区| 放荡的熟妇高清视频| 日本肉体裸交ⅩXXXBBBB| 一女多男双修NP古言| 久久久久亚洲AV成人人电影 | 成 人 黄 色 网站 小说 免| 欧洲无人区卡一卡二 | 国内精品人妻无码久久久影院| 无套内射无矿码免费看黄| A级毛片毛片免费观看丝瓜| 娇小BBW搡BBBB搡BBBB| 亚洲产国偷v产偷v自拍浪潮AV| 国产做出在线 | 传媒麻豆| 西西人体444WWW大胆无码视频| MACBOOKPRO免费观看| 破了亲妺妺的处免费视频国产| YEEZY380蜜桃粉满天| 人人澡人人澡人人看添AV| 成年女人毛片免费视频喷潮| 邻居少妇人妻HD高清大乳在线| 中文字幕AV无码一区电影DVD| 你的棒棒可以桶桶我的下水道| 亚洲精品成人AV观看| 精品久久AⅤ人妻中文字幕| 我的娇妻QUEEN| ZOOM动物高清视频| 日韩AⅤ无码免费播放| 丰满的女房东6剧情| 污的你下面一直滴水的句子| 国产一国产二国产三国产四国产五| 撒尿特写XXXⅩ| 国产精品岛国久久久久| 亚洲AV无码乱码国产精品FC2| 国产GaySeXChina男同| 午夜私人理论电影| 精品无人区麻豆乱码无限制| 中文乱码人妻一区二区三区视频| 欧美日韩亚洲中文字幕一区二区三 | 久久精品国产99精品国产2| 新婚少妇下面真紧| 狠狠色欧美亚洲狠狠色WWW| 午夜无码乱码在线观看| 精品国产AV 无码一区二区三区| 一本一道色欲综合网中文字幕| 欧美黑人又粗又大高潮喷水| 丰满人妻无码∧V区视频 | 亚洲综合激情另类小说区| 女人大荫蒂毛茸茸视频| 放荡的闷骚娇妻H| 亚洲AV无码专区亚洲猫咪| 国产精品亚洲综合一区在线观看| 亚洲精品国产成人AV| 免费网站看SM调教打屁股视频| 超碰色偷偷男人的天堂| 亚洲AV男人的天堂在线观看| 国产色婷婷精品综合在线| 无码人妻久久一区二区三区| 久久99国产精品久久99软件| 亚洲情综合五月天| 女人高潮特级毛片| 国产爱豆剧传媒在线观看视频| 亚洲欧洲中文日韩AV乱码| 欧美人伦禁忌DVD| AV无码精品一区二区三区四区| 免费看老外操B视频| 丰满熟妇性ⅩXXOOO69| 亚洲国产精品无码久久久| 内射人妻无码色AB麻豆| 国产精品福利一区二区久久| 亚洲无人区码一码二码三码四码 | 亚洲综合无码精品一区二区三区|