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

Vue 3 的 setup 語(yǔ)法糖到底是什么東西?

開(kāi)發(fā) 前端
setup?語(yǔ)法糖經(jīng)過(guò)編譯后就變成了setup?函數(shù),而setup?函數(shù)的返回值是一個(gè)對(duì)象,這個(gè)對(duì)象就是由在setup?頂層定義的變量和import?導(dǎo)入組成的。vue?在初始化的時(shí)候會(huì)執(zhí)行setup?函數(shù),然后將setup?函數(shù)返回值塞到vue?實(shí)例的setupState?屬性上。

前言

我們每天寫(xiě)vue3項(xiàng)目的時(shí)候都會(huì)使用setup語(yǔ)法糖,但是你有沒(méi)有思考過(guò)下面幾個(gè)問(wèn)題。setup語(yǔ)法糖經(jīng)過(guò)編譯后是什么樣子的?為什么在setup頂層定義的變量可以在template中可以直接使用?為什么import一個(gè)組件后就可以直接使用,無(wú)需使用components 選項(xiàng)來(lái)顯式注冊(cè)組件?

vue 文件如何渲染到瀏覽器上

要回答上面的問(wèn)題,我們先來(lái)了解一下從一個(gè)vue文件到渲染到瀏覽器這一過(guò)程經(jīng)歷了什么?

我們的vue代碼一般都是寫(xiě)在后綴名為vue的文件上,顯然瀏覽器是不認(rèn)識(shí)vue文件的,瀏覽器只認(rèn)識(shí)html、css、jss等文件。所以第一步就是通過(guò)webpack或者vite將一個(gè)vue文件編譯為一個(gè)包含render函數(shù)的js文件。然后執(zhí)行render函數(shù)生成虛擬DOM,再調(diào)用瀏覽器的DOM API根據(jù)虛擬DOM生成真實(shí)DOM掛載到瀏覽器上。

圖片圖片

setup編譯后的樣子

在javascript標(biāo)準(zhǔn)中script標(biāo)簽是不支持setup屬性的,瀏覽器根本就不認(rèn)識(shí)setup屬性。所以很明顯setup是作用于編譯時(shí)階段,也就是從vue文件編譯為js文件這一過(guò)程。

我們來(lái)看一個(gè)簡(jiǎn)單的demo,這個(gè)是index.vue源代碼:

<template>
  <h1>{{ title }}</h1>
  <h1>{{ msg }}</h1>
  <Child />
</template>

<script lang="ts" setup>
import { ref } from "vue";
import Child from "./child.vue";

const msg = ref("Hello World!");
const title = "title";
if (msg.value) {
  const content = "content";
  console.log(content);
}
</script>

這里我們定義了一個(gè)名為msg的ref響應(yīng)式變量和非響應(yīng)式的title變量,還有import了child.vue組件。

這個(gè)是child.vue的源代碼

<template>
  <div>i am child</div>
</template>

我們接下來(lái)看index.vue編譯后的樣子,代碼我已經(jīng)做過(guò)了簡(jiǎn)化:

import { ref } from "vue";
import Child from "./Child.vue";

const title = "title";

const __sfc__ = {
  __name: "index",
  setup() {
    const msg = ref("Hello World!");
    if (msg.value) {
      const content = "content";
      console.log(content);
    }
    const __returned__ = { title, msg, Child };
    return __returned__;
  },
};

import {
  toDisplayString as _toDisplayString,
  createElementVNode as _createElementVNode,
  createVNode as _createVNode,
  Fragment as _Fragment,
  openBlock as _openBlock,
  createElementBlock as _createElementBlock,
} from "vue";
function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (
    _openBlock(),
    _createElementBlock(
      _Fragment,
      null,
      [
        _createElementVNode("h1", null, _toDisplayString($setup.title)),
        _createElementVNode(
          "h1",
          null,
          _toDisplayString($setup.msg),
          1 /* TEXT */
        ),
        _createVNode($setup["Child"]),
      ],
      64 /* STABLE_FRAGMENT */
    )
  );
}
__sfc__.render = render;
export default __sfc__;

我們可以看到index.vue編譯后的代碼中已經(jīng)沒(méi)有了template標(biāo)簽和script標(biāo)簽,取而代之是render函數(shù)和__sfc__對(duì)象。并且使用__sfc__.render = render將render函數(shù)掛到__sfc__對(duì)象上,然后將__sfc__對(duì)象export default出去。

