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

10分鐘讓你快速上手Vue3

開發 前端
經過了漫長地迭代,Vue 3.0 終于在上 2020-09-18 發布了,帶了翻天覆地的變化,使用了 Typescript 進行了大規模的重構,帶來了 Composition API RFC 版本,類似 React Hook 一樣的寫 Vue,可以自定義自己的 hook ,讓使用者更加的靈活,接下來總結一下 vue 3.0 帶來的部分新特性。

經過了漫長地迭代,Vue 3.0 終于在上 2020-09-18 發布了,帶了翻天覆地的變化,使用了 Typescript 進行了大規模的重構,帶來了 Composition API RFC 版本,類似 React Hook 一樣的寫 Vue,可以自定義自己的 hook ,讓使用者更加的靈活,接下來總結一下 vue 3.0 帶來的部分新特性。

  1. setup()
  2. ref()
  3. reactive()
  4. isRef()
  5. toRefs()
  6. computed()
  7. watch()
  8. LifeCycle Hooks(新的生命周期)
  9. Template refs
  10. globalProperties
  11. Suspense

Vue2 與 Vue3 的對比

  • 對 TypeScript 支持不友好(所有屬性都放在了 this 對象上,難以推倒組件的數據類型)
  • 大量的 API 掛載在 Vue 對象的原型上,難以實現 TreeShaking。
  • 架構層面對跨平臺 dom 渲染開發支持不友好
  • CompositionAPI。愛 ReactHook 啟發
  • 更方便的支持了 jsx
  • Vue 3 的 Template 支持多個根標簽,Vue 2 不支持
  • 對虛擬 DOM 進行了重寫、對模板的編譯進行了優化操作...

一、setup 函數

setup() 函數是 vue3 中,專門為組件提供的新屬性。它為我們使用 vue3 的 Composition API 新特性提供了統一的入口, setup 函數會在 beforeCreate 之后、created 之前執行, vue3 也是取消了這兩個鉤子,統一用 setup 代替, 該函數相當于一個生命周期函數,vue 中過去的 data,methods,watch 等全部都用對應的新增 api 寫在 setup()函數中

 

  1. setup(props, context) { 
  2.     context.attrs 
  3.     context.slots 
  4.     context.parent 
  5.     context.root 
  6.     context.emit 
  7.     context.refs 
  8.  
  9.     return { 
  10.  
  11.     } 
  12.   } 
  • props: 用來接收 props 數據
  • context 用來定義上下文, 上下文對象中包含了一些有用的屬性,這些屬性在 vue 2.x 中需要通過 this 才能訪問到, 在 setup() 函數中無法訪問到 this,是個 undefined
  • 返回值: return {}, 返回響應式數據, 模版中需要使用的函數

二、reactive 函數

reactive() 函數接收一個普通對象,返回一個響應式的數據對象, 想要使用創建的響應式數據也很簡單,創建出來之后,在 setup 中 return 出去,直接在 template 中調用即可

  1. <template> 
  2.   {{name}} // test 
  3. <template> 
  4.  
  5. <script lang="ts"
  6. import { defineComponent, reactive, ref, toRefs } from 'vue'
  7. export default defineComponent({ 
  8.   setup(props, context) { 
  9.  
  10.     let state = reactive({ 
  11.       name'test' 
  12.     }); 
  13.  
  14.     return state 
  15.   } 
  16. }); 
  17. </script> 

三、ref() 函數

ref() 函數用來根據給定的值創建一個響應式的數據對象,ref() 函數調用的返回值是一個對象,這個對象上只包含一個 value 屬性, 只在 setup 函數內部訪問 ref 函數需要加.value

  1. <template> 
  2.     <div class="mine"
  3.         {{count}} // 10 
  4.     </div> 
  5. </template> 
  6.  
  7. <script lang="ts"
  8. import { defineComponent, ref } from 'vue'
  9. export default defineComponent({ 
  10.   setup() { 
  11.     const count = ref<number>(10) 
  12.     // 在js 中獲取ref 中定義的值, 需要通過value屬性 
  13.     console.log(count.value); 
  14.     return { 
  15.        count 
  16.     } 
  17.    } 
  18. }); 
  19. </script> 

在 reactive 對象中訪問 ref 創建的響應式數據

  1. <template> 
  2.     <div class="mine"
  3.         {{count}} -{{t}} // 10 -100 
  4.     </div> 
  5. </template> 
  6.  
  7. <script lang="ts"
  8. import { defineComponent, reactive, ref, toRefs } from 'vue'
  9. export default defineComponent({ 
  10.   setup() { 
  11.     const count = ref<number>(10) 
  12.     const obj = reactive({ 
  13.       t: 100, 
  14.       count 
  15.     }) 
  16.     // 通過reactive 來獲取ref 的值時,不需要使用.value屬性 
  17.     console.log(obj.count); 
  18.     return { 
  19.        ...toRefs(obj) 
  20.     } 
  21.    } 
  22. }); 
  23. </script> 

