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

令人眼前一亮的 Vue 實戰技巧

開發 前端
本文主要介紹日常項目開發過程中的一些技巧,不僅可以幫助提升工作效率,還能提高應用的性能。以下是我總結一些平時工作中的技巧。

[[418041]]

 前言

本文主要介紹日常項目開發過程中的一些技巧,不僅可以幫助提升工作效率,還能提高應用的性能。以下是我總結一些平時工作中的技巧。

minxin 讓組件復用靈活化

Vue提供了minxin這種在組件內插入組件屬性的方法,個人建議這貨能少用就少用,但是有個場景則非常建議使用minxin:當某段代碼重復出現在多個組件中,并且這個重復的代碼塊很大的時候,將其作為一個minxin常常能給后期的維護帶來很大的方便。

比如我們在項目中封裝一個列表功能,有下拉刷新,加載自動請求數據,上拉加載下一頁數據等等,代碼如下: 

  1. export default {  
  2.     data() {  
  3.         return {  
  4.             page: 1,  
  5.             limit: 10,  
  6.             busy: false, // 請求攔截,防止多次加載  
  7.             finish: false, // 是否請求完成,用于頁面展示效果  
  8.             pageList: [], // 頁面數據  
  9.             reqParams: {}, // 頁面請求參數,可被改變的  
  10.             defaultParams: {}, // 頁面請求參數,下拉刷新不會被重置的改變  
  11.             routeName: '', // 特殊情況,頁面需要復用別人的list的時候  
  12.             autoReq: true, // onload是否自己去請求  
  13.             lodingText: '', // 請求中底部顯示的文案  
  14.             noDataText: '暫無數據', // 自定義無數據文案  
  15.             lastText: '- 我是有底線的 -',  
  16.             noData: false, // 頁面無數據  
  17.             reqName: ''  
  18.         }  
  19.     },  
  20.     created() {  
  21.         this.autoReq && this.initPage(false, true) 
  22.     },  
  23.     onPullDownRefresh() {  
  24.         this.pullDownRefreshFn()  
  25.     },  
  26.     onReachBottom() {  
  27.         this.reachBottomFn()  
  28.     },  
  29.     methods: {  
  30.         // 重置初始化數據  
  31.         initPage(saveParams = truerefresh = false) {  
  32.             // 初始化所有變量  
  33.             this.page = 1  
  34.             this.busy = false  
  35.             this.finish = false  
  36.             this.noData = false  
  37.             this.lodingText = '數據加載中'  
  38.             if (saveParams) {  
  39.                 const { page, limit } = this.reqParams  
  40.                 page ? this.page = page : ''  
  41.                 limit ? this.limit = limit : ''  
  42.             } else { 
  43.                 this.reqParams = {}  
  44.             }  
  45.             this.getCommonList(refresh)  
  46.         },  
  47.         // 下拉刷新函數  
  48.         pullDownRefreshFn() {  
  49.             this.initData()  
  50.             this.initPage(false, true)  
  51.         },  
  52.         // 上啦加載函數  
  53.         reachBottomFn() {  
  54.             this.getCommonList()  
  55.         },  
  56.         // 重置數據,方便調用(一般在外面自定義清空一些數據)  
  57.         initData() { // 重置data里面的變量,方便外面引用這個mixin的時候,下拉刷新重置變量  
  58.         },  
  59.         // 列表獲取數據接口  
  60.         async getCommonList(refresh) {  
  61.             if (!this.reqName) return  
  62.             if (this.busy) return  
  63.             this.busy = true  
  64.             this.finish = false  
  65.             const httpFn = this.$http || getApp().globalData.$http// 兼容nvue  
  66.             try {  
  67.                 const query = {  
  68.                     ...this.defaultParams,  
  69.                     ...this.reqParams,  
  70.                     page: this.page,  
  71.                     limit: this.limit  
  72.                 }  
  73.                 const { data } = await httpFn(this.reqName, query)  
  74.                 if (this.page === 1) this.pageList = []  
  75.                 /**  
  76.                  * [Node.JS中用concat和push連接兩個或多個數組的性能比較](http://ourjs.com/detail/5cb3fe1c44b4031138b4a1e2)  
  77.                  * 那么兩者在node.js的性能如何? 我們做了一組測試數據,兩種分別測試100萬次。  
  78.                  * push比concat方法快3倍左右。因為push只是在原數組的基礎上進行修改,所以會快一點。  
  79.                  * push返回的是數組的長度,所以沒重新定義變量再判斷了  
  80.                  * [Array.prototype.push.apply(arr1, arr2)無法自動觸發DOM更新](https://www.imooc.com/wenda/detail/494323)  
  81.                  * 因為 this.pageList.push !== Array.prototype.push,,this.pageList.push指向的是vue重寫過的方法  
  82.                  */  
  83.                 this.finish = true  
  84.                 const resLen = data.list ? data.list.length : 0  
  85.                 if (resLen === 0) {  
  86.                     this.resSuccess(data, refresh)  
  87.                     return  
  88.                 }  
  89.                 const listLen = this.pageList.push.apply(this.pageList, data.list)  
  90.                 if (listLen < data.count && this.limit <= resLen) { // 說明還有數據  
  91.                     this.busy = false  
  92.                     this.page = Math.ceil(listLen / this.limit) + 1  
  93.                 }  
  94.                 this.resSuccess(data, refresh)  
  95.             } catch (e) {  
  96.                 // 防止接口報錯鎖死  
  97.                 this.busy = false  
  98.                 this.finish = true  
  99.             }  
  100.         },  
  101.         resSuccess(data, refresh) {  
  102.             if (this.finish && this.busy) {  
  103.                 if (this.pageList.length > 0) {  
  104.                     this.$nextTick(() => {  
  105.                         setTimeout(() => {  
  106.                             thisthis.lodingText = this.lastText  
  107.                         }, 100)  
  108.                     })  
  109.                 } else {  
  110.                     thisthis.lodingText = this.noDataText  
  111.                     this.noData = true  
  112.                 }  
  113.             }  
  114.             refresh && uni.stopPullDownRefresh()  
  115.             this.finishInit(data)  
  116.         },  
  117.         // 請求完成做點什么(方便外面導入的文件自己引用)  
  118.         finishInit(data) { // 請求完成做點什么  
  119.             // console.log('列表請求完成');  
  120.         }  
  121.     } 

很多人看到這樣場景,應該會好奇為什么不封裝成一個組件?由于很多列表樣式不盡相同,所以封裝成一個組件可擴展性不高。但我們可以通過minxin來簡化代碼: 

  1. <template>  
  2.   <view class="c-recommend-goods">  
  3.     <!-- 列表樣式 -->  
  4.     <view class="" v-for="item in pageList" :key="item.id">{{item}}</view>  
  5.     <!-- 空狀態&& 加載中等小提示 -->  
  6.     <c-no-data v-if="lodingText" :show-img="noData" :text="lodingText"></c-no-data>  
  7.   </view>  
  8. </template>  
  9. <script>  
  10. import listMixins from '@/common/mixins/list.js'  
  11. export default {  
  12.   mixins: [listMixins],  
  13.   data() {  
  14.     return { 
  15.       autoReq: false, // 進入頁面自動請求數據  
  16.       reqParams: {}, // 請求參數  
  17.       reqName: 'userCompanyList' // 請求地址  
  18.     }  
  19.   }  
  20.  
  21. </script>  
  22. <style></style> 

我們只要定義請求參數和請求的地址,還有列表的樣式,就能實現一個不錯的列表功能。

拯救繁亂的template--render函數

有時候項目中template里存在一值多判斷,如果按照下方代碼書寫業務邏輯,代碼冗余且雜亂。 

  1. <template>  
  2.   <div>  
  3.     <h1 v-if="level === 1">  
  4.       <slot></slot>  
  5.     </h1>  
  6.     <h2 v-else-if="level === 2">  
  7.       <slot></slot>  
  8.     </h2>  
  9.     <h3 v-else-if="level === 3">  
  10.       <slot></slot>  
  11.     </h3>  
  12.     <h4 v-else-if="level === 4">  
  13.       <slot></slot>  
  14.     </h4>  
  15.     <h5 v-else-if="level === 5">  
  16.       <slot></slot>  
  17.     </h5>  
  18.     <h6 v-else-if="level === 6">  
  19.       <slot></slot>  
  20.     </h6>  
  21.   </div>  
  22. </template>  
  23. <script>  
  24. export default {  
  25.   data() {  
  26.     return {}  
  27.   },  
  28.   props: {  
  29.     level: {  
  30.       type: Number,  
  31.       required: true,  
  32.     },  
  33.   },  
  34.  
  35. </script> 

現在使用 render 函數重寫上面的例子: 

  1. <script>  
  2.   export default {  
  3.     props: {  
  4.       level: {  
  5.         require: true,  
  6.         type: Number,  
  7.       }  
  8.     },  
  9.     render(createElement) {  
  10.       return createElement('h' + this.level, this.$slots.default);  
  11.     }  
  12.   };  
  13. </script> 

一勞永逸的組件注冊

組件使用前,需要引入后再注冊: 

  1. import BaseButton from './baseButton'  
  2. import BaseIcon from './baseIcon'  
  3. import BaseInput from './baseInput'  
  4. export default {  
  5.   components: {  
  6.     BaseButton,  
  7.     BaseIcon,  
  8.     BaseInput  
  9.   }  

現在 BaseButton、 BaseIcon和BaseInput都可以在模板中使用了: 

  1. <BaseInput  
  2.   v-model="searchText"  
  3.   @keydown.enter="search"  
  4. />  
  5. <BaseButton @click="search">  
  6.   <BaseIcon name="search"/>  
  7. </BaseButton> 

但如果組件多了后,每次都要先導入每個你想使用的組件,然后再注冊組件,便會新增很多代碼量!我們應該如何優化呢?

這時,我們需要借助一下webpack的require.context() 方法來創建自己的(模塊)上下文,從而實現自動動態require組件。這個方法需要3個參數:要搜索的文件夾目錄,是否還應該搜索它的子目錄,以及一個匹配文件的正則表達式。

我們先在components文件夾(這里面都是些高頻組件)添加一個叫global.js的文件,在這個文件里使用require.context 動態將需要的高頻組件統統打包進來。然后在main.js文件中引入global.js的文件。 

  1. //  global.js文件  
  2. import Vue from 'vue'  
  3. function changeStr (str) {  
  4.   return str.charAt(0).toUpperCase() + str.slice(1)  
  5.  
  6. const requirerequireComponent = require.context('./', false, /\.vue$/)  
  7. // 查找同級目錄下以vue結尾的組件  
  8. const install = () => {  
  9.   requireComponent.keys().forEach(fileName => {  
  10.     let config = requireComponent(fileName)  
  11.     console.log(config) // ./child1.vue 然后用正則拿到child1  
  12.     let componentName = changeStr 
  13.       fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')  
  14.     ) 
  15.     Vue.component(componentName, config.default || config)  
  16.   }) 
  17.  
  18. export default {  
  19.   install // 對外暴露install方法 
  20.  
  21. // main.js  
  22. import index from './components/global.js'  
  23. Vue.use(index) 

最后我們就可以隨時隨地在頁面中使用這些高頻組件,無需再手動一個個引入了。

隱藏的大招--hook

開發過程中我們有時候要創建一個定時器,在組件被銷毀之前,這個定時器也要銷毀。代碼如下: 

  1. mounted() {  
  2.   // 創建一個定時器  
  3.     this.timer = setInterval(() => {  
  4.       // ......  
  5.     }, 500);  
  6.   },  
  7.   // 銷毀這個定時器。  
  8.   beforeDestroy() {  
  9.     if (this.timer) {  
  10.       clearInterval(this.timer);  
  11.       this.timer = null 
  12.     }  
  13.   } 

這種寫法有個很明顯的弊端:定時器timer的創建和清理并不是在一個地方,這樣很容易導致忘記去清理!

我們可以借助hook對代碼整合,這樣代碼也更容易維護了: 

  1. mounted() {  
  2.     let timer = setInterval(() => {  
  3.       // ......  
  4.     }, 500); 
  5.     this.$once("hook:beforeDestroy", function() {  
  6.       if (timer) {  
  7.         clearInterval(timer);  
  8.         timer = null 
  9.       }  
  10.     });  
  11.   } 

在Vue組件中,可以用過once去監聽所有的生命周期鉤子函數,如監聽組件的updated鉤子函數可以寫成 this.$on('hook:updated', () => {})。

hook除了上面的運用外,還可以外部監聽組件的生命周期函數。在某些情況下,我們需要在父組件中了解一個子組件何時被創建、掛載或更新。

比如,如果你要在第三方組件 CustomSelect 渲染時監聽其 updated 鉤子,可以通過@hook:updated來實現: 

  1. <template>  
  2.   <!--通過@hook:updated監聽組件的updated生命鉤子函數-->  
  3.   <!--組件的所有生命周期鉤子都可以通過@hook:鉤子函數名 來監聽觸發-->  
  4.   <custom-select @hook:updated="doSomething" />  
  5. </template>  
  6. <script>  
  7. import CustomSelect from "../components/custom-select";  
  8. export default {  
  9.   components: {  
  10.     CustomSelect  
  11.   },  
  12.   methods: {  
  13.     doSomething() {  
  14.       console.log("custom-select組件的updated鉤子函數被觸發");  
  15.     }  
  16.   }  
  17. }; 
  18. </script> 

簡單暴力的router key

我們在項目開發時,可能會遇到這樣問題:當頁面切換到同一個路由但不同參數地址時,比如/detail/1,跳轉到/detail/2,頁面跳轉后數據竟然沒更新?路由配置如下: 

  1.  
  2.     path: "/detail/:id",  
  3.     name:"detail",  
  4.     component: Detail 
  5.  

這是因為vue-router會識別出兩個路由使用的是同一個組件從而進行復用,并不會重新創建組件,而且組件的生命周期鉤子自然也不會被觸發,導致跳轉后數據沒有更新。那我們如何解決這個問題呢?我們可以為router-view組件添加屬性key,例子如下: 

  1. <router-view :key="$route.fullpath"></router-view> 

這種辦法主要是利用虛擬DOM在渲染時候通過key來對比兩個節點是否相同,如果key不相同,就會判定router-view組件是一個新節點,從而先銷毀組件,然后再重新創建新組件,這樣組件內的生命周期會重新觸發。

高精度權限控制--自定義指令directive

我們通常給一個元素添加v-if / v-show,來判斷該用戶是否有權限,但如果判斷條件繁瑣且多個地方需要判斷,這種方式的代碼不僅不優雅而且冗余。針對這種情況,我們可以封裝了一個指令權限,能簡單快速的實現按鈕級別的權限判斷。我們先在新建個array.js文件,用于存放與權限相關的全局函數 

  1. // array.js  
  2. export function checkArray (key) {  
  3.   let arr = ['admin', 'editor']  
  4.   let index = arr.indexOf(key)  
  5.   if (index > -1) {  
  6.     return true // 有權限  
  7.   } else {  
  8.     return false // 無權限  
  9.   }  

然后在將array文件掛載到全局中 

  1. // main.js  
  2. import { checkArray } from "./common/array";  
  3. Vue.config.productionTip = false 
  4. Vue.directive("permission", {  
  5.   inserted (el, binding) {  
  6.     let permission = binding.value; // 獲取到 v-permission的值  
  7.     if (permission) {  
  8.       let hasPermission = checkArray(permission);  
  9.       if (!hasPermission) { // 沒有權限 移除Dom元素  
  10.         el.parentNode && el.parentNode.removeChild(el);  
  11.       }  
  12.     }  
  13.   }  
  14. }); 

最后我們在頁面中就可以通過自定義指令 v-permission來判斷: 

  1. <div class="btns">  
  2.    <button v-permission="'admin'">權限按鈕1</button>  // 會顯示  
  3.    <button v-permission="'visitor'">權限按鈕2</button> //無顯示  
  4.    <button v-permission="'editor'">權限按鈕3</button> // 會顯示  
  5.  </div> 

圖片

動態指令參數

Vue 2.6的最酷功能之一是可以將指令參數動態傳遞給組件。我們可以用方括號括起來的 JavaScript 表達式作為一個指令的參數: 

  1. <a v-bind:[attributeName]="url"> 這是個鏈接 </a> 

這里的 attributeName 會被作為一個 JavaScript 表達式進行動態求值,求得的值將會作為最終的參數來使用。同樣地,你可以使用動態參數為一個動態的事件名綁定處理函數: 

  1. <a v-on:[eventName]="doSomething"> 這是個鏈接 </a> 

接下來我們看個例子:假設你有一個按鈕,在某些情況下想監聽單擊事件,在某些情況下想監聽雙擊事件。這時動態指令參數派上用場: 

  1. <template>  
  2.   <div>  
  3.     <aButton @[someEvent]="handleSomeEvent()" />  
  4.   </div>  
  5. </template>  
  6. <script>  
  7. export default {  
  8.   data () {  
  9.     return {  
  10.       someEvent: someCondition ? "click" : "dbclick"  
  11.     }  
  12.   },  
  13.   methods: {  
  14.     handleSomeEvent () {  
  15.       // handle some event  
  16.     }  
  17.   }  
  18.  
  19. </script> 

過濾器讓數據處理更便利

Vue.js 允許你自定義過濾器,它的用法其實是很簡單,但是可能有些朋友沒有用過,接下來我們介紹下:

1.理解過濾器

  •  功能:對要顯示的數據進行特定格式化后再顯示。
  •  注意:過濾器并沒有改變原本的數據,需要對展現的數據進行包裝。
  •  使用場景:雙花括號插值和 v-bind 表達式 (后者從 2.1.0+ 開始支持)。

2.定義過濾器

可以在一個組件的選項中定義本地的過濾器: 

  1. filters: {  
  2.   capitalize: function (value) {  
  3.     if (!value) return ''  
  4.     valuevalue = value.toString()  
  5.     return value.charAt(0).toUpperCase() + value.slice(1)  
  6.   } 

也可以在創建 Vue 實例之前全局定義過濾器: 

  1. Vue.filter('capitalize', function (value) {  
  2.   if (!value) return ''  
  3.   valuevalue = value.toString()  
  4.   return value.charAt(0).toUpperCase() + value.slice(1)  
  5. }) 

3.使用過濾器

使用方法也簡單,即在雙花括號中使用管道符(pipeline) |隔開 

  1. <!-- 在雙花括號中 -->  
  2. <div>{{ myData| filterName}}</div>  
  3. <div>{{ myData| filterName(arg)}}</div>  
  4. <!-- 在 v-bind 中 -->  
  5. <div v-bind:id="rawId | formatId"></div> 

過濾器可以串聯: 

  1. {{ message | filterA | filterB }} 

在這個例子中,filterA 被定義為接收單個參數的過濾器函數,表達式 message 的值將作為參數傳入到函數中。然后繼續調用同樣被定義為接收單個參數的過濾器函數 filterB,將 filterA 的結果傳遞到 filterB 中。接下來我們看個如何使用過濾器格式化日期的例子: 

  1. <div>  
  2.    <h2>顯示格式化的日期時間</h2>  
  3.    <p>{{ date }}</p>  
  4.    <p>{{ date | filterDate }}</p>  
  5.    <p>年月日: {{ date | filterDate("YYYY-MM-DD") }}</p>  
  6. </div>  
  7. ......  
  8.  filters: {  
  9.    filterDate(value, format = "YYYY-MM-DD HH:mm:ss") {  
  10.      console.log(this)//undefined 過濾器沒有this指向的  
  11.      return moment(value).format(format);  
  12.    }  
  13.  },  
  14.  data() {  
  15.    return {  
  16.      date: new Date()  
  17.    };  
  18.  }  

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2017-03-06 18:35:22

VRAR應用

2023-07-16 22:37:46

JavaScript代碼任務

2024-03-14 17:41:25

AIGC人工智能應用

2022-07-28 15:46:08

Linux工具

2022-12-19 08:23:24

2024-06-17 10:24:21

2022-12-09 09:39:20

Vue3Vue2

2025-11-14 04:00:00

2021-06-30 09:56:24

MySQL數據庫索引

2023-08-10 08:16:41

Hash技術哈希表

2025-08-22 13:37:22

2022-02-28 23:37:16

iOS蘋果系統

2024-10-18 16:50:00

機器人特斯拉

2025-08-26 08:51:57

2022-04-02 21:36:23

iOS蘋果風格

2024-12-24 08:23:31

2009-08-06 09:37:09

Silverlight
點贊
收藏

51CTO技術棧公眾號

韩国v欧美v日本v亚洲v| 视频国产一区| 婷婷成人综合网| 免费99视频| 伊人网视频在线| 欧美黄色aaaa| 精品亚洲一区二区三区| 婷婷免费在线观看| 男人天堂亚洲天堂| 欧美国产激情二区三区| 成人午夜电影免费在线观看| 天堂网中文字幕| 婷婷综合久久| 精品亚洲一区二区三区在线播放| 99热一区二区| 色偷偷色偷偷色偷偷在线视频| 欧美激情中文字幕| 国产精品高清一区二区三区| 国产日韩在线免费观看| 激情91久久| 日韩一区二区在线视频| 特级西西人体4444xxxx| 高清久久精品| 在线观看日韩一区| 91精品国产91久久久久麻豆 主演| 大片免费播放在线视频| 成人视屏免费看| 国产主播在线一区| 无码人妻精品一区二区| 精品动漫3d一区二区三区免费| 最近2019好看的中文字幕免费 | 国产在线精品不卡| 日本精品性网站在线观看| 国产亚洲欧美精品久久久久久| 欧美精品色图| 亚洲男人第一网站| 熟女人妻在线视频| julia中文字幕一区二区99在线| 欧美人牲a欧美精品| 三级在线视频观看| 日韩欧美一区二区三区免费观看| 亚洲第一福利视频在线| 国产91在线亚洲| 91麻豆一二三四在线| 国产精品日韩成人| 神马欧美一区二区| 国产视频网址在线| 久久久久久久精| 久久人人九九| 日本亚洲一区| 久久午夜色播影院免费高清| 久久国产日韩欧美| 视频国产一区二区三区| 99久久婷婷国产综合精品电影 | 天天干天天操天天做| 午夜av成人| 一本到三区不卡视频| 欧美日韩激情视频在线观看| cao在线视频| 五月激情综合网| 国产成人无码精品久久久性色| 91九色国产在线播放| 亚洲第一成人在线| 亚洲欧洲日产国码无码久久99| 超碰在线cao| 欧美日韩精品在线视频| 337p粉嫩大胆噜噜噜鲁| 成人av三级| 在线一区二区三区四区五区| 中文字幕第80页| 四虎视频在线精品免费网址| 7777精品伊人久久久大香线蕉最新版| 五月天视频在线观看| 精品三级国产| 亚洲成人aaa| 亚洲狠狠婷婷综合久久久久图片| 蜜桃一区二区三区| 色婷婷综合久久久久| 日本黄色片免费观看| 欧美视频一区| 欧美在线播放视频| 精品国产www| 国产精品小仙女| 国产精品青青草| 奇米影视888狠狠狠777不卡| 久久久国产精品午夜一区ai换脸| 性欧美videosex高清少妇| 黄色一级大片在线免费看产| 亚洲精品国产无天堂网2021| 浮妇高潮喷白浆视频| 成人天堂yy6080亚洲高清| 欧美日韩视频在线观看一区二区三区 | 亚洲精品国产精品国自| 亚洲国产一成人久久精品| 欧美激情2020午夜免费观看| 综合网在线观看| 国产曰批免费观看久久久| 国产成人精品自拍| 高清中文字幕一区二区三区| 尤物av一区二区| 黑鬼大战白妞高潮喷白浆| 国产激情综合| 日韩精品视频在线免费观看| 日本理论中文字幕| 黄色亚洲免费| 国产精品夜间视频香蕉| 少妇高潮久久久| 1024成人网色www| 欧美性大战久久久久xxx| 一区二区三区日本视频| 亚洲欧美在线播放| 九九热这里有精品视频| 捆绑紧缚一区二区三区视频| 国产视频一区二区不卡| 黄色网在线免费看| 婷婷丁香久久五月婷婷| 日本黄色www| 成人一区二区| 久久99精品国产99久久6尤物| 欧美黄色一级大片| 成人丝袜视频网| 一级一片免费播放| 美女福利一区二区| 精品国产一区二区三区久久久蜜月 | 亚洲欧美黄色片| 国产精品九色蝌蚪自拍| 九色在线视频观看| 中文字幕一区二区三区中文字幕| 色偷偷88888欧美精品久久久| 久久久久女人精品毛片九一 | 国产成人精品福利一区二区三区| 免费a级在线播放| 在线欧美小视频| 蜜桃精品成人影片| 亚洲欧美久久久| 国产区欧美区日韩区| 在线中文字幕电影| 91精品国产色综合久久ai换脸| 超碰97av在线| 日韩电影免费在线观看网站| 免费看成人av| 男人av在线播放| 亚洲黄色成人网| www.av视频| 国产精品一区二区你懂的| 色中文字幕在线观看| 亚洲国产综合在线观看| 在线观看不卡av| 亚洲专区在线播放| 国产精品传媒在线| 亚洲色图欧美自拍| 欧美另类综合| 国产精品成人一区二区三区| 人人超在线公开视频| 精品美女被调教视频大全网站| 免费无遮挡无码永久在线观看视频 | 日本精品久久久| 亚洲人在线观看视频| 欧美小视频在线| 在哪里可以看毛片| 青青草97国产精品免费观看| 亚洲欧洲精品在线| 亚洲视频资源| 久久久久国色av免费观看性色 | 99视频有精品高清视频| 久色乳综合思思在线视频| 国产精品无码白浆高潮| 一二三四区精品视频| www.男人天堂| 久久尤物视频| 爱爱爱视频网站| 日本在线视频一区二区三区| 久久99久国产精品黄毛片入口| 日韩在线观看视频网站| 色狠狠桃花综合| fc2ppv在线播放| 福利91精品一区二区三区| 欧美成人三级在线视频| 欧美精品momsxxx| 成人午夜黄色影院| 国产蜜臀av在线播放| 亚洲男人第一网站| 国产麻豆免费视频| 婷婷夜色潮精品综合在线| 日本理论中文字幕| 国产成人在线影院| 成人精品小视频| 欧美 日韩 国产 一区| 久草精品电影| 四虎影视成人精品国库在线观看| 欧美极品少妇xxxxⅹ喷水| 国产三级电影在线| 欧美电影免费观看完整版| 久久精品五月天| 夜夜揉揉日日人人青青一国产精品 | 美女视频久久黄| 日韩电影免费| 欧美成人免费网站| 在线观看色网站| 午夜欧美大尺度福利影院在线看 | 欧美孕妇性xxxⅹ精品hd| 精品国产一区二区三区2021| 精品国产免费久久 | 伊人成综合网站| 久久天天躁狠狠躁夜夜躁| 男同在线观看| 亚洲第一天堂av| 国产精品人人妻人人爽| 色先锋aa成人| 国产无套在线观看| 亚洲人成精品久久久久久| 欧美黄色激情视频| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | www.色小姐com| 久久青草欧美一区二区三区| 性生活在线视频| 亚洲国产高清视频| 国产制服91一区二区三区制服| 欧美理论电影在线精品| 成人欧美一区二区三区黑人免费| 免费在线观看一区| 海角国产乱辈乱精品视频| 国产视频在线播放| 亚洲欧洲午夜一线一品| 精品人妻一区二区三区蜜桃| 欧美午夜视频网站| 东京热一区二区三区四区| 伊人一区二区三区| 四虎影视1304t| 91在线免费视频观看| 日韩精品在线播放视频| 日本不卡不码高清免费观看| www.av片| 亚洲私拍自拍| 亚洲激情免费视频| 青青草91久久久久久久久| 欧美婷婷久久| 欧美自拍一区| 国产精品一区二区a| 91精品福利观看| 成人网欧美在线视频| 国产美女久久| 国产日韩欧美中文在线播放| 筱崎爱全乳无删减在线观看| 韩国日本不卡在线| 国产夫妻在线| 欧美日韩调教| 国产在线精品日韩| 欧美精品中文| 国产精品国模大尺度私拍| 国产原创一区| 国产日韩av在线播放| 亚洲影视资源| 91系列在线播放| 亚洲国产综合在线观看| 亚洲最大福利网站| 欧美三级一区| av资源站久久亚洲| 深夜激情久久| 99久久一区三区四区免费| 香蕉成人app| 国产精品视频免费在线观看| 日韩黄色三级| 91精品视频免费观看| 祥仔av免费一区二区三区四区| 亚洲一区中文字幕| 亚洲1区在线| 国产精品成人一区二区三区| 欧美重口另类| 日本免费高清一区| 成人一区不卡| 亚洲精品电影在线一区| 欧美国产另类| 男女私大尺度视频| 国产精品久久777777毛茸茸| 国产福利影院在线观看| 麻豆精品视频在线观看免费| www.桃色.com| 久久丝袜美腿综合| 自拍偷拍第9页| 一区二区三区四区在线播放 | 欧美日韩一区二区三区在线免费观看| 日韩美女黄色片| 91豆麻精品91久久久久久| 在线观看国产黄| 欧美一区二区三区婷婷月色| 国产美女三级无套内谢| 日韩激情视频在线播放| 黄色在线网站| 久久精品久久久久| 在线亚洲人成| 国产免费久久av| 亚洲大奶少妇| 日韩av在线电影观看| 亚洲影视一区| 免费 成 人 黄 色| 国产麻豆一精品一av一免费| 影音先锋黄色资源| 中文字幕欧美激情| 国产美女激情视频| 337p亚洲精品色噜噜噜| 五月婷婷丁香六月| 久久综合色88| 欧美xo影院| 91pron在线| 91视频一区| 成人在线看视频| 国产精品一品二品| 手机av在线不卡| 午夜欧美视频在线观看| 国产尤物在线观看| 国产一区二区三区精品久久久 | 午夜精品久久久久久久96蜜桃| 国产婷婷97碰碰久久人人蜜臀| 在线观看男女av免费网址| 日本一区二区三区四区视频| 高清久久精品| 亚洲最新在线| 一区二区三区四区五区在线| 手机免费看av网站| 国产精品色婷婷| 青青青国产在线 | 精品一区在线| 久久精品国产sm调教网站演员 | 欧美一级片在线免费观看| 国产精品每日更新在线播放网址| 欧美一级高潮片| 91麻豆精品国产91久久久资源速度 | www.毛片com| 欧美无砖砖区免费| 黄色片免费在线| 91av在线国产| 中文字幕一区二区三区中文字幕 | 91亚洲一区精品| 久久国产亚洲| 欧美日韩怡红院| 成人美女在线视频| 日韩成人一区二区三区| 日韩精品一区二区三区蜜臀| 欧美成人性生活视频| 国产精品视频26uuu| 欧洲专线二区三区| www.亚洲视频.com| 国产黄色精品视频| 日韩欧美综合视频| 欧美zozozo| av免费在线观看网址| 成人精品视频在线| 影音先锋日韩在线| 最新av免费在线观看| 国产精品欧美一区二区三区| 曰批又黄又爽免费视频| 中文字幕欧美日韩| 免费高清视频在线一区| 伊人色综合影院| 老色鬼精品视频在线观看播放| 强制高潮抽搐sm调教高h| 欧美疯狂做受xxxx富婆| 在线h片观看| 精品久久久久久乱码天堂| 国产欧美激情| 国产小视频自拍| 欧美视频完全免费看| av在线电影网| 亚洲综合第一页| 中文字幕亚洲精品乱码| 久热在线视频观看| 一级精品视频在线观看宜春院 | 最近中文字幕在线mv视频在线 | 欧美日韩精品免费看| 久久久亚洲一区| 免费a在线观看播放| 欧美午夜视频一区二区| 撸视在线观看免费视频| 国产精品色婷婷视频| 天堂网在线观看国产精品| 成人欧美精品一区二区| 午夜久久电影网| 日韩成人影视| 97超级在线观看免费高清完整版电视剧| 欧美国产综合| 国产成人福利在线| 91精品在线免费观看| 国产成人l区| 欧美日韩精品久久| 狠狠色综合日日| 国内自拍视频在线播放| 这里精品视频免费| 精品中文字幕一区二区三区| 久久成人免费观看| 国产精品人人做人人爽人人添| 国产理论视频在线观看| 97激碰免费视频| 欧美午夜精彩| 日本xxxx免费| 亚洲3atv精品一区二区三区| 国产三区四区在线观看| 91原创国产| 日韩福利视频导航| 亚洲天堂一级片|