欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

Vue的響應式原理(MVVM)深入解析

2019-6-6    seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1. 如何實現一個響應式對象
最近在看 Vue 的源碼,其中最核心基礎的一塊就是 Observer/Watcher/Dep, 簡而言之就是,Vue 是如何攔截數據的讀寫, 如果實現對應的監聽,并且特定的監聽執行特定的回調或者渲染邏輯的。總的可以拆成三大塊來說。這一塊,主要說的是 Vue 是如何將一個 plain object 給處理成 reactive object 的,也就是,Vue 是如何攔截攔截對象的 get/set 的

我們知道,用 Object.defineProperty 攔截數據的 get/set 是 vue 的核心邏輯之一。這里我們先考慮一個最簡單的情況 一個 plain obj 的數據,經過你的程序之后,使得這個 obj 變成 Reactive Obj (不考慮數組等因素,只考慮最簡單的基礎數據類型,和對象):

如果這個 obj 的某個 key 被 get, 則打印出 get ${key} - ${val} 的信息 
如果這個 obj 的某個 key 被 set, 如果監測到這個 key 對應的 value 發生了變化,則打印出 set ${key} - ${val} - ${newVal} 的信息。 
對應的簡要代碼如下:

Observer.js

export class Observer {
  constructor(obj) {
    this.obj = obj;
    this.transform(obj);
  }
  // 將 obj 里的所有層級的 key 都用 defineProperty 重新定義一遍, 使之 reactive 
  transform(obj) {
    const _this = this;
    for (let key in obj) {
      const value = obj[key];
      makeItReactive(obj, key, value);
    }
  }
}
function makeItReactive(obj, key, val) {
  // 如果某個 key 對應的 val 是 object, 則重新迭代該 val, 使之 reactive 
  if (isObject(val)) {
    const childObj = val;
    new Observer(childObj);
  }
  // 如果某個 key 對應的 val 不是 Object, 而是基礎類型,我們則對這個 key 進行 defineProperty 定義 
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: () => {
      console.info(`get ${key}-${val}`)
      return val;
    },
    set: (newVal) => {
      // 如果 newVal 和 val 相等,則不做任何操作(不執行渲染邏輯)
      if (newVal === val) {
        return;
      }
      // 如果 newVal 和 val 不相等,且因為 newVal 為 Object, 所以先用 Observer迭代 newVal, 使之 reactive, 再用 newVal 替換掉 val, 再執行對應操作(渲染邏輯)
      else if (isObject(newVal)) {
        console.info(`set ${key} - ${val} - ${newVal} - newVal is Object`);
        new Observer(newVal);
        val = newVal;
      }
      // 如果 newVal 和 val 不相等,且因為 newVal 為基礎類型, 所以用 newVal 替換掉 val, 再執行對應操作(渲染邏輯)
      else if (!isObject(newVal)) {
        console.info(`set ${key} - ${val} - ${newVal} - newVal is Basic Value`);
        val = newVal;
      }
    }
  })
}

function isObject(data) {
  if (typeof data === 'object' && data != 'null') {
    return true;
  }
  return false;
}

index.js

import { Observer } from './source/Observer.js';
// 聲明一個 obj,為 plain Object
const obj = {
  a: {
    aa: 1
  },
  b: 2,
}
// 將 obj 整體 reactive 化
new Observer(obj);
// 無輸出
obj.b = 2;
// set b - 2 - 3 - newVal is Basic Value
obj.b = 3;
// set b - 3 - [object Object] - newVal is Object
obj.b = {
  bb: 4
}
// get b-[object Object]
obj.b;
// get a-[object Object]
obj.a;
// get aa-1
obj.a.aa
// set aa - 1 - 3 - newVal is Basic Value
obj.a.aa = 3

這樣,我們就完成了 Vue 的第一個核心邏輯, 成功把一個任意層級的 plain object 轉化成 reactive object

2. 如何實現一個 watcher
前面講的是如何將 plain object 轉換成 reactive object. 接下來講一下,如何實現一個watcher.

實現的偽代碼應如下:

偽代碼

// 傳入 data 參數新建新建一個 vue 對象
const v = new Vue({
    data: {
        a:1,
        b:2,
    }
});
// watch data 里面某個 a 節點的變動了,如果變動,則執行 cb
v.$watch('a',function(){
    console.info('the value of a has been changed !');
});