看到這里你應(yīng)該知道了其實(shí)一個(gè)vue組件就是一個(gè)普通的js對(duì)象,import一個(gè)vue組件,實(shí)際就是import這個(gè)js對(duì)象。這個(gè)js對(duì)象中包含render方法和setup方法。

編譯后的setup方法

我們先來(lái)看看這個(gè)setup方法,是不是覺(jué)得和我們?cè)创a中的setup語(yǔ)法糖中的代碼很相似?沒(méi)錯(cuò),這個(gè)setup方法內(nèi)的代碼就是由setup語(yǔ)法糖中的代碼編譯后來(lái)的。

setup語(yǔ)法糖原始代碼

<script lang="ts" setup>
import { ref } from "vue";
import Child from "./child.vue";

const msg = ref("Hello World!");
const title = "title";
if (msg.value) {
  const content = "content";
  console.log(content);
}
</script>

setup編譯后的代碼

import { ref } from "vue";
import Child from "./Child.vue";

const title = "title";

const __sfc__ = {
  __name: "index",
  setup() {
    const msg = ref("Hello World!");
    if (msg.value) {
      const content = "content";
      console.log(content);
    }
    const __returned__ = { title, msg, Child };
    return __returned__;
  },
};

經(jīng)過(guò)分析我們發(fā)現(xiàn)title變量由于不是響應(yīng)式變量,所以編譯后title變量被提到了js文件的全局變量上面去了。而msg變量是響應(yīng)式變量,所以依然還是在setup方法中。我們?cè)賮?lái)看看setup的返回值,返回值是一個(gè)對(duì)象,對(duì)象中包含title、msg、Child屬性,非setup頂層中定義的content變量就不在返回值對(duì)象中。

看到這里,可以回答我們前面提的第一個(gè)問(wèn)題。

setup語(yǔ)法糖經(jīng)過(guò)編譯后是什么樣子的?

setup語(yǔ)法糖編譯后會(huì)變成一個(gè)setup方法,編譯后setup方法中的代碼和script標(biāo)簽中的源代碼很相似。方法會(huì)返回一個(gè)對(duì)象,對(duì)象由setup中定義的頂層變量和import導(dǎo)入的內(nèi)容組成。

由template編譯后的render函數(shù)

我們先來(lái)看看原本template中的代碼:

<template>
  <h1>{{ title }}</h1>
  <h1>{{ msg }}</h1>
  <Child />
</template>

我們?cè)賮?lái)看看由template編譯成的render函數(shù):

import {
  toDisplayString as _toDisplayString,
  createElementVNode as _createElementVNode,
  createVNode as _createVNode,
  Fragment as _Fragment,
  openBlock as _openBlock,
  createElementBlock as _createElementBlock,
} from "vue";
function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (
    _openBlock(),
    _createElementBlock(
      _Fragment,
      null,
      [
        _createElementVNode("h1", null, _toDisplayString($setup.title)),
        _createElementVNode(
          "h1",
          null,
          _toDisplayString($setup.msg),
          1 /* TEXT */
        ),
        _createVNode($setup["Child"]),
      ],
      64 /* STABLE_FRAGMENT */
    )
  );
}

我們這次主要看在render函數(shù)中如何訪問(wèn)setup中定義的頂層變量title、msg,createElementBlock和createElementVNode等創(chuàng)建虛擬DOM的函數(shù)不在這篇文章的討論范圍內(nèi)。你只需要知道createElementVNode("h1", null, _toDisplayString($setup.title))為創(chuàng)建一個(gè)h1標(biāo)簽的虛擬DOM就行了。

在render函數(shù)中我們發(fā)現(xiàn)讀取title變量的值是通過(guò)$setup.title讀取到的,讀取msg變量的值是通過(guò)$setup.msg讀取到的。這個(gè)$setup對(duì)象就是調(diào)用render函數(shù)時(shí)傳入的第四個(gè)變量,我想你應(yīng)該猜出來(lái)了,這個(gè)$setup對(duì)象就是我們前面的setup方法返回的對(duì)象。

那么問(wèn)題來(lái)了,在執(zhí)行render函數(shù)的時(shí)候是如何將setup方法的返回值作為第四個(gè)變量傳遞給render函數(shù)的呢?我在下一節(jié)會(huì)一步一步的帶你通過(guò)debug源碼的方式去搞清楚這個(gè)問(wèn)題,我們帶著問(wèn)題去debug源碼其實(shí)非常簡(jiǎn)單。

debug源碼搞清楚是如何調(diào)用render函數(shù)

有的小伙伴看到這里需要看源碼就覺(jué)得頭大了,別著急,其實(shí)很簡(jiǎn)單,我會(huì)一步一步的帶著你去debug源碼。

首先我們將Enable JavaScript source maps給取消勾選了,不然在debug源碼的時(shí)候斷點(diǎn)就會(huì)走到vue文件中,而不是走到編譯會(huì)的js文件中。

圖片圖片

然后我們需要在設(shè)置里面的Ignore List看看node_modules文件夾是否被忽略。新版谷歌瀏覽器中會(huì)默認(rèn)排除掉node_modules文件夾,所以我們需要將這個(gè)取消勾選。如果忽略了node_modules文件夾,那么debug的時(shí)候斷點(diǎn)就不會(huì)走到node_modules中vue的源碼中去了。

圖片圖片

接下來(lái)我們需要在瀏覽器中找到vue文件編譯后的js代碼,我們只需要在network面板中找到這個(gè)vue文件的http請(qǐng)求,然后在Response下右鍵選擇Open in Sources panel,就會(huì)自動(dòng)在sources面板自動(dòng)打開(kāi)對(duì)應(yīng)編譯后的js文件代碼。

圖片圖片

找到編譯后的js文件,我們想debug看看是如何調(diào)用render函數(shù)的,所以我們給render函數(shù)加一個(gè)斷點(diǎn)。然后刷新頁(yè)面,發(fā)現(xiàn)代碼已經(jīng)走到了斷點(diǎn)的地方。我們?cè)賮?lái)看看右邊的Call Stack調(diào)用棧,發(fā)現(xiàn)render函數(shù)是由一個(gè)vue源碼中的renderComponentRoot函數(shù)調(diào)用的。

圖片圖片

點(diǎn)擊Call Stack中的renderComponentRoot函數(shù)就可以跳轉(zhuǎn)到renderComponentRoot函數(shù)的源碼,我們發(fā)現(xiàn)renderComponentRoot函數(shù)中調(diào)用render函數(shù)的代碼主要是下面這樣的:

function renderComponentRoot(instance) {
  const {
    props,
    data,
    setupState,
    // 省略...
  } = instance;

  render2.call(
    thisProxy,
    proxyToUse,
    renderCache,
    props,
    setupState,
    data,
    ctx
  )
}

這里我們可以看到前面的$setup實(shí)際就是由setupState賦值的,而setupState是當(dāng)前vue實(shí)例上面的一個(gè)屬性。那么setupState屬性是如何被賦值到vue實(shí)例上面的呢?

我們需要給setup函數(shù)加一個(gè)斷點(diǎn),然后刷新頁(yè)面進(jìn)入斷點(diǎn)。通過(guò)分析Call Stack調(diào)用棧,我們發(fā)現(xiàn)setup函數(shù)是由vue中的一個(gè)setupStatefulComponent函數(shù)調(diào)用執(zhí)行的。

圖片圖片

點(diǎn)擊Call Stack調(diào)用棧中的setupStatefulComponent,進(jìn)入到setupStatefulComponent的源碼。我們看到setupStatefulComponent中的代碼主要是這樣的:

function setupStatefulComponent(instance) {
  const { setup } = Component;
  // 省略
  const setupResult = callWithErrorHandling(
    setup,
    instance
  );
  handleSetupResult(instance, setupResult);
}

setup函數(shù)是Component上面的一個(gè)屬性,我們將鼠標(biāo)放到Component上面,看看這個(gè)Component是什么東西?

圖片圖片

看到這個(gè)Component對(duì)象中既有render方法也有setup方法是不是感覺(jué)很熟悉,沒(méi)錯(cuò)這個(gè)Component對(duì)象實(shí)際就是我們的vue文件編譯后的js對(duì)象。

const __sfc__ = {
  __name: "index",
  setup() {
    const msg = ref("Hello World!");
    if (msg.value) {
      const content = "content";
      console.log(content);
    }
    const __returned__ = { title, msg, Child };
    return __returned__;
  },
};

__sfc__.render = render;

從Component對(duì)象中拿到setup函數(shù),然后執(zhí)行setup函數(shù)得到setupResult對(duì)象。然后再調(diào)用handleSetupResult(instance, setupResult);

我們?cè)賮?lái)看看handleSetupResult函數(shù)是什么樣的,下面是我簡(jiǎn)化后的代碼:

function handleSetupResult(instance, setupResult) {
  if (isFunction(setupResult)) {
    // 省略
  } else if (isObject(setupResult)) {
    instance.setupState = proxyRefs(setupResult);
  }
}

我們的setup的返回值是一個(gè)對(duì)象,所以這里會(huì)執(zhí)行instance.setupState = proxyRefs(setupResult),將setup執(zhí)行會(huì)的返回值賦值到vue實(shí)例的setupState屬性上。

看到這里我們整個(gè)流程已經(jīng)可以串起來(lái)了,首先會(huì)執(zhí)行由setup語(yǔ)法糖編譯后的setup函數(shù)。然后將setup函數(shù)中由頂層變量和import導(dǎo)入組成的返回值對(duì)象賦值給vue實(shí)例的setupState屬性,然后執(zhí)行render函數(shù)的時(shí)候從vue實(shí)例中取出setupState屬性也就是setup的返回值。這樣在render函數(shù)也就是template模版就可以訪問(wèn)到setup中的頂層變量和import導(dǎo)入。

現(xiàn)在我們可以回答前面提的另外兩個(gè)問(wèn)題了:

為什么在setup頂層定義的變量可以在template中可以直接使用?

因?yàn)樵趕etup語(yǔ)法糖頂層定義的變量經(jīng)過(guò)編譯后會(huì)被加入到setup函數(shù)返回值對(duì)象__returned__中,而非setup頂層定義的變量不會(huì)加入到__returned__對(duì)象中。setup函數(shù)返回值會(huì)被塞到vue實(shí)例的setupState屬性上,執(zhí)行render函數(shù)的時(shí)候會(huì)將vue實(shí)例上的setupState屬性傳遞給render函數(shù),所以在render函數(shù)中就可以訪問(wèn)到setup頂層定義的變量和import導(dǎo)入。而render函數(shù)實(shí)際就是由template編譯得來(lái)的,所以說(shuō)在template中可以訪問(wèn)到setup頂層定義的變量和import導(dǎo)入。。

為什么import一個(gè)組件后就可以直接使用,無(wú)需使用components 選項(xiàng)來(lái)顯式注冊(cè)組件?

因?yàn)樵趕etup語(yǔ)法糖中import導(dǎo)入的組件對(duì)象經(jīng)過(guò)編譯后同樣也會(huì)被加入到setup函數(shù)返回值對(duì)象__returned__中,同理在template中也可以訪問(wèn)到setup的返回值對(duì)象,也就可以直接使用這個(gè)導(dǎo)入的組件了。

總結(jié)

setup語(yǔ)法糖經(jīng)過(guò)編譯后就變成了setup函數(shù),而setup函數(shù)的返回值是一個(gè)對(duì)象,這個(gè)對(duì)象就是由在setup頂層定義的變量和import導(dǎo)入組成的。vue在初始化的時(shí)候會(huì)執(zhí)行setup函數(shù),然后將setup函數(shù)返回值塞到vue實(shí)例的setupState屬性上。執(zhí)行render函數(shù)的時(shí)候會(huì)將vue實(shí)例上的setupState屬性(也就是setup函數(shù)的返回值)傳遞給render函數(shù),所以在render函數(shù)中就可以訪問(wèn)到setup頂層定義的變量和import導(dǎo)入。而render函數(shù)實(shí)際就是由template編譯得來(lái)的,所以說(shuō)在template中就可以訪問(wèn)到setup頂層定義的變量和import導(dǎo)入。

責(zé)任編輯:武曉燕 來(lái)源: 前端歐陽(yáng)
相關(guān)推薦

2021-08-13 10:16:49

等保合規(guī)網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-08-22 09:25:47

分布式系統(tǒng)單塊系統(tǒng)

2021-01-08 09:48:18

Pythonname變量

2021-04-26 11:30:16

區(qū)塊鏈區(qū)塊鏈技術(shù)

2011-12-28 09:53:18

HTML 5

2023-04-27 11:07:24

Setup語(yǔ)法糖Vue3

2009-07-08 18:07:58

jvm jre

2022-08-04 14:38:49

vue3.2setup代碼

2020-03-05 10:28:19

MySQLMRR磁盤(pán)讀

2022-10-08 00:00:00

Spring數(shù)據(jù)庫(kù)項(xiàng)目

2022-07-13 10:07:31

vue3組件監(jiān)聽(tīng)器

2020-09-27 06:53:57

MavenCDNwrapper

2020-10-14 06:22:14

UWB技術(shù)感知

2020-09-22 08:22:28

快充

2010-11-01 01:25:36

Windows NT

2011-04-27 09:30:48

企業(yè)架構(gòu)

2022-05-20 14:08:13

Web3元宇宙區(qū)塊鏈

2023-10-11 08:29:54

volatileJava原子性

2021-12-15 08:23:42

Vue3 插件Vue應(yīng)用

2009-06-09 22:11:44

JavaScriptObject
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲mv在线看| 欧美日韩视频第一区| 91偷拍精品一区二区三区| 国产亚洲成人精品| 亚洲资源网你懂的| 欧美日韩成人综合在线一区二区| 一区二区三区一级片| 免费av网站观看| 日韩国产欧美三级| 欧美日韩国产999| 国产精品毛片一区二区| 国产精品**亚洲精品| 黑人巨大精品欧美一区二区一视频| 日韩av电影在线观看| 国产av无码专区亚洲av| 久久蜜桃精品| 欧美激情成人在线视频| 美女100%露胸无遮挡| 给我免费播放日韩视频| 精品视频一区二区三区免费| 国产午夜福利100集发布| 日韩伦理在线电影| 久久久国产午夜精品| 成人av男人的天堂| 中文字幕在线日亚洲9| 一道本一区二区| 美乳少妇欧美精品| 99在线视频免费| 久久精品色播| 欧美一级在线免费| 第四色婷婷基地| 成人女同在线观看| 亚洲人123区| 亚洲欧洲日韩精品| 青青操视频在线| 国产ts人妖一区二区| 成人亚洲激情网| 天天爱天天做天天爽| 99热在线精品观看| 欧美极品少妇与黑人| 中国毛片直接看| 国产高清欧美| 中文字幕日韩专区| 五月天综合视频| 欧美人与拘性视交免费看| 日韩禁在线播放| 欧产日产国产精品98| 97超碰成人| 精品裸体舞一区二区三区| 成人免费播放视频| 日韩免费成人| 日韩一区二区免费高清| aaaaaaaa毛片| 日韩区欧美区| 日韩欧美你懂的| 亚洲成年人av| 国偷自产视频一区二区久| 精品日韩在线一区| 亚洲麻豆一区二区三区| 黄色美女久久久| 日韩久久免费视频| 色噜噜日韩精品欧美一区二区| 加勒比视频一区| 日韩av在线最新| 中文字幕一区二区人妻在线不卡| 亚洲精品国产setv| 这里只有精品在线播放| av在线免费播放网址| 国产精品传媒精东影业在线| 精品国产一区av| 五月天丁香激情| 影音先锋中文字幕一区| 欧美一级黄色网| 波多野结衣黄色网址| 久久国内精品视频| 999视频在线观看| 熟妇人妻av无码一区二区三区| av日韩在线网站| 日本午夜精品一区二区| 欧美被日视频| 亚洲国产日韩av| 久久久免费视频网站| av高清一区| 91精品国产高清一区二区三区蜜臀| 在线观看一区二区三区视频| 琪琪久久久久日韩精品| 在线视频精品一| 欧美丰满艳妇bbwbbw| 99精品欧美| 国产精品视频精品视频| 亚洲黄色在线播放| www日韩大片| 日韩视频在线观看视频| 免费在线小视频| 欧美另类z0zxhd电影| 国产伦精品一区二区免费| 成人高清av| 久久久久久999| 中国女人真人一级毛片| 国产成人av一区二区| 精品午夜一区二区| 免费网站免费进入在线| 狠狠色狠狠色综合日日小说| 国产aⅴ爽av久久久久| 精品伊人久久久| www.日韩不卡电影av| 亚洲第一在线播放| 国产老女人精品毛片久久| 你懂的视频在线一区二区| av网址在线| 欧美无乱码久久久免费午夜一区| 亚洲美女精品视频| 91亚洲国产成人久久精品| 午夜精品一区二区三区视频免费看| 中文字幕a级片| 91啪九色porn原创视频在线观看| 操bbb操bbb| 国产69精品久久久久按摩| 亚洲精品mp4| 1024手机在线视频| 久久精品国内一区二区三区| 欧美国产二区| ****av在线网毛片| 欧美一区二区福利视频| 极品尤物一区二区| 日韩精品亚洲一区| 久久久久久九九九九| 免费电影网站在线视频观看福利| 欧美日韩久久久| 黄免费在线观看| 午夜亚洲性色视频| 精品久久久久久综合日本| 青春草视频在线观看| 337p亚洲精品色噜噜噜| 欧美乱大交做爰xxxⅹ小说| 久久aⅴ国产紧身牛仔裤| 国产日韩欧美一区二区| 欧美人动性xxxxz0oz| 日韩午夜av一区| 国产黄色小视频网站| 精品中文av资源站在线观看| 日韩欧美一区二区在线观看| 吞精囗交69激情欧美| 精品视频久久久久久| 国产精品久久久久久久妇| 成人毛片老司机大片| 免费看毛片的网址| 久久中文资源| 555www成人网| 亚洲 小说区 图片区 都市| 午夜精品福利一区二区蜜股av | 久久精品男女| 国内精品视频在线播放| 九色porny丨国产首页在线| 亚洲成人av在线| 亚洲精品一区二区三区av| 悠悠资源网亚洲青| 亚洲欧美日韩中文在线制服| 少妇久久久久久久| 中文字幕av一区二区三区| 成人免费在线观看视频网站| 俺要去色综合狠狠| 成人黄色免费看| 手机在线免费av| 亚洲福利影片在线| 少妇太紧太爽又黄又硬又爽| 国产亚洲成aⅴ人片在线观看| 国产 porn| 亚洲精品电影| 国产在线精品一区二区三区》| 国产在线天堂www网在线观看| 亚洲精品日韩久久久| 成人黄色三级视频| 亚洲欧洲中文日韩久久av乱码| 日本wwww色| 久久久亚洲人| 好色先生视频污| 日韩精品免费一区二区夜夜嗨 | 男人午夜免费视频| 国产欧美久久久精品影院 | www.日本不卡| 午夜激情福利在线| 欧美精品综合| 欧美日韩国产一二| 97精品资源在线观看| 国内精品国产三级国产在线专| 黄色片视频在线观看| 717成人午夜免费福利电影| 日本一区二区欧美| 中文字幕乱码日本亚洲一区二区| 波多野结衣电影免费观看| 午夜亚洲性色福利视频| 特色特色大片在线| 亚洲精品无吗| 99电影在线观看| 日韩美女在线看免费观看| 久久91精品国产| 成人精品一区二区三区校园激情| 欧美一区二区三区四区久久| 日本免费在线观看视频| 亚洲精品免费视频| 在线视频第一页| av在线一区二区| 依人在线免费视频| 久久国产福利| 99久久久精品视频| 欧美一二区在线观看| 国产99视频精品免费视频36| av在线播放一区| 性色av一区二区三区| 久cao在线| 亚洲美腿欧美激情另类| 精品久久久中文字幕人妻| 在线国产电影不卡| 久久露脸国语精品国产91| 亚洲靠逼com| 亚洲激情图片网| 2020日本不卡一区二区视频| 91亚洲一线产区二线产区| 久久66热偷产精品| 男女啪啪网站视频| 午夜在线一区二区| 欧美成人精品免费| 欧美日韩亚洲一区三区 | 国产91在线视频蝌蚪| 一区二区三区国产在线观看| 午夜在线视频免费| 精品久久久久一区二区国产| 国产露脸国语对白在线| 欧美日韩一区二区三区四区| 波多野结衣绝顶大高潮| 色婷婷精品大在线视频| 中文字幕超碰在线| 欧美日韩激情小视频| 日韩精品久久久久久久酒店| 亚洲无人区一区| 国产精品变态另类虐交| 亚洲一区二区综合| 国产亚洲成人av| 亚洲成年人影院| 免费观看一区二区三区毛片 | 亚洲毛片一区二区三区| 色综合欧美在线| 亚洲视频 欧美视频| 色老汉一区二区三区| 亚洲 欧美 中文字幕| 欧美性感美女h网站在线观看免费| 天海翼一区二区| 精品国产鲁一鲁一区二区张丽| 不卡的免费av| 五月开心婷婷久久| 天天做天天爱夜夜爽| 大伊人狠狠躁夜夜躁av一区 | 91精品国产综合久久久久久久久久| 在线观看毛片视频| 在线不卡中文字幕| 精品人妻一区二区三区四区不卡| 日韩午夜在线观看| 刘玥91精选国产在线观看| 亚洲高清不卡av| 天堂a中文在线| 国产一区二区av| 欧美成人xxx| 欧美精品xxx| 美女露胸视频在线观看| 国产精品国内视频| 99热这里有精品| 高清国语自产拍免费一区二区三区| 成人精品毛片| 欧美一区国产一区| 日韩电影在线视频| 人妻激情另类乱人伦人妻| 亚洲人www| 污版视频在线观看| 国产999精品久久久久久绿帽| 久久久老熟女一区二区三区91| 久久青草国产手机看片福利盒子| 国产一区二区三区四区在线| 亚洲精品免费看| 日韩精品1区2区| 欧美色图第一页| 亚洲国产精品久久人人爱潘金莲| 日韩电影中文 亚洲精品乱码| 91在线视频免费看| 色综合五月天导航| 欧亚一区二区| 超碰97国产在线| 欧美综合在线视频观看| 日本成人在线不卡| 久久精品日产第一区二区 | 国产一精品一av一免费爽爽| 国产精品国产三级欧美二区| 欧洲专线二区三区| 成人av在线播放观看| 日韩成人免费电影| 男人女人拔萝卜视频| 26uuu欧美| 麻豆亚洲av熟女国产一区二 | 午夜精品一区二区三区在线| 成人日韩av| 九九九九精品九九九九| 亚洲蜜桃视频| 国产精品无码av无码| 国产成人精品影院| 呻吟揉丰满对白91乃国产区| 香港成人在线视频| 99久久精品国产成人一区二区| 亚洲欧美日韩中文在线制服| 日本片在线看| 国产中文字幕亚洲| 精品国产一级毛片| 日韩欧美视频网站| 国产99久久久国产精品潘金| 国产福利在线导航| 在线视频中文字幕一区二区| 天堂在线中文网| 久久国产精品久久国产精品| 懂色aⅴ精品一区二区三区| 精品国产一区二区三区日日嗨| 国产精品91一区二区三区| 欧美日韩大尺度| 91网上在线视频| 91精品国产高潮对白| 日韩欧美一级二级三级| 免费黄色电影在线观看| 国产精品久久久久9999| 蜜桃一区二区三区| 亚洲欧洲日产国码无码久久99| 国产91丝袜在线18| 校园春色 亚洲| 91精品一区二区三区久久久久久| 黄色毛片在线看| 日本中文字幕成人| 亚洲永久精品唐人导航网址| 青娱乐自拍偷拍| 成人18精品视频| 日韩三级av在线| 亚洲国产欧美一区二区丝袜黑人 | 日本道精品一区二区三区| 偷拍自拍在线| 欧美一级片在线播放| 丝袜久久网站| 97国产在线播放| 久久久精品蜜桃| 91视频在线视频| 伊人伊成久久人综合网小说| 欧美精选视频一区二区| 亚洲精品第一区二区三区| 久久精品国产一区二区三| 91麻豆精品久久毛片一级| 欧美日产国产精品| 超碰免费在线播放| 国产精品视频入口| 99精品视频免费全部在线| 女~淫辱の触手3d动漫| 在线精品视频小说1| 欧洲不卡av| 91免费观看| 日韩午夜一区| www.av欧美| 欧美日韩电影一区| 91麻豆国产福利在线观看宅福利| 91九色极品视频| 亚洲国产影院| av女人的天堂| 欧美乱妇20p| 99在线视频影院| 欧美日韩精品免费看 | 国产a√精品区二区三区四区| 亚洲国产精品麻豆| 黄色av网站在线| 91色视频在线导航| 中文在线不卡| 女人十八毛片嫩草av| 欧美一级精品大片| 蜜桃视频m3u8在线观看| 亚洲三区在线观看| 国产suv精品一区二区6| 福利网址在线观看| 欧美成人免费大片| 免费国产自久久久久三四区久久| 日韩av片网站| 亚洲午夜精品17c| 国产毛片在线看| 99久久精品免费看国产四区| 久久久人人人| 永久免费看黄网站| 亚洲欧洲在线看| 日韩在线亚洲| 91激情视频在线| 亚洲综合色婷婷| 北条麻妃在线| 国产一级精品aaaaa看| 日本成人在线电影网| 精品无码人妻一区二区三区| 国产亚洲欧美日韩美女| 成午夜精品一区二区三区软件| 杨幂毛片午夜性生毛片| 亚洲成国产人片在线观看| 麻豆系列在线观看|