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

10個Vue開發技巧

開發 前端
在組件中使用 $route 會使之與其對應路由形成高度耦合,從而使組件只能在某些特定的 URL 上使用,限制了其靈活性。

路由參數解耦

一般在組件內使用路由參數,大多數人會這樣做:

  1. export default { 
  2.     methods: { 
  3.         getParamsId() { 
  4.             return this.$route.params.id 
  5.         } 
  6.     } 

在組件中使用 $route 會使之與其對應路由形成高度耦合,從而使組件只能在某些特定的 URL 上使用,限制了其靈活性。

正確的做法是通過 props 解耦

  1. const router = new VueRouter({ 
  2.     routes: [{ 
  3.         path: '/user/:id', 
  4.         component: User, 
  5.         props: true 
  6.     }] 
  7. }) 

將路由的 props 屬性設置為 true 后,組件內可通過 props 接收到 params 參數

  1. export default { 
  2.     props: ['id'], 
  3.     methods: { 
  4.         getParamsId() { 
  5.             return this.id 
  6.         } 
  7.     } 

另外你還可以通過函數模式來返回 props

  1. const router = new VueRouter({ 
  2.     routes: [{ 
  3.         path: '/user/:id', 
  4.         component: User, 
  5.         props: (route) => ({ 
  6.             id: route.query.id 
  7.         }) 
  8.     }] 
  9. }) 

文檔:router.vuejs.org/zh/guide/es…

函數式組件

函數式組件是無狀態,它無法實例化,沒有任何的生命周期和方法。創建函數式組件也很簡單,只需要在模板添加 functional 聲明即可。一般適合只依賴于外部數據的變化而變化的組件,因其輕量,渲染性能也會有所提高。

組件需要的一切都是通過 context 參數傳遞。它是一個上下文對象,具體屬性查看文檔。這里 props 是一個包含所有綁定屬性的對象。

函數式組件:

  1. <template functional> 
  2.     <div class="list"> 
  3.         <div class="item" v-for="item in props.list" :key="item.id" @click="props.itemClick(item)"> 
  4.             <p>{{item.title}}</p> 
  5.             <p>{{item.content}}</p> 
  6.         </div> 
  7.     </div> 
  8. </template> 

父組件使用:

  1. <template> 
  2.     <div> 
  3.         <List :list="list" :itemClick="item => (currentItem = item)" /> 
  4.     </div> 
  5. </template> 
  1. import List from '@/components/List.vue' 
  2. export default { 
  3.     components: { 
  4.         List 
  5.     }, 
  6.     data() { 
  7.         return { 
  8.             list: [{ 
  9.                 title: 'title', 
  10.                 content: 'content' 
  11.             }], 
  12.             currentItem: '' 
  13.         } 
  14.     } 

文檔:cn.vuejs.org/v2/guide/re…

樣式穿透

在開發中修改第三方組件樣式是很常見,但由于 scoped 屬性的樣式隔離,可能需要去除 scoped 或是另起一個 style 。這些做法都會帶來副作用(組件樣式污染、不夠優雅),樣式穿透在css預處理器中使用才生效。

我們可以使用 >>> 或 /deep/ 解決這一問題:

  1. <style scoped> 
  2. 外層 >>> .el-checkbox { 
  3.   display: block; 
  4.   font-size: 26px; 
  5.  
  6.   .el-checkbox__label { 
  7.     font-size: 16px; 
  8.   } 
  9. </style> 
  1. <style scoped> 
  2. /deep/ .el-checkbox { 
  3.   display: block; 
  4.   font-size: 26px; 
  5.  
  6.   .el-checkbox__label { 
  7.     font-size: 16px; 
  8.   } 
  9. </style> 

watch高階使用

1. 立即執行

watch 是在監聽屬性改變時才會觸發,有些時候,我們希望在組件創建后 watch 能夠立即執行。

可能想到的的方法就是在 create 生命周期中調用一次,但這樣的寫法不優雅,或許我們可以使用這樣的方法:

  1. export default { 
  2.     data() { 
  3.         return { 
  4.             name: 'Joe' 
  5.         } 
  6.     }, 
  7.     watch: { 
  8.         name: { 
  9.             handler: 'sayName', 
  10.             immediate: true 
  11.         } 
  12.     }, 
  13.     methods: { 
  14.         sayName() { 
  15.             console.log(this.name) 
  16.         } 
  17.     } 

深度監聽在監聽對象時,對象內部的屬性被改變時無法觸發 watch ,我們可以為其設置深度監聽:

  1. export default { 
  2.     data: { 
  3.         studen: { 
  4.             name: 'Joe', 
  5.             skill: { 
  6.                 run: { 
  7.                     speed: 'fast' 
  8.                 } 
  9.             } 
  10.         } 
  11.     }, 
  12.     watch: { 
  13.         studen: { 
  14.             handler: 'sayName', 
  15.             deep: true 
  16.         } 
  17.     }, 
  18.     methods: { 
  19.         sayName() { 
  20.             console.log(this.studen) 
  21.         } 
  22.     } 

2. 觸發監聽

執行多個方法使用數組可以設置多項,形式包括字符串、函數、對象:

  1. export default { 
  2.     data: { 
  3.         name: 'Joe' 
  4.     }, 
  5.     watch: { 
  6.         name: [ 
  7.             'sayName1', 
  8.             function(newVal, oldVal) { 
  9.                 this.sayName2() 
  10.             }, 
  11.             { 
  12.                 handler: 'sayName3', 
  13.                 immaediate: true 
  14.             } 
  15.         ] 
  16.     }, 
  17.     methods: { 
  18.         sayName1() { 
  19.             console.log('sayName1==>', this.name) 
  20.         }, 
  21.         sayName2() { 
  22.             console.log('sayName2==>', this.name) 
  23.         }, 
  24.         sayName3() { 
  25.             console.log('sayName3==>', this.name) 
  26.         } 
  27.     } 

文檔:cn.vuejs.org/v2/api/#wat…

watch監聽多個變量

watch本身無法監聽多個變量。但我們可以將需要監聽的多個變量通過計算屬性返回對象,再監聽這個對象來實現“監聽多個變量”

  1. export default { 
  2.     data() { 
  3.         return { 
  4.             msg1: 'apple', 
  5.             msg2: 'banana' 
  6.         } 
  7.     }, 
  8.     compouted: { 
  9.         msgObj() { 
  10.             const { msg1, msg2 } = this 
  11.             return { 
  12.                 msg1, 
  13.                 msg2 
  14.             } 
  15.         } 
  16.     }, 
  17.     watch: { 
  18.         msgObj: { 
  19.             handler(newVal, oldVal) { 
  20.                 if (newVal.msg1 != oldVal.msg1) { 
  21.                     console.log('msg1 is change') 
  22.                 } 
  23.                 if (newVal.msg2 != oldVal.msg2) { 
  24.                     console.log('msg2 is change') 
  25.                 } 
  26.             }, 
  27.             deep: true 
  28.         } 
  29.     } 

事件參數$event

$event 是事件對象的特殊變量,在一些場景能給我們實現復雜功能提供更多可用的參數

1. 原生事件

在原生事件中表現和默認的事件對象相同:

  1. <template> 
  2.     <div> 
  3.         <input type="text" @input="inputHandler('hello', $event)" /> 
  4.     </div> 
  5. </template> 
  1. export default { 
  2.     methods: { 
  3.         inputHandler(msg, e) { 
  4.             console.log(e.target.value) 
  5.         } 
  6.     } 

2. 自定義事件

在自定義事件中表現為捕獲從子組件拋出的值

my-item.vue:

  1. export default { 
  2.     methods: { 
  3.         customEvent() { 
  4.             this.$emit('custom-event', 'some value') 
  5.         } 
  6.     } 
  7. 復制代碼 

App.vue:

  1. <template> 
  2.     <div> 
  3.         <my-item v-for="(item, index) in list" @custom-event="customEvent(index, $event)"> 
  4.             </my-list> 
  5.     </div> 
  6. </template> 
  1. export default { 
  2.     methods: { 
  3.         customEvent(index, e) { 
  4.             console.log(e) // 'some value' 
  5.         } 
  6.     } 

文檔:

  • cn.vuejs.org/v2/guide/ev…
  • cn.vuejs.org/v2/guide/co…

自定義組件雙向綁定

組件 model 選項:

允許一個自定義組件在使用 v-model 時定制 prop 和 event。默認情況下,一個組件上的 v-model 會把 value 用作 prop 且把 input 用作 event,但是一些輸入類型比如單選框和復選框按鈕可能想使用 value prop 來達到不同的目的。使用 model 選項可以回避這些情況產生的沖突。

input 默認作為雙向綁定的更新事件,通過 $emit 可以更新綁定的值

  1. <my-switch v-model="val"></my-switch> 
  1. export default { 
  2.     props: { 
  3.         value: { 
  4.             type: Boolean, 
  5.             default: false 
  6.         } 
  7.     }, 
  8.     methods: { 
  9.         switchChange(val) { 
  10.             this.$emit('input', val) 
  11.         } 
  12.     } 

修改組件的 model 選項,自定義綁定的變量和事件

  1. <my-switch v-model="num" value="some value"></my-switch> 
  1. export default { 
  2.     model: { 
  3.         prop: 'num', 
  4.         event: 'update' 
  5.     }, 
  6.     props: { 
  7.         value: { 
  8.             type: String, 
  9.             default: '' 
  10.         }, 
  11.         num: { 
  12.             type: Number, 
  13.             default: 0 
  14.         } 
  15.     }, 
  16.     methods: { 
  17.         numChange() { 
  18.             this.$emit('update', this.num++) 
  19.         } 
  20.     } 

文檔:cn.vuejs.org/v2/api/#mod…

監聽組件生命周期

通常我們監聽組件生命周期會使用 $emit ,父組件接收事件來進行通知

子組件:

  1. export default { 
  2.     mounted() { 
  3.         this.$emit('listenMounted') 
  4.     } 

父組件:

  1. <template> 
  2.     <div> 
  3.         <List @listenMounted="listenMounted" /> 
  4.     </div> 
  5. </template> 

其實還有一種簡潔的方法,使用 @hook 即可監聽組件生命周期,組件內無需做任何改變。同樣的, created 、 updated 等也可以使用此方法。

  1. <template> 
  2.     <List @hook:mounted="listenMounted" /> 
  3. </template> 

程序化的事件偵聽器

比如,在頁面掛載時定義計時器,需要在頁面銷毀時清除定時器。這看起來沒什么問題。但仔細一看 this.timer 唯一的作用只是為了能夠在 beforeDestroy 內取到計時器序號,除此之外沒有任何用處。

  1. export default { 
  2.     mounted() { 
  3.         this.timer = setInterval(() => { 
  4.             console.log(Date.now()) 
  5.         }, 1000) 
  6.     }, 
  7.     beforeDestroy() { 
  8.         clearInterval(this.timer) 
  9.     } 

如果可以的話最好只有生命周期鉤子可以訪問到它。這并不算嚴重的問題,但是它可以被視為雜物。

我們可以通過 $on 或 $once 監聽頁面生命周期銷毀來解決這個問題:

  1. export default { 
  2.     mounted() { 
  3.         this.creatInterval('hello') 
  4.         this.creatInterval('world') 
  5.     }, 
  6.     creatInterval(msg) { 
  7.         let timer = setInterval(() => { 
  8.             console.log(msg) 
  9.         }, 1000) 
  10.         this.$once('hook:beforeDestroy', function() { 
  11.             clearInterval(timer) 
  12.         }) 
  13.     } 

使用這個方法后,即使我們同時創建多個計時器,也不影響效果。因為它們會在頁面銷毀后程序化的自主清除。

文檔:cn.vuejs.org/v2/guide/co…

手動掛載組件

在一些需求中,手動掛載組件能夠讓我們實現起來更加優雅。比如一個彈窗組件,最理想的用法是通過命令式調用,就像 elementUI 的 this.$message 。而不是在模板中通過狀態切換,這種實現真的很糟糕。

先來個最簡單的例子:

  1. import Vue from 'vue' 
  2. import Message from './Message.vue' 
  3.  
  4. // 構造子類 
  5. let MessageConstructor = Vue.extend(Message) 
  6. // 實例化組件 
  7. let messageInstance = new MessageConstructor() 
  8. // $mount可以傳入選擇器字符串,表示掛載到該選擇器 
  9. // 如果不傳入選擇器,將渲染為文檔之外的的元素,你可以想象成 document.createElement()在內存中生成dom 
  10. messageInstance.$mount() 
  11. // messageInstance.$el獲取的是dom元素 
  12. document.body.appendChild(messageInstance.$el) 

下面實現一個簡易的 message 彈窗組件

Message/index.vue:

  1. <template> 
  2.     <div class="wrap"> 
  3.         <div class="message" :class="item.type" v-for="item in notices" :key="item._name"> 
  4.             <div class="content">{{item.content}}</div> 
  5.         </div> 
  6.     </div> 
  7. </template> 
  1. // 默認選項 
  2. const DefaultOptions = { 
  3.     duration: 1500, 
  4.     type: 'info', 
  5.     content: '這是一條提示信息!', 
  6. let mid = 0 
  7. export default { 
  8.     data() { 
  9.         return { 
  10.             notices: [] 
  11.         } 
  12.     }, 
  13.     methods: { 
  14.         add(notice = {}) { 
  15.             // name標識 用于移除彈窗 
  16.             let _name = this.getName() 
  17.             // 合并選項 
  18.             notice = Object.assign({ 
  19.                 _name 
  20.             }, DefaultOptions, notice) 
  21.  
  22.             this.notices.push(notice) 
  23.  
  24.             setTimeout(() => { 
  25.                 this.removeNotice(_name) 
  26.             }, notice.duration) 
  27.         }, 
  28.         getName() { 
  29.             return 'msg_' + (mid++) 
  30.         }, 
  31.         removeNotice(_name) { 
  32.             let index = this.notices.findIndex(item => item._name === _name) 
  33.             this.notices.splice(index, 1) 
  34.         } 
  35.     } 
  1. .wrap { 
  2.     position: fixed; 
  3.     top: 50px; 
  4.     left: 50%; 
  5.     display: flex; 
  6.     flex-direction: column; 
  7.     align-items: center; 
  8.     transform: translateX(-50%); 
  9.  
  10. .message { 
  11.     --borderWidth: 3px; 
  12.     min-width: 240px; 
  13.     max-width: 500px; 
  14.     margin-bottom: 10px; 
  15.     border-radius: 3px; 
  16.     box-shadow: 0 0 8px #ddd; 
  17.     overflow: hidden; 
  18.  
  19. .content { 
  20.     padding: 8px; 
  21.     line-height: 1.3; 
  22.  
  23. .message.info { 
  24.     border-left: var(--borderWidth) solid #909399; 
  25.     background: #F4F4F5; 
  26.  
  27. .message.success { 
  28.     border-left: var(--borderWidth) solid #67C23A; 
  29.     background: #F0F9EB; 
  30.  
  31. .message.error { 
  32.     border-left: var(--borderWidth) solid #F56C6C; 
  33.     background: #FEF0F0; 
  34.  
  35. .message.warning { 
  36.     border-left: var(--borderWidth) solid #E6A23C; 
  37.     background: #FDF6EC; 

Message/index.js:

  1. import Vue from 'vue' 
  2. import Index from './index.vue' 
  3.  
  4. let messageInstance = null 
  5. let MessageConstructor = Vue.extend(Index) 
  6.  
  7. let init = () => { 
  8.     messageInstance = new MessageConstructor() 
  9.     messageInstance.$mount() 
  10.     document.body.appendChild(messageInstance.$el) 
  11.  
  12. let caller = (options) => { 
  13.     if (!messageInstance) { 
  14.         init(options) 
  15.     } 
  16.     messageInstance.add(options) 
  17.  
  18. export default { 
  19.     // 返回 install 函數 用于 Vue.use 注冊 
  20.     install(vue) { 
  21.         vue.prototype.$message = caller 
  22.     } 

main.js:

  1. import Message from '@/components/Message/index.js' 
  2.  
  3. Vue.use(Message) 

使用:

  1. this.$message({ 
  2.     type: 'success', 
  3.     content: '成功信息提示', 
  4.     duration: 3000 
  5. }) 

文檔:cn.vuejs.org/v2/api/#vm-…

 

責任編輯:趙寧寧 來源: 前端工匠
相關推薦

2022-12-15 16:38:17

2020-03-31 09:47:04

Vue開發代碼

2015-07-27 09:36:09

storyboard

2020-06-07 16:16:01

Python開發工具

2017-11-06 14:33:54

Web開發服務器網絡

2020-06-10 10:30:48

Python 開發編程語言

2019-07-23 09:00:00

vuejavascript前端

2025-02-03 00:00:00

Vue.js組件緩存

2020-06-15 10:29:10

JavaScript開發 技巧

2014-08-20 10:02:54

GitGit能力

2020-04-14 09:26:43

開發工具Chrome

2025-01-06 08:57:19

Vue技巧

2019-02-25 15:15:44

Windows 10Windows技巧

2018-11-28 08:15:09

2011-07-07 10:21:56

2015-12-21 10:54:37

Docker云計算

2021-03-15 08:13:19

JavaScript開發代碼

2020-06-08 07:52:31

Python開發工具

2023-02-07 08:00:00

MySQL數據庫技巧

2014-07-29 13:55:10

程序員代碼
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕视频在线| 欧美亚日韩国产aⅴ精品中极品| 91大片在线观看| 日韩大片免费在线观看| 国产成人一区二区三区影院| 色婷婷av一区| 久久人妻无码一区二区| 欧美色18zzzzxxxxx| 日韩精品乱码免费| 九九九热精品免费视频观看网站| 国产 中文 字幕 日韩 在线| 日本一区二区电影| 一个色综合网站| 色综合电影网| 丁香六月色婷婷| 日韩成人精品在线| 欧美激情亚洲一区| 在线看片中文字幕| 国内毛片久久| 3d动漫精品啪啪| 国产1区2区在线| 黑人玩欧美人三根一起进| 久久综合九色综合97婷婷女人| 成人观看高清在线观看免费| 国产免费一区二区三区四区五区| 欧美日韩精品| 久久精品中文字幕一区| 在线国产视频一区| 牛牛影视久久网| 日韩你懂的电影在线观看| 欧美成人黄色网址| 亚洲黄色中文字幕| 亚洲成人av一区二区| a级网站在线观看| av资源种子在线观看| 91亚洲国产成人精品一区二区三| 99re在线观看视频| 一起草av在线| 久久精品国产久精国产| 人九九综合九九宗合| 国产在线一区视频| 国产精品s色| 欧美美最猛性xxxxxx| 四虎影视1304t| 精品日产免费二区日产免费二区| 亚洲欧美日韩国产中文| 久久人人妻人人人人妻性色av| 91蜜桃臀久久一区二区| 精品欧美一区二区久久| www.四虎精品| 这里视频有精品| 欧美成人精品福利| 69xxx免费视频| av日韩精品| 亚洲国产精品久久久久秋霞蜜臀 | 黄色一级片网址| 超碰免费在线观看| 国产精品免费人成网站| 色播亚洲视频在线观看| 成人激情电影在线看| 国产日产欧美一区二区视频| 五月天婷亚洲天综合网鲁鲁鲁| 国产h视频在线观看| 亚洲国产经典视频| 亚洲巨乳在线观看| 黄色在线免费| 夜夜操天天操亚洲| 青青草精品视频在线| 超碰在线99| 欧美日韩中文在线| 无码少妇一区二区三区芒果| 岛国精品在线| 欧美一级爆毛片| 精品国产乱码久久久久夜深人妻| 青青久久av| 亚洲香蕉成人av网站在线观看| 日韩视频在线观看免费视频| 国产精品不卡| 久久久久久国产精品| 国产污污视频在线观看| 日日嗨av一区二区三区四区| 国产在线精品播放| 亚洲av无码乱码在线观看性色| jlzzjlzz国产精品久久| 青娱乐一区二区| 久久99精品久久久久久野外| 亚洲成a人片在线不卡一二三区| 成人在线免费观看av| 另类中文字幕国产精品| 91精品国产高清一区二区三区蜜臀| 人妻 丝袜美腿 中文字幕| 亚洲人成网77777色在线播放| 一道本无吗dⅴd在线播放一区| 国产传媒免费在线观看| 精品成人一区| 国产又爽又黄的激情精品视频| 99er热精品视频| 精油按摩中文字幕久久| 国产亚洲欧美另类一区二区三区| 成人高清免费观看mv| 一区二区三区四区在线播放| 国产欧美高清在线| 动漫一区二区三区| 亚洲老头同性xxxxx| www日韩在线| 美日韩精品视频| 国产98在线|日韩| 成人全视频高清免费观看| 亚洲综合色自拍一区| 天堂av在线网站| 日韩中文字幕一区二区高清99| 亚洲偷熟乱区亚洲香蕉av| 欧美久久久久久久久久久久| 免费高清成人在线| 久久精品国产精品青草色艺| 在线观看免费视频你懂的| 欧美性一区二区| 国产精品嫩草av| 午夜国产欧美理论在线播放| 国产精品久久久久久久久粉嫩av| 搡老岳熟女国产熟妇| 亚洲日本一区二区| 亚洲成人av免费看| 亚洲亚洲免费| 国内精品久久影院| www.香蕉视频| 亚洲欧美自拍偷拍色图| 亚洲第一中文av| 精品午夜久久| 国产成人极品视频| 三级理论午夜在线观看| 亚洲成av人片一区二区三区| 日本人妻一区二区三区| 天堂网在线观看国产精品| 国产精品久久久久77777| 五月婷婷深深爱| 亚洲午夜久久久久中文字幕久| 香蕉视频色在线观看| 国产高清一区| 91嫩草在线视频| 国产不卡在线| 欧美一二区视频| 内射一区二区三区| 国产在线精品一区二区夜色| 天堂v在线视频| 日本在线一区二区| 久久精品国产欧美激情| 91theporn国产在线观看| 欧美激情中文字幕| 欧美成人三级在线播放| 日韩三级在线| 91免费的视频在线播放| 精品麻豆一区二区三区| 欧美一区二区三区四区在线观看| 国产老头老太做爰视频| 国产在线视频不卡二| 手机在线视频你懂的| 国产精品日本一区二区三区在线| 久久精品久久久久久国产 免费| 国产精品欧美激情在线| 亚洲美女免费在线| xxxwww国产| 麻豆久久精品| 一区二区三区的久久的视频| 国产精品久久久久久av公交车| 久热在线中文字幕色999舞| 精品人妻少妇AV无码专区| 亚洲午夜私人影院| 成人免费av片| 久久精品国产亚洲高清剧情介绍| 日本丰满大乳奶| 成人盗摄视频| 国产精品1234| 国产黄网站在线观看| 日韩一区二区在线看| 日本三级视频在线| 久久久久国产一区二区三区四区| 日本男人操女人| 亚洲色图国产| 久久精品欧美| 青青在线精品| 久久久久久久久久久网站| 性xxxx视频播放免费| 欧美午夜精品一区二区三区 | 婷婷激情综合网| brazzers精品成人一区| 精品一区二区成人精品| 99色这里只有精品| 精品国产91| 丁香婷婷久久久综合精品国产| 暖暖成人免费视频| 久久中文久久字幕| 日本一区高清| 日韩欧美国产三级电影视频| 久久夜色精品国产噜噜亚洲av| 亚洲欧洲日韩在线| 97人妻天天摸天天爽天天| 蜜桃视频一区二区| 2018国产在线| 久久久久美女| 日产精品久久久一区二区| 在线视频亚洲欧美中文| 国产欧美婷婷中文| 超碰91在线观看| 欧美久久精品午夜青青大伊人| 欧洲一区av| 精品剧情在线观看| 一区二区三区免费在线视频| 亚洲第一在线综合网站| 精品女人久久久| 久久久91精品国产一区二区三区| 97人人模人人爽人人澡| 日本怡春院一区二区| 男女激情免费视频| 小说区亚洲自拍另类图片专区| 欧美极品一区| 韩国女主播一区二区三区| 91九色精品视频| 99热播精品免费| 欧美一区二区三区……| 成人免费高清观看| 久久福利视频导航| 麻豆av在线导航| 永久免费精品影视网站| 欧美美女色图| 日韩成人在线视频| 国产成人无码www免费视频播放| 欧美高清视频一二三区| 最新国产中文字幕| 欧美性xxxxx极品娇小| 日韩污视频在线观看| 一区二区三区视频在线看| 极品尤物一区二区| 欧美国产日韩在线观看| 三上悠亚影音先锋| 久久久午夜精品| 91网站免费视频| 久久一二三国产| 中文字幕狠狠干| 91视频国产资源| 污污内射在线观看一区二区少妇| 成人免费毛片嘿嘿连载视频| 国产精品嫩草69影院| 精品在线你懂的| 992tv人人草| 国产精品69久久久久水密桃| 99视频在线观看视频| 久久99久久久欧美国产| 狠狠操狠狠干视频| 国内精品视频一区二区三区八戒| 国产欧美一区二| 韩国视频一区二区| 亚洲视频在线不卡| 国产69精品久久777的优势| 日本一区二区免费视频| 成人精品视频.| 日本xxxx裸体xxxx| 国产亚洲精品aa| 日韩女同一区二区三区 | 一区二区三区我不卡| 日韩情爱电影在线观看| 懂色av一区二区三区四区五区| 亚洲国产精品久久久天堂 | 国产精品伊人日日| 丝袜连裤袜欧美激情日韩| 欧美精品成人一区二区在线观看| 国产一区国产二区国产三区| 亚洲成人网上| 你懂的国产精品永久在线| 天堂8在线天堂资源bt| 国产深夜精品| 天天爽人人爽夜夜爽| 国产酒店精品激情| 亚洲精品在线视频免费观看| 欧美国产一区视频在线观看| 欧美特黄一级片| 亚洲444eee在线观看| 日本一区二区三区久久| 91精品国产综合久久久久久 | 中文字幕欧美精品日韩中文字幕| 日韩专区在线| 海角国产乱辈乱精品视频| 日本不卡一二三| 亚洲一区二区三区乱码aⅴ蜜桃女| 大桥未久女教师av一区二区| 日本一区免费| 欧美日韩一视频区二区| 国产精品动漫网站| 国产一区二区三区免费看| 青青草视频播放| 亚洲情趣在线观看| 国产午夜在线播放| 在线电影院国产精品| 亚洲色图欧美视频| 久久亚洲私人国产精品va| 黄色软件视频在线观看| 91精品国产综合久久男男 | 亚洲一区二区三区午夜| 亚洲大片av| 久久久久久久久久久久久久久国产| 波多野结衣一区二区三区| 91视频最新网址| 欧美日韩美女在线观看| 99久久亚洲精品日本无码| 精品呦交小u女在线| av毛片在线播放| 国产精品pans私拍| 国内视频在线精品| mm131午夜| 蜜臀99久久精品久久久久久软件| 国产又粗又猛又色| 亚洲精品视频在线| 中文字幕乱码视频| 亚洲精品综合精品自拍| 色爱综合区网| 成人做爰www免费看视频网站| 自拍亚洲一区| 免费看一级大黄情大片| 国产成a人亚洲| 日韩在线不卡av| 欧美三级三级三级爽爽爽| 亚洲三级黄色片| 97**国产露脸精品国产| 日韩中文字幕一区二区高清99| 一区二区高清视频| 日韩**一区毛片| www.自拍偷拍| 欧美丝袜一区二区| 日本免费不卡视频| 欧美激情视频给我| 人人爱人人干婷婷丁香亚洲| 一区二区三区四区不卡| 免费观看在线色综合| japanese中文字幕| 欧美日韩中国免费专区在线看| 亚洲三级黄色片| 26uuu亚洲伊人春色| 美女扒开腿让男人桶爽久久动漫| 亚洲精品久久久久久久蜜桃臀| 国产福利精品一区二区| 中文字幕av久久爽av| 欧美一区二区三区在线视频| 国产一区久久精品| 91视频九色网站| 中文字幕人成人乱码| 香蕉网在线视频| 夜色激情一区二区| 老熟妇高潮一区二区高清视频| 高清欧美性猛交| 秋霞综合在线视频| 欧美极品欧美精品欧美图片| 久久亚洲精精品中文字幕早川悠里| 国产一级精品视频| 亚洲精品自在久久| 欧美性片在线观看| 亚洲一区二区三区精品在线观看 | 影音先锋一区| 黄色av网址在线观看| 精品日韩美女的视频高清| 视频国产一区二区三区| 茄子视频成人在线| 激情婷婷综合| av中文字幕网址| 一区二区国产盗摄色噜噜| 丰满人妻av一区二区三区| 午夜精品在线视频| 国模吧精品视频| 在线一区二区不卡| 亚洲综合免费观看高清完整版| 女人18毛片一区二区三区| 日本91av在线播放| 日韩一区二区中文| 欧美图片自拍偷拍| 色婷婷久久综合| 精品麻豆一区二区三区| 国产亚洲自拍偷拍| 日本亚洲最大的色成网站www| 欧美激情精品久久久久久免费 | 性色av蜜臀av浪潮av老女人 | 欧美精品xxx| 自拍亚洲一区| 爱情岛论坛亚洲自拍| 欧美日韩国产在线看| av每日在线更新| 国产精华一区二区三区| 视频在线观看91| 日韩精品一区二区亚洲av性色| 日韩av影视综合网| 青青伊人久久| 丰满爆乳一区二区三区| 国产精品欧美一区二区三区| 成人毛片视频免费看| 国产精品久久久久久久久久尿 | 那种视频在线观看| ...xxx性欧美| 国产一区二区三区福利| 丁香五月网久久综合| 久久国产精品99久久人人澡| 西西44rtwww国产精品| 久久亚洲一区二区三区四区五区高|