//  watch data 里面某個 b 節點的變動了,如果變動,則執行 cb
v.$watch('b',function(){
    console.info('the value of b has been changed !');
})

Vue.js

// 引入將上面中實現的 Observer
import { Observer } from './Observer.js';
import { Watcher } from './Watcher.js';

export default class Vue {
  constructor(options) {
    // 在 this 上掛載一個公有變量 $options ,用來暫存所有參數
    this.$options = options
    // 聲明一個私有變量 _data ,用來暫存 data
    let data = this._data = this.$options.data
    // 在 this 上掛載所有 data 里的 key 值, 這些 key 值對應的 get/set 都被代理到 this._data 上對應的同名 key 值
    Object.keys(data).forEach(key => this._proxy(key));
    // 將 this._data 進行 reactive 化
    new Observer(data, this)
  }
  // 對外暴露 $watch 的公有方法,可以對某個 this._data 里的 key 值創建一個 watcher 實例
  $watch(expOrFn, cb) {
    // 注意,每一個 watcher 的實例化都依賴于 Vue 的實例化對象, 即 this
    new Watcher(this, expOrFn, cb)
  }
  //  將 this.keyName 的某個 key 值的 get/set 代理到  this._data.keyName 的具體實現
  _proxy(key) {
    var self = this
    Object.defineProperty(self, key, {
      configurable: true,
      enumerable: true,
      get: function proxyGetter() {
        return self._data[key]
      },
      set: function proxySetter(val) {
        self._data[key] = val
      }
    })
  }
}

Watch.js

// 引入Dep.js, 是什么我們待會再說
import { Dep } from './Dep.js';

export class Watcher {
  constructor(vm, expOrFn, cb) {
    this.cb = cb;
    this.vm = vm;
    this.expOrFn = expOrFn;
    // 初始化 watcher 時, vm._data[this.expOrFn] 對應的 val
    this.value = this.get();
  }
  // 用于獲取當前 vm._data 對應的 key = expOrFn 對應的 val 值
  get() {
    Dep.target = this;
    const value = this.vm._data[this.expOrFn];
    Dep.target = null;
    return value;
  }
  // 每次 vm._data 里對應的 expOrFn, 即 key 的 setter 被觸發,都會調用 watcher 里對應的 update方法
  update() {
    this.run();
  }
  run() {
    // 這個 value 是 key 被 setter 調用之后的 newVal, 然后比較 this.value 和 newVal, 如果不相等,則替換 this.value 為 newVal, 并執行傳入的cb.
    const value = this.get();
    if (value !== this.value) {
      this.value = value;
      this.cb.call(this.vm);
    }
  }
}

對于什么是 Dep, 和 Watcher 里的 update() 方法到底是在哪個時候被誰調用的,后面會說

3. 如何收集 watcher 的依賴
前面我們講了 watcher 的大致實現,以及 Vue 代理 data 到 this 上的原理。現在我們就來梳理一下,Observer/Watcher 之間的關系,來說明它們是如何調用的.

首先, 我們要來理解一下 watcher 實例的概念。實際上 Vue 的 v-model, v-bind , {{ mustache }}, computed, watcher 等等本質上是分別對 data 里的某個 key 節點聲明了一個 watcher 實例.

<input v-model="abc">
<span>{{ abc }}</span>
<p :data-key="abc"></p>
...

const v = new Vue({
    data:{
        abc: 111,
    }
    computed:{
        cbd:function(){
            return `${this.abc} after computed`;
        }
    watch:{
        abc:function(val){
            console.info(`${val} after watch`)
        }
     }  
    }
})

這里,Vue 一共聲明了 4 個 watcher 實例來監聽abc, 1個 watcher 實例來監聽 cbd. 如果 abc 的值被更改,那么 4 個 abc - watcher 的實例會執行自身對應的特定回調(比如重新渲染dom,或者是打印信息等等)

不過,Vue 是如何知道,某個 key 對應了多少個 watcher, 而 key 對應的 value 發生變化后,又是如何通知到這些 watcher 來執行對應的不同的回調的呢?

實際上更深層次的邏輯是:

在 Observer階段,會為每個 key 都創建一個 dep 實例。并且,如果該 key 被某個 watcher 實例 get, 把該 watcher 實例加入 dep 實例的隊列里。如果該 key 被 set, 則通知該 key 對應的 dep 實例, 然后 dep 實例會將依次通知隊列里的 watcher 實例, 讓它們去執行自身的回調方法

dep 實例是收集該 key 所有 watcher 實例的地方.

watcher 實例用來監聽某個 key ,如果該 key 產生變化,便會執行 watcher 實例自身的回調 


相關代碼如下:

Dep.js

export class Dep {
  constructor() {
    this.subs = [];
  }
  // 將 watcher 實例置入隊列
  addSub(sub) {
    this.subs.push(sub);
  }
  // 通知隊列里的所有 watcher 實例,告知該 key 的 對應的 val 被改變
  notify() {
    this.subs.forEach((sub, index, arr) => sub.update());
  }
}

// Dep 類的的某個靜態屬性,用于指向某個特定的 watcher 實例.
Dep.target = null
observer.js

import {Dep} from './dep'
function makeItReactive(obj, key, val) {
 var dep = new Dep()
Object.defineProperty(obj, key, {
  enumerable: true,
  configurable: true,
  get: () => {
    // 收集依賴! 如果該 key 被某個 watcher 實例依賴,則將該 watcher 實例置入該 key 對應的 dep 實例里
    if(Dep.target){
      dep.addSub(Dep.target)
    }
    return val
  },
  set: (newVal) => {
    if (newVal === val) {
      return;
    }
    else if (isObject(newVal)) {
      new Observer(newVal);
      val = newVal;
    // 通知 dep 實例, 該 key 被 set,讓 dep 實例向所有收集到的該 key 的 watcher 實例發送通知
    dep.notify()
    }
    else if (!isObject(newVal)) {
      val = newVal;
    // 通知 dep 實例, 該 key 被 set,讓 dep 實例向所有收集到的該 key 的 watcher 發送通知
    dep.notify()
    }
  }
})
     }    

watcher.js

import { Dep } from './Dep.js';

export class Watcher {
  constructor(vm, expOrFn, cb) {
    this.cb = cb;
    this.vm = vm;
    this.expOrFn = expOrFn;
    this.value = this.get();
  }
  get() {
    // 在實例化某個 watcher 的時候,會將Dep類的靜態屬性 Dep.target 指向這個 watcher 實例
    Dep.target = this;
    // 在這一步 this.vm._data[this.expOrFn] 調用了 data 里某個 key 的 getter, 然后 getter 判斷類的靜態屬性 Dep.target 不為null, 而為 watcher 的實例, 從而把這個 watcher 實例添加到 這個 key 對應的 dep 實例里。 巧妙!
    const value = this.vm._data[this.expOrFn];
    // 重置類屬性 Dep.target 
    Dep.target = null;
    return value;
  }

  // 如果 data 里的某個 key 的 setter 被調用,則 key 會通知到 該 key 對應的 dep 實例, 該Dep實例, 該 dep 實例會調用所有 依賴于該 key 的 watcher 實例的 update 方法。
  update() {
    this.run();
  }
  run() {
    const value = this.get();
    if (value !== this.value) {
    this.value = value;
    // 執行 cb 回調
    this.cb.call(this.vm);
    }
  }
}

總結:
至此, Watcher, Observer , Dep 的關系全都梳理完成。而這些也是 Vue 實現的核心邏輯之一。再來簡單總結一下三者的關系,其實是一個簡單的 觀察-訂閱 的設計模式, 簡單來說就是, 觀察者觀察數據狀態變化, 一旦數據發生變化,則會通知對應的訂閱者,讓訂閱者執行對應的業務邏輯 。我們熟知的事件機制,就是一種典型的觀察-訂閱的模式

Observer, 觀察者,用來觀察數據源變化. 
Dep, 觀察者和訂閱者是典型的 一對多 的關系,所以這里設計了一個依賴中心,來管理某個觀察者和所有這個觀察者對應的訂閱者的關系, 消息調度和依賴管理都靠它。 
Watcher, 訂閱者,當某個觀察者觀察到數據發生變化的時候,這個變化經過消息調度中心,最終會傳遞到所有該觀察者對應的訂閱者身上,然后這些訂閱者分別執行自身的業務回調即可 
參考 
Vue源碼解讀-滴滴FED 
代碼參考
藍藍設計m.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://m.ocunn.cn