四、isRef() 函數

isRef() 用來判斷某個值是否為 ref() 創建出來的對象

  1. <script lang="ts"
  2. import { defineComponent, isRef, ref } from 'vue'
  3. export default defineComponent({ 
  4.   setup(props, context) { 
  5.     const name: string = 'vue' 
  6.     const age = ref<number>(18) 
  7.     console.log(isRef(age)); // true 
  8.     console.log(isRef(name)); // false 
  9.  
  10.     return { 
  11.       age, 
  12.       name 
  13.     } 
  14.   } 
  15. }); 
  16. </script> 

五、toRefs() 函數

toRefs() 函數可以將 reactive() 創建出來的響應式對象,轉換為普通的對象,只不過,這個對象上的每個屬性節點,都是 ref() 類型的響應式數據

 

  1. <template> 
  2.   <div class="mine"
  3.     {{name}} // test 
  4.     {{age}} // 18 
  5.   </div> 
  6. </template> 
  7.  
  8. <script lang="ts"
  9. import { defineComponent, reactive, ref, toRefs } from 'vue'
  10. export default defineComponent({ 
  11.   setup(props, context) { 
  12.     let state = reactive({ 
  13.       name'test' 
  14.     }); 
  15.  
  16.     const age = ref(18) 
  17.  
  18.     return { 
  19.       ...toRefs(state), 
  20.       age 
  21.     } 
  22.   } 
  23. }); 
  24. </script> 

六、computed()

該函數用來創造計算屬性,和過去一樣,它返回的值是一個 ref 對象。里面可以傳方法,或者一個對象,對象中包含 set()、get()方法

6.1 創建只讀的計算屬性

 

  1. import { computed, defineComponent, ref } from 'vue'
  2. export default defineComponent({ 
  3.   setup(props, context) { 
  4.     const age = ref(18) 
  5.  
  6.     // 根據 age 的值,創建一個響應式的計算屬性 readOnlyAge,它會根據依賴的 ref 自動計算并返回一個新的 ref 
  7.     const readOnlyAge = computed(() => age.value++) // 19 
  8.  
  9.     return { 
  10.       age, 
  11.       readOnlyAge 
  12.     } 
  13.   } 
  14. }); 
  15. </script> 

6.2 通過 set()、get()方法創建一個可讀可寫的計算屬性

  1. <script lang="ts"
  2. import { computed, defineComponent, ref } from 'vue'
  3. export default defineComponent({ 
  4.   setup(props, context) { 
  5.     const age = ref<number>(18) 
  6.  
  7.     const computedAge = computed({ 
  8.       get: () => age.value + 1, 
  9.       set: value => age.value + value 
  10.     }) 
  11.     // 為計算屬性賦值的操作,會觸發 set 函數, 觸發 set 函數后,age 的值會被更新 
  12.     age.value = 100 
  13.     return { 
  14.       age, 
  15.       computedAge 
  16.     } 
  17.   } 
  18. }); 
  19. </script> 

七、 watch() 函數

watch 函數用來偵聽特定的數據源,并在回調函數中執行副作用。默認情況是懶執行的,也就是說僅在偵聽的源數據變更時才執行回調。

7.1 監聽用 reactive 聲明的數據源

  1. <script lang="ts"
  2. import { computed, defineComponent, reactive, toRefs, watch } from 'vue'
  3. interface Person { 
  4.   name: string, 
  5.   age: number 
  6. export default defineComponent({ 
  7.   setup(props, context) { 
  8.     const state = reactive<Person>({ name'vue', age: 10 }) 
  9.  
  10.     watch( 
  11.       () => state.age, 
  12.       (age, preAge) => { 
  13.         console.log(age); // 100 
  14.         console.log(preAge); // 10 
  15.       } 
  16.     ) 
  17.     // 修改age 時會觸發watch 的回調, 打印變更前后的值 
  18.     state.age = 100 
  19.     return { 
  20.       ...toRefs(state) 
  21.     } 
  22.   } 
  23. }); 
  24. </script> 

7.2 監聽用 ref 聲明的數據源

  1. <script lang="ts"
  2. import { defineComponent, ref, watch } from 'vue'
  3. interface Person { 
  4.   name: string, 
  5.   age: number 
  6. export default defineComponent({ 
  7.   setup(props, context) { 
  8.     const age = ref<number>(10); 
  9.  
  10.     watch(age, () => console.log(age.value)); // 100 
  11.  
  12.     // 修改age 時會觸發watch 的回調, 打印變更后的值 
  13.     age.value = 100 
  14.     return { 
  15.       age 
  16.     } 
  17.   } 
  18. }); 
  19. </script> 

7.3 同時監聽多個值

  1. <script lang="ts"
  2. import { computed, defineComponent, reactive, toRefs, watch } from 'vue'
  3. interface Person { 
  4.   name: string, 
  5.   age: number 
  6. export default defineComponent({ 
  7.   setup(props, context) { 
  8.     const state = reactive<Person>({ name'vue', age: 10 }) 
  9.  
  10.     watch( 
  11.       [() => state.age, () => state.name], 
  12.       ([newName, newAge], [oldName, oldAge]) => { 
  13.         console.log(newName); 
  14.         console.log(newAge); 
  15.  
  16.         console.log(oldName); 
  17.         console.log(oldAge); 
  18.       } 
  19.     ) 
  20.     // 修改age 時會觸發watch 的回調, 打印變更前后的值, 此時需要注意, 更改其中一個值, 都會執行watch的回調 
  21.     state.age = 100 
  22.     state.name = 'vue3' 
  23.     return { 
  24.       ...toRefs(state) 
  25.     } 
  26.   } 
  27. }); 
  28. </script> 

7.4 stop 停止監聽

在 setup() 函數內創建的 watch 監視,會在當前組件被銷毀的時候自動停止。如果想要明確地停止某個監視,可以調用 watch() 函數的返回值即可,語法如下:

  1. <script lang="ts"
  2. import { set } from 'lodash'
  3. import { computed, defineComponent, reactive, toRefs, watch } from 'vue'
  4. interface Person { 
  5.   name: string, 
  6.   age: number 
  7. export default defineComponent({ 
  8.   setup(props, context) { 
  9.     const state = reactive<Person>({ name'vue', age: 10 }) 
  10.  
  11.     const stop =  watch( 
  12.       [() => state.age, () => state.name], 
  13.       ([newName, newAge], [oldName, oldAge]) => { 
  14.         console.log(newName); 
  15.         console.log(newAge); 
  16.  
  17.         console.log(oldName); 
  18.         console.log(oldAge); 
  19.       } 
  20.     ) 
  21.     // 修改age 時會觸發watch 的回調, 打印變更前后的值, 此時需要注意, 更改其中一個值, 都會執行watch的回調 
  22.     state.age = 100 
  23.     state.name = 'vue3' 
  24.  
  25.     setTimeout(()=> { 
  26.       stop() 
  27.       // 此時修改時, 不會觸發watch 回調 
  28.       state.age = 1000 
  29.       state.name = 'vue3-' 
  30.     }, 1000) // 1秒之后講取消watch的監聽 
  31.  
  32.     return { 
  33.       ...toRefs(state) 
  34.     } 
  35.   } 
  36. }); 
  37. </script> 

八、LifeCycle Hooks(新的生命后期)

新版的生命周期函數,可以按需導入到組件中,且只能在 setup() 函數中使用, 但是也可以在 setup 自定義, 在 setup 中使用

  1. <script lang="ts"
  2. import { set } from 'lodash'
  3. import { defineComponent, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onErrorCaptured, onMounted, onUnmounted, onUpdated } from 'vue'
  4. export default defineComponent({ 
  5.   setup(props, context) { 
  6.     onBeforeMount(()=> { 
  7.       console.log('beformounted!'
  8.     }) 
  9.     onMounted(() => { 
  10.       console.log('mounted!'
  11.     }) 
  12.  
  13.     onBeforeUpdate(()=> { 
  14.       console.log('beforupdated!'
  15.     }) 
  16.     onUpdated(() => { 
  17.       console.log('updated!'
  18.     }) 
  19.  
  20.     onBeforeUnmount(()=> { 
  21.       console.log('beforunmounted!'
  22.     }) 
  23.     onUnmounted(() => { 
  24.       console.log('unmounted!'
  25.     }) 
  26.  
  27.     onErrorCaptured(()=> { 
  28.       console.log('errorCaptured!'
  29.     }) 
  30.  
  31.     return {} 
  32.   } 
  33. }); 
  34. </script> 

九、Template refs

通過 refs 來回去真實 dom 元素, 這個和 react 的用法一樣,為了獲得對模板內元素或組件實例的引用,我們可以像往常一樣在 setup()中聲明一個 ref 并返回它

  • 還是跟往常一樣,在 html 中寫入 ref 的名稱
  • 在steup 中定義一個 ref
  • steup 中返回 ref的實例
  • onMounted 中可以得到 ref的RefImpl的對象, 通過.value 獲取真實dom
  1. <template> 
  2.   <!--第一步:還是跟往常一樣,在 html 中寫入 ref 的名稱--> 
  3.   <div class="mine" ref="elmRefs"
  4.     <span>1111</span> 
  5.   </div> 
  6. </template> 
  7.  
  8. <script lang="ts"
  9. import { set } from 'lodash'
  10. import { defineComponent, onMounted, ref } from 'vue'
  11. export default defineComponent({ 
  12.   setup(props, context) { 
  13.     // 獲取真實dom 
  14.     const elmRefs = ref<null | HTMLElement>(null); 
  15.     onMounted (() => { 
  16.       console.log(elmRefs.value); // 得到一個 RefImpl 的對象, 通過 .value 訪問到數據 
  17.     }) 
  18.  
  19.     return { 
  20.       elmRefs 
  21.     } 
  22.   } 
  23. }); 
  24. </script> 

十、vue 的全局配置

通過 vue 實例上 config 的配置,包含 Vue 應用程序全局配置的對象。您可以在掛載應用程序之前修改下面列出的屬性:

 

  1. const app = Vue.createApp({})  
  2. app.config = {...} 

為組件渲染功能和觀察程序期間的未捕獲錯誤分配處理程序。錯誤和應用程序實例將調用處理程序

  1. app.config.errorHandler = (err, vm, info) => {} 

可以在應用程序內的任何組件實例中訪問的全局屬性,組件的屬性將具有優先權。這可以代替 Vue 2.xVue.prototype 擴展:

 

  1. const app = Vue.createApp({})  
  2. app.config.globalProperties.$http = 'xxxxxxxxs' 

可以在組件用通過 getCurrentInstance() 來獲取全局 globalProperties 中配置的信息,getCurrentInstance 方法獲取當前組件的實例,然后通過 ctx 屬性獲得當前上下文,這樣我們就能在 setup 中使用 router 和 vuex, 通過這個屬性我們就可以操作變量、全局屬性、組件屬性等等

 

  1. setup( ) { 
  2.   const { ctx } = getCurrentInstance(); 
  3.   ctx.$http 

十一、Suspense 組件

在開始介紹 Vue 的 Suspense 組件之前,我們有必要先了解一下 React 的 Suspense 組件,因為他們的功能類似。

React.lazy 接受一個函數,這個函數需要動態調用 import()。它必須返回一個 Promise,該 Promise 需要 resolve 一個 default export 的 React 組件。

 

  1. import React, { Suspense } from 'react'
  2.  
  3.  
  4. const myComponent = React.lazy(() => import('./Component')); 
  5.  
  6.  
  7. function MyComponent() { 
  8.   return ( 
  9.     <div> 
  10.       <Suspense fallback={<div>Loading...</div>}> 
  11.         <myComponent /> 
  12.       </Suspense> 
  13.     </div> 
  14.   ); 

Vue3 也新增了 React.lazy 類似功能的 defineAsyncComponent 函數,處理動態引入(的組件)。defineAsyncComponent 可以接受返回承諾的工廠函數。當您從服務器檢索到組件定義時,應該調用 Promise 的解析回調。您還可以調用 reject(reason)來指示負載已經失敗

 

  1. import { defineAsyncComponent } from 'vue' 
  2.  
  3. const AsyncComp = defineAsyncComponent(() => 
  4.   import('./components/AsyncComponent.vue'
  5.  
  6. app.component('async-component', AsyncComp) 

Vue3 也新增了 Suspense 組件:

  1. <template> 
  2.   <Suspense> 
  3.     <template #default
  4.       <my-component /> 
  5.     </template> 
  6.     <template #fallback> 
  7.       Loading ... 
  8.     </template> 
  9.   </Suspense> 
  10. </template> 
  11.  
  12. <script lang='ts'
  13.  import { defineComponent, defineAsyncComponent } from "vue"
  14.  const MyComponent = defineAsyncComponent(() => import('./Component')); 
  15.  
  16. export default defineComponent({ 
  17.    components: { 
  18.      MyComponent 
  19.    }, 
  20.    setup() { 
  21.      return {} 
  22.    } 
  23. }) 
  24.  
  25.  
  26. </script> 

十二、vue 3.x 完整組件模版結構

一個完成的 vue 3.x 完整組件模版結構包含了:組件名稱、 props、components、setup(hooks、computed、watch、methods 等)

 

  1. <template> 
  2.   <div class="mine" ref="elmRefs"
  3.     <span>{{name}}</span> 
  4.     <br> 
  5.     <span>{{count}}</span> 
  6.     <div> 
  7.       <button @click="handleClick">測試按鈕</button> 
  8.     </div> 
  9.  
  10.     <ul> 
  11.       <li v-for="item in list" :key="item.id">{{item.name}}</li> 
  12.     </ul> 
  13.   </div> 
  14. </template> 
  15.  
  16. <script lang="ts"
  17. import { computed, defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, toRefs } from 'vue'
  18.  
  19. interface IState { 
  20.   count: 0, 
  21.   name: string, 
  22.   list: Array<object> 
  23.  
  24. export default defineComponent({ 
  25.   name'demo'
  26.   // 父組件傳子組件參數 
  27.   props: { 
  28.     name: { 
  29.       type: String as PropType<null | ''>, 
  30.       default'vue3.x' 
  31.     }, 
  32.     list: { 
  33.       type: Array as PropType<object[]>, 
  34.       default: () => [] 
  35.     } 
  36.   }, 
  37.   components: { 
  38.     /// TODO 組件注冊 
  39.   }, 
  40.   emits: ["emits-name"], // 為了提示作用 
  41.   setup (props, context) { 
  42.     console.log(props.name
  43.     console.log(props.list) 
  44.  
  45.  
  46.     const state = reactive<IState>({ 
  47.       name'vue 3.0 組件'
  48.       count: 0, 
  49.       list: [ 
  50.         { 
  51.           name'vue'
  52.           id: 1 
  53.         }, 
  54.         { 
  55.           name'vuex'
  56.           id: 2 
  57.         } 
  58.       ] 
  59.     }) 
  60.  
  61.     const a = computed(() => state.name
  62.  
  63.     onMounted(() => { 
  64.  
  65.     }) 
  66.  
  67.     function handleClick () { 
  68.       state.count ++ 
  69.       // 調用父組件的方法 
  70.       context.emit('emits-name', state.count
  71.     } 
  72.  
  73.     return { 
  74.       ...toRefs(state), 
  75.       handleClick 
  76.     } 
  77.   } 
  78. }); 
  79. </script> 
  80.  
  81. <template> 
  82.   <div class="mine" ref="elmRefs"
  83.     <span>{{name}}</span> 
  84.     <br> 
  85.     <span>{{count}}</span> 
  86.     <div> 
  87.       <button @click="handleClick">測試按鈕</button> 
  88.     </div> 
  89.  
  90.     <ul> 
  91.       <li v-for="item in list" :key="item.id">{{item.name}}</li> 
  92.     </ul> 
  93.   </div> 
  94. </template> 
  95.  
  96. <script lang="ts"
  97. import { computed, defineComponent, getCurrentInstance, onMounted, PropType, reactive, ref, toRefs } from 'vue'
  98.  
  99. interface IState { 
  100.   count: 0, 
  101.   name: string, 
  102.   list: Array<object> 
  103.  
  104. export default defineComponent({ 
  105.   name'demo'
  106.   // 父組件傳子組件參數 
  107.   props: { 
  108.     name: { 
  109.       type: String as PropType<null | ''>, 
  110.       default'vue3.x' 
  111.     }, 
  112.     list: { 
  113.       type: Array as PropType<object[]>, 
  114.       default: () => [] 
  115.     } 
  116.   }, 
  117.   components: { 
  118.     /// TODO 組件注冊 
  119.   }, 
  120.   emits: ["emits-name"], // 為了提示作用 
  121.   setup (props, context) { 
  122.     console.log(props.name
  123.     console.log(props.list) 
  124.  
  125.  
  126.     const state = reactive<IState>({ 
  127.       name'vue 3.0 組件'
  128.       count: 0, 
  129.       list: [ 
  130.         { 
  131.           name'vue'
  132.           id: 1 
  133.         }, 
  134.         { 
  135.           name'vuex'
  136.           id: 2 
  137.         } 
  138.       ] 
  139.     }) 
  140.  
  141.     const a = computed(() => state.name
  142.  
  143.     onMounted(() => { 
  144.  
  145.     }) 
  146.  
  147.     function handleClick () { 
  148.       state.count ++ 
  149.       // 調用父組件的方法 
  150.       context.emit('emits-name', state.count
  151.     } 
  152.  
  153.     return { 
  154.       ...toRefs(state), 
  155.       handleClick 
  156.     } 
  157.   } 
  158. }); 
  159. </script> 

vue 3 的生態

  • 官網
  • 源碼
  • vite 構建器
  • 腳手架:https://cli.vuejs.org/
  • vue-router-next
  • vuex4.0

UI 組件庫

  • vant2.x
  • Ant Design of Vue 2.x
  • element-plus

 

10分鐘讓你快速上手Vue3

 

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-09-11 08:25:57

PythonPyQt

2023-09-08 07:54:01

TkinterPython

2025-05-22 10:00:00

DockerRedis容器

2021-04-23 09:50:41

topLinux命令

2022-02-23 20:38:32

云原生集群Postgres

2024-08-07 10:16:00

2014-11-10 12:29:52

客服網站

2017-11-20 10:25:20

數據庫MySQL索引

2021-01-07 08:05:20

JenkinsDevOps

2021-03-04 09:26:57

微服務架構數據

2023-08-15 15:50:42

2009-11-25 09:02:12

2017-06-07 18:40:33

PromiseJavascript前端

2009-11-05 10:56:31

WCF通訊

2021-08-02 15:40:20

Java日志工具

2022-03-04 16:06:33

數據庫HarmonyOS鴻蒙

2023-02-16 08:26:41

2020-10-14 11:31:41

Docker

2021-08-03 17:00:25

Spring Boot代碼Java

2011-06-10 14:19:49

SEO百度收錄
點贊
收藏

51CTO技術棧公眾號

久久一区免费| 国外成人在线播放| www黄色在线| 在线观看免费黄色| 国产主播一区二区| 久久男人av资源网站| 亚洲天堂久久新| 免费观看的毛片| 国产精品日韩久久久| 国产亚洲在线播放| 久久无码人妻一区二区三区| 草美女在线观看| 国产亚洲欧洲997久久综合 | 深夜福利视频一区二区| 国产女人18毛片水真多成人如厕| 成人黄色中文字幕| 日韩一区二区视频在线| 国产国产精品| 色激情天天射综合网| 一区二区三区国产福利| 欧美综合视频在线| 久久精品理论片| 91精品国产自产91精品| 国产suv精品一区二区68| 欧美aaaaa级| 欧美一区二区三区系列电影| 人妻熟妇乱又伦精品视频| 欧美尤物美女在线| 成人av资源网站| 欧美黑人狂野猛交老妇| 亚洲第一综合网| 九色丨蝌蚪丨成人| 欧美巨大另类极品videosbest| 青青草视频在线免费播放| 五月婷婷在线观看| 久久精品视频在线看| 大波视频国产精品久久| 青青草手机在线观看| 精品国产一区探花在线观看 | 国产成人精品免高潮费视频| 精品视频在线观看免费| 国产韩国精品一区二区三区| 国产亚洲福利一区| 久久精品女同亚洲女同13| 警花av一区二区三区| 欧美三级视频在线| 免费黄色特级片| 精品国产第一福利网站| 26uuu久久综合| www.久久爱.cn| 圆产精品久久久久久久久久久| 成人h动漫精品一区二区器材| 欧美视频在线一区二区三区 | 欧美大片在线观看一区二区| 特级西西444| 男人天堂手机在线| 欧美高清在线一区| 色视频一区二区三区| 中文字幕一区二区三区波野结| 91久久视频| 久久久综合av| 国产成人愉拍精品久久| 亚洲精选一区| 91超碰caoporn97人人| 黄色激情视频在线观看| 亚洲三级免费| 1769国产精品| 亚洲熟女综合色一区二区三区| 国产精品日本| 日本一欧美一欧美一亚洲视频| 波多野在线播放| 欧美激情在线免费| 亚洲性xxxx| 国产jizz18女人高潮| 久久在线免费| 不卡伊人av在线播放| 少妇一级淫片免费放播放| 精品女人视频| 精品一区二区三区三区| a级大片在线观看| 青青草成人影院| 免费不卡在线观看av| 男女黄床上色视频| 国语精品视频| 精品久久久久久久人人人人传媒 | 免费污污视频在线观看| 久久最新视频| 国产精品视频久久| 国产女无套免费视频| 免费在线日韩av| 久久电影一区二区| 国产亚洲精品成人| 久久精品二区三区| 成人久久一区二区三区| www日本高清| 久久综合久久99| 亚洲综合自拍一区| 人人妻人人澡人人爽精品日本| 91蜜桃婷婷狠狠久久综合9色| 日韩中文字幕av在线| 尤物视频在线看| 国产欧美日本一区视频| 中文字幕免费高| 狠狠操一区二区三区| 色婷婷精品大视频在线蜜桃视频| 亚洲美女性囗交| 精品亚洲自拍| 久久久国产成人精品| 国产精品第9页| 久久精品国产99| 国产日韩欧美精品| 亚洲欧美视频一区二区| 午夜婷婷国产麻豆精品| 爱爱爱爱免费视频| 美女福利一区| 欧美成人亚洲成人日韩成人| 国产精品一区无码| 国产精品一卡二| 亚洲国产日韩欧美| 中文字幕在线中文字幕在线中三区| 欧美日韩国产首页| 最新在线黄色网址| 一本一道久久综合狠狠老| 日韩小视频在线观看| 久久夜靖品2区| 国产激情91久久精品导航| 日韩精品成人一区二区在线观看| 国内高清免费在线视频| 欧美人体做爰大胆视频| 91成人在线免费视频| 亚洲巨乳在线| av蓝导航精品导航| 黄色网在线播放| 欧洲精品在线观看| 久久久精品人妻无码专区| 亚洲小说欧美另类社区| 亚洲一区二区少妇| 午夜在线视频| 欧洲色大大久久| 韩国三级hd中文字幕| 国产一区二区精品| 精品国产乱码一区二区三区四区| 香蕉成人app免费看片| 一区二区三区在线影院| 青草网在线观看| 高清不卡一区| 中文字幕日韩av综合精品| 男人的天堂av网站| 久久蜜桃一区二区| 久久美女福利视频| 欧美影院天天5g天天爽| 97久久伊人激情网| 特黄aaaaaaaaa真人毛片| 亚洲一区二区在线播放相泽| 九色91porny| 午夜激情一区| 97av视频在线| 午夜性色福利视频| 狠狠做深爱婷婷久久综合一区| 2018国产精品| 欧美日韩免费观看一区=区三区| 欧美精品videos另类日本| 99国产在线播放| 亚洲精品国产一区二区三区四区在线| 天堂在线一区二区三区| 综合在线一区| 国产精品毛片va一区二区三区| 国产蜜臀一区二区打屁股调教| 日韩免费高清视频| 国产无遮挡又黄又爽在线观看| 白白色亚洲国产精品| 精品一区二区中文字幕| 九色精品91| 国产欧美日韩精品在线观看| www红色一片_亚洲成a人片在线观看_| 欧美一区二区人人喊爽| 99免费在线观看| 久久人人97超碰com| 亚洲成人av免费看| 婷婷久久综合| 成人免费91在线看| 黄在线观看免费网站ktv| 亚洲美女黄色片| 在线黄色av网站| 一区二区理论电影在线观看| 无码精品一区二区三区在线播放| 裸体素人女欧美日韩| 一区二区三区视频| 超碰成人免费| 国产精品久久久久久久久久久久久久| 99re在线视频| 精品国产自在久精品国产| 日本一级黄色大片| 国产精品三级av| wwwxxx色| 日韩av一级片| 欧美久久综合性欧美| 亚洲91在线| 亚洲 日韩 国产第一| av在线之家电影网站| 日韩精品一区二区三区四区| www.欧美色| 亚洲精品国久久99热| 亚洲永久精品ww.7491进入| 激情综合网天天干| 日韩在线一级片| 午夜精品久久久久久久四虎美女版| 国产乱码精品一区二区三区中文| 播放一区二区| 国内自拍欧美激情| 日本在线免费看| 日韩精品视频免费| 国产伦子伦对白视频| 欧美午夜www高清视频| 免费三级在线观看| 国产亚洲一二三区| 国产精品久久久久久久无码| 久久精品国产色蜜蜜麻豆| www..com日韩| 亚洲午夜精品一区 二区 三区| 蜜桃成人在线| а√中文在线天堂精品| 国产综合久久久久久| 欧美电影免费观看| 久久人人爽人人爽人人片av高请| 免费av在线网址| 亚洲图片欧美午夜| 国产精品国产高清国产| 日韩精品一区二区三区在线播放| 伊人22222| 在线国产电影不卡| 国产精品视频一区在线观看| 亚洲一区二区三区四区五区中文| 情侣偷拍对白清晰饥渴难耐| 久久精品亚洲麻豆av一区二区| 亚洲国产精品成人综合久久久| 国产成人亚洲综合a∨婷婷| 香蕉视频999| 久久精品免费观看| 老司机午夜性大片| 蜜桃一区二区三区四区| 亚洲乱码国产一区三区| 先锋影音久久久| 免费成人午夜视频| 国产亚洲精品v| 国产黄页在线观看| 一区二区三区四区五区精品视频| 可以看毛片的网址| 国产精品99一区二区| 黄色一级大片免费| 欧美午夜久久| 狠狠噜天天噜日日噜| 国产精品99免费看| 免费拍拍拍网站| 亚洲在线国产日韩欧美| 免费在线a视频| 免费看的黄色欧美网站| 午夜精品久久久内射近拍高清| 免费国产自线拍一欧美视频| 啊啊啊一区二区| 久久亚洲电影| 中文字幕天天干| 国产一区二区在线看| xxxx国产视频| 99久久婷婷国产综合精品| 三级电影在线看| 国产日产欧美一区二区视频| 丰满的亚洲女人毛茸茸| 风流少妇一区二区| 亚洲最大综合网| 久久69国产一区二区蜜臀| 一级做a爱视频| 丁香激情综合国产| 波多野结衣xxxx| 国内精品第一页| av在线天堂网| 久久综合五月天婷婷伊人| 免费看黄色av| 亚洲美女偷拍久久| 日本少妇性生活| 在线观看成人免费视频| 国产强被迫伦姧在线观看无码| 欧美mv日韩mv国产网站app| 人人妻人人澡人人爽精品日本| 亚洲欧美综合精品久久成人| av网站在线免费播放| 欧美成人激情图片网| 蜜桃在线视频| 国产精品揄拍一区二区| 亚洲高清在线一区| 欧美激情视频一区二区三区| 国产精品国产一区| 免费看国产曰批40分钟| 老司机午夜精品| 亚洲制服丝袜在线播放| 国产精品国产三级国产普通话三级| 欧美成人黄色网| 91激情在线视频| www.com在线观看| 国产亚洲激情在线| 九色91在线| 国产日韩欧美夫妻视频在线观看| 国产精品xxx在线观看| 日韩在线导航| 一级成人国产| 成人在线短视频| 久久精品人人做人人爽97| 免费中文字幕视频| 欧美亚州韩日在线看免费版国语版| 亚洲免费国产视频| 日韩网站免费观看| 亚洲天堂电影| av免费观看久久| 99久久www免费| 蜜臀久久99精品久久久酒店新书| 国产成人精品三级| 又色又爽的视频| 色综合久久99| 天天综合在线视频| 欧美不卡视频一区发布| 欧美性片在线观看| 噜噜噜噜噜久久久久久91| 欧美午夜国产| 欧美日韩一区二区区| 国产精品亲子伦对白| 精品国产xxx| 亚洲国产成人爱av在线播放| 日本人妻丰满熟妇久久久久久| 日韩午夜在线视频| 欧美精选视频一区二区| 久久久99爱| 一区视频在线看| 午夜诱惑痒痒网| 国产精品国产精品国产专区不蜜 | 91精品国产高清久久久久久91裸体 | 一本大道久久a久久精二百| 日本黄色三级视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 手机在线观看日韩av| 国产精品久久久久久妇女6080| 在线观看 亚洲| 精品丝袜一区二区三区| sm久久捆绑调教精品一区| 99久久久精品免费观看国产| 影音先锋成人在线电影| 亚洲一区二区中文字幕在线观看| 国产精品国产三级国产aⅴ中文| 中文字幕一区二区人妻痴汉电车| 一区二区三区视频免费| 最新av网站在线观看| 国产成人免费91av在线| 你懂的一区二区三区| 逼特逼视频在线| 久久综合资源网| 999视频在线| 中文字幕日韩av综合精品| 日韩毛片免费看| www.午夜色| 国产一区二区三区免费观看| 日韩成人毛片视频| 欧美本精品男人aⅴ天堂| 国产乱妇乱子在线播视频播放网站| 高清国产在线一区| 99成人精品| www.99热| 91精品蜜臀在线一区尤物| 在线āv视频| 九九九九九九精品| 日韩专区在线视频| 日韩精品一区二区三区在线视频| 这里只有精品免费| 欧美极品少妇videossex| 国语精品中文字幕| 久久精品盗摄| 91 在线视频| 亚洲大尺度美女在线| 澳门成人av网| 一本色道久久综合亚洲二区三区| 国产一区二区影院| 国产一级中文字幕| 亚洲人成网在线播放| 四虎国产精品免费久久| 91亚洲精品国产| 久久精品网站免费观看| 国产欧美熟妇另类久久久| 亚州精品天堂中文字幕| 成人a'v在线播放| 久久黄色一级视频| 91福利在线看| 激情av在线播放| 色一情一乱一伦一区二区三区| 国产专区欧美精品| 69视频免费在线观看| 精品国内亚洲在观看18黄 | 欧洲国产精品| 韩国三级中文字幕hd久久精品| 日本在线视频中文字幕| 中文字幕日韩av电影| 国产美女撒尿一区二区| a在线观看免费视频|