存檔

99久久精品免费看国产一区二区三区 | 日韩一级片免费在线观看| 国产高潮流白浆| 欧美成人午夜精品免费| 人妻精油按摩bd高清中文字幕| 99蜜桃臀久久久欧美精品网站| 国产成人免费高清视频| 色一情一区二区三区四区 | 日本成人福利| 美女搞黄视频在线观看| 三级网站视频在在线播放| 男女视频在线观看免费| 伊人影院在线播放| 香蕉视频在线免费| 中文乱码字幕高清在线观看| 手机在线观看毛片| 欧美一区二区公司| 天天操天天干天天爽| 人妻少妇一区二区三区| 亚洲精品久久久久久动漫器材一区| 国产精品污视频| 在线亚洲欧美日韩| 国产又黄又粗又硬| 国产黄a三级三级三级| 国产不卡精品视频| 日本久久一级片| 亚洲AV第二区国产精品| 中文字幕在线观| 一级片在线免费看| 精品成人一区二区三区免费视频| 天堂av在线7| 巨骚激情综合| 色影视在线观看| 欧美videosex性欧美黑吊| 99riav视频在线观看| gogo亚洲高清大胆美女人体| 欧美爱爱视频| caoporn成人免费视频在线| 成人线上播放| 精品欧美久久| 欧美激情无毛| 亚洲欧美日韩视频二区| 美女任你摸久久| 成熟亚洲日本毛茸茸凸凹| 91网址在线看| 亚洲免费看黄网站| 色婷婷国产精品久久包臀| 欧美精品精品一区| 亚洲乱码av中文一区二区| 精品国产一区二区在线| 国内自拍欧美激情| 国产在线精品一区免费香蕉| 国产视频在线观看一区| 色播五月综合| 少妇av一区二区三区无码| 奇米视频7777| 国产又大又粗又爽的毛片| 欧美日韩国产精品一区二区三区| 中文字幕在线欧美| 欧洲精品久久一区二区| 成年人视频在线免费观看| www.youjizz.com在线| 在线免费成人| 99精品网站| 喷水一区二区三区| 久久久精品综合| 欧美日韩美女视频| 精品国产电影一区二区| 久久成人精品电影| 91美女片黄在线观| 在线成人av电影| 国产精品视频分类| 国产极品视频在线观看| 免费在线不卡av| 在线观看免费视频一区二区三区| 日韩123区| 日韩一区二区三区高清在线观看| 国产精品成人a在线观看| 奇米影视一区二区三区小说| 久久久久久夜精品精品免费| 岛国av在线不卡| 亚洲欧美国产视频| 日韩免费黄色av| 欧美大陆一区二区| 91激情视频在线| 欧美黄色高清视频| 国产精品视频久久久久久| 在线视频1区2区| 久久久久黄色| 自由日本语亚洲人高潮| 丰满白嫩尤物一区二区| 亚洲午夜国产一区99re久久| 日韩精品在线电影| 日韩69视频在线观看| 亚洲bt欧美bt精品777| 免费在线观看av| 自拍偷拍亚洲| 中文字幕一区二区三区久久网站| 国产精品一区三区| 亚洲福利电影网| 亚洲视频电影图片偷拍一区| 国产精品久久久久久久久久新婚| 亚洲精品久久区二区三区蜜桃臀| 手机在线国产视频| 69精品久久久| 头脑特工队2免费完整版在线观看| 亚洲日本天堂| 综合av在线| 久久免费偷拍视频| 欧美一级艳片视频免费观看| 91精品国产亚洲| 制服诱惑一区| 亚洲自拍偷拍一区二区| 国产美女自慰在线观看| 在线电影福利片| 国产欧美久久一区二区三区| 国产一区二区三区在线观看免费视频| 亚洲妇熟xx妇色黄| 精品国产拍在线观看| 欧美国产视频在线观看| 少妇献身老头系列| ,一级淫片a看免费| 高清在线视频不卡| 一本一本久久a久久综合精品| 99re这里都是精品| 日韩欧美黄色影院| 国产免费久久av| 国产又大又硬又粗| 国偷自拍第113页| 日韩欧美小视频| 色综合综合网| 99这里都是精品| 欧美成人a视频| 成人精品久久一区二区三区| 成人黄色一区二区| 国产精品尤物视频| 超碰高清在线| 亚洲三级网站| 欧美日韩国产中字| 国内精品伊人久久| 91.com在线| 久久久综合久久| 美女写真理伦片在线看| 国产精品二区不卡| 久久99蜜桃| 性生活三级视频| av中文字幕在线播放| 国产精品久久久久9999赢消| 中文字幕制服丝袜一区二区三区| 亚洲一区二区久久久| 欧美一进一出视频| 国产性猛交xx乱| 国产中文在线视频| av亚洲免费| 中文字幕五月欧美| 久久成人国产精品| 全黄性性激高免费视频| 日本网站在线免费观看| 91九色美女在线视频| 国产农村妇女毛片精品久久莱园子| 精品国产91久久久久久| 国产精品高清在线观看| √天堂资源在线| 丰满少妇一级片| 成人爽a毛片免费啪啪红桃视频| av影院午夜一区| 亚洲欧洲在线视频| 手机成人av在线| a v视频在线观看| 大胆人体一区二区| 黄色精品一二区| 日韩精品视频免费专区在线播放 | 中文字幕不卡三区| 欧美成人久久久| 99精品人妻少妇一区二区| www.久久网| 96视频在线观看欧美| 99热国产精品| 欧美成人精品三级在线观看| 亚洲成熟丰满熟妇高潮xxxxx| 一区二区视频网站| 精品国产鲁一鲁****| www国产成人免费观看视频 深夜成人网| 亚洲一区www| 国产肉体ⅹxxx137大胆| 久久精品国产亚洲av麻豆蜜芽| 欧美黄页免费| 久久综合一区二区| 欧美黑人极品猛少妇色xxxxx| 日韩中文字幕组| 天堂在线视频观看| 成人综合一区| 狠狠躁夜夜躁人人躁婷婷91| 91视频网页| 亚洲 欧美 变态 另类 综合| 超级碰碰不卡在线视频| 国产精品一二三四| 久久夜色精品国产亚洲aⅴ| 国产激情在线观看视频| 美女的诞生在线观看高清免费完整版中文 | 蜜桃网站在线观看| 亚洲综合精品在线| 美女少妇全过程你懂的久久| 大伊人狠狠躁夜夜躁av一区| 国产精品视频在线免费观看| 国产suv一区二区三区| 91p九色成人| 欧美国产欧美综合| 国产精品久久久久久久一区探花| 精品无码在线视频| 日韩伦理av| 成人黄色小视频在线观看| 欧美疯狂性受xxxxx另类| 超碰在线超碰在线| 91精品专区| 另类调教123区| 色999日韩欧美国产| 自拍偷拍21p| jyzzz在线观看视频| 精品在线你懂的| 欧美日韩成人网| 中文字幕一区三区久久女搜查官| 五月天婷婷在线视频| 国产精品自拍av| 97精品国产91久久久久久| 五十路六十路七十路熟婆| ririsao久久精品一区| av中文字幕一区| 日韩美女在线观看一区| 一本一本久久a久久| 黄色成人在线观看网站| 亚洲另类在线视频| 精品国产一区二区三区免费 | 视频一区在线免费看| 中文一区在线播放| 亚洲精品免费av| 麻豆久久久久久久久久| 亚洲欧洲美洲国产香蕉| 欧美人伦禁忌dvd放荡欲情| 99re6这里有精品热视频| 亚欧在线观看视频| 天天操天天操天天干| 999视频精品| 欧美mv日韩mv国产网站| 欧美一区二区三区爽大粗免费| 首播影院在线观看免费观看电视| 久久精品女人| 日韩视频中文字幕| 五十路六十路七十路熟婆| 麻豆视频在线观看免费网站黄| 国产欧美日韩激情| 成人av免费看| 影音先锋黄色网址| 欧美日韩亚洲一区三区| 亚洲人成77777在线观看网| 午夜福利123| 爱草tv视频在线观看992| 亚洲视频1区2区| 欧美日韩成人一区二区三区 | 欧美13videosex性极品| 亚洲色图在线播放| 日韩.欧美.亚洲| 少妇人妻精品一区二区三区| 日本欧美一区二区三区乱码| 高清欧美性猛交| 麻豆一区产品精品蜜桃的特点| 亚洲第一福利专区| 日韩成人xxxx| 欧产日产国产精品98| 少妇精品视频在线观看| 欧美色图第一页| 国产理论在线播放| 91老司机福利在线| 亚洲国产另类精品专区| bt天堂新版中文在线地址| 成年在线电影| 中文字幕在线不卡视频| 亚洲国产日韩综合一区| 美国成人毛片| 国产日韩欧美a| 亚洲精品日韩成人| 国产在线色视频| 欧美国产日产图区| 亚洲精品二区| 国产视频精品久久| 欧美极品aⅴ影院| 亚洲人久久久| 成人av一区| 亚洲同性同志一二三专区| 香蕉视频在线网址| 视频一区二区三区不卡| 亚洲精品欧美综合四区| www.在线观看av| 高清电影在线免费观看| 亚洲午夜免费视频| 久久久久久久久久久久久国产精品 | 久久久久久久久久久福利| 黄网av在线| 欧美午夜片欧美片在线观看| 亚洲性生活网站| 日本综合视频| 欧美一区二区三区免费视频| 日本一区二区免费视频| 给我免费播放日韩视频| 国产亚洲激情视频在线| 日韩欧美综合视频| 欧美精品日本| 国产国产精品人在线视| 国产人妖一区二区| 国产精品一二三| 欧美一区二视频在线免费观看| 精品电影在线| 亚洲一区二区三区四区中文字幕| 成人一级片网站| 国产精品久久久久久妇女| 精品久久久久久最新网址| 妖精视频在线观看免费| 中国精品18videos性欧美| 日本精品性网站在线观看| 国产三级视频在线播放| 成人精品免费网站| 欧美亚洲视频一区| 捆绑调教日本一区二区三区| 欧美日韩一区二区三区四区| 国产精品伦子伦| 成人午夜国产| 国产不卡av在线| 狠狠躁日日躁夜夜躁av| 国产欧美一区二区精品忘忧草| 国产av熟女一区二区三区| 26uuu亚洲电影| 亚洲国产精品系列| 国产性一乱一性一伧一色| 久久在线精品| 欧美精品一区二区三区在线四季| 日本在线免费| 欧美午夜一区二区| 丰满少妇一区二区| 激情六月综合| 国产精品theporn88| 黄色的网站在线观看| 欧美人牲a欧美精品| 男人在线观看视频| 狂野欧美一区| 天天综合色天天综合色hd| 9999精品成人免费毛片在线看| 精品动漫一区二区三区在线观看| 欧美精品入口蜜桃| 国内精品免费在线观看| 三年中文高清在线观看第6集| 精品免费av在线 | 999精品在线视频| 久久精品一本| 天堂一区二区三区| 成人福利av| 在线亚洲欧美视频| 国产又大又黄又爽| 国产精品免费免费| 亚洲成人手机在线观看| 色狮一区二区三区四区视频| 亚洲永久免费观看| 手机在线免费av| 日韩成人av在线| 在线观看国产黄| 国产精品久久久久久久蜜臀| 思思久久精品视频| 在线观看日韩| 麻豆成人在线播放| 国模一区二区| 欧美成人午夜剧场免费观看| 天天综合天天色| 欧美性猛交xxxx偷拍洗澡| 毛片久久久久久| 狠狠色丁香久久婷婷综合丁香| 欧美做暖暖视频| 久久久久观看| 国产欧美一区二区| 欧美韩日亚洲| 亚洲午夜激情免费视频| 国产成人av免费看| 亚洲电影一区二区| 999精品在线视频| 国产**成人网毛片九色 | 丰满人妻一区二区三区免费视频棣| 欧美三级网页| 亚洲一卡二卡| a看欧美黄色女同性恋| 国产精品亚洲精品| av3级在线| 久久精品电影网| 在线影视一区| 91精品国产综合久久福利软件 | 久久先锋资源| 2018国产在线| 欧美xxxx中国| 午夜一区二区三视频在线观看| 日韩av综合| 97久久天天综合色天天综合色hd | 日本免费一级视频| 五月婷婷六月综合|