精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

老牛影视av老牛影视av| 亚洲国产高清不卡| 羞羞在线观看视频| 97精品视频在线| 亚洲黄色毛片| 91麻豆精品在线| 亚洲一区二区高清视频| 欧美日韩亚洲精品内裤| 狠狠综合久久av一区二区| 美日韩精品视频免费看| 国产日韩亚洲欧美综合| 日本精品999| 欧美中日韩免费视频| 精品视频在线视频| 韩国v欧美v亚洲v日本v| 9l亚洲国产成人精品一区二三| 亚洲欧美日韩偷拍| 国产欧美 在线欧美| 久久精品99国产国产精| www在线观看播放免费视频日本| 欧美一区二区中文字幕| 成人一区在线看| 97国产精品久久久| 日韩精品综合在线| 69影院欧美专区视频| aa国产精品| 日韩精品福利| 自拍日韩亚洲一区在线| 亚洲精品丝袜日韩| 精品国内亚洲2022精品成人| av女人的天堂| 日本韩国在线不卡| 久久久不卡网国产精品二区| 日本va欧美va国产激情| 日韩有码在线观看| av动漫一区二区| 大桥未久在线播放| 日韩免费视频一区二区视频在线观看| 国产精品黄色av| 亚洲国产一区二区在线播放| 9国产精品午夜| 日韩中文字幕免费在线观看| 欧美日韩免费观看一区| 色久优优欧美色久优优| 久久久久.com| 伊人成人免费视频| 有码一区二区三区| 欧美色图国产精品| 国产成人三级一区二区在线观看一| 日本手机在线视频| 日韩中文字幕不卡视频| 中文字幕乱码亚洲精品一区| 综合久久成人| 国产情侣在线播放| 中文字幕一区二区三区人妻在线视频| 国产91在线播放| 欧美性猛交xxxx黑人交| 竹内纱里奈兽皇系列在线观看| 中文字幕国产传媒| 亚洲97在线观看| 中文字幕在线观看不卡视频| 亚州av一区| 精彩国产在线| 丝袜熟女一区二区三区| 91精品视频一区| 色老汉av一区二区三区| 久久国产人妖系列| 日韩福利影视| 中文字幕欧美在线观看| 中文字幕22页| 欧美精品第一页在线播放| 一区二区三区产品免费精品久久75| 99香蕉久久| 搞黄视频免费在线观看| 国产亚洲无码精品| 免费观看成人在线| 亚洲人av在线影院| 日韩黄色三级| 国产精品16p| 手机在线视频你懂的| 色婷婷**av毛片一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 秋霞一区二区三区| jizz18女人高潮| 国产精品成av人在线视午夜片| 一区二区三区在线视频免费| 狠狠入ady亚洲精品| 日韩一级二级| 亚洲伦理在线观看| 亚洲熟女毛茸茸| 少妇性l交大片| 久久这里精品国产99丫e6| 久久精品亚洲一区| 日韩电影免费一区| 黄色在线播放网站| 人妻无码一区二区三区免费| 五月天综合婷婷| 茄子视频成人在线| 精品国产免费人成在线观看| 播五月开心婷婷综合| 欧美电影一二区| 在线观看麻豆| 久草国产精品视频| 亚洲色图欧美日韩| 国产精品久久久久久av福利| 91国产成人在线| 99国产精品国产精品毛片| 亚洲国产成人精品女人| 精品三级久久| 91视频在线视频| 亚洲天堂成人av| 成人区一区二区| 国产传媒一区| 欧美中文字幕视频在线观看| 亚洲精品国偷自产在线99热| 久久亚洲二区| 97精品资源在线观看| 黄色网址在线免费观看| 中文字幕免费高清在线观看| 九九九视频在线观看| 欧美日韩理论片| 无码免费一区二区三区免费播放 | 一区二区三区在线电影| 四虎影院观看视频在线观看| 日本a在线观看| 一区二区三区国产好的精华液| 自拍偷拍一区二区三区| 99久久99久久精品国产片| 久久久久久久久国产精品| 亚洲男人天堂手机在线| 欧美日韩国产欧美日美国产精品| 国产欧美日韩视频一区二区| 国产一区不卡视频| 91亚洲国产高清| 国产精品一区二区三区美女| 91av一区| 久操视频在线免费观看| 白丝校花扒腿让我c| 久久久久久久久久网| 成人三级在线| 国产精品第三页| 69久久夜色精品国产69乱青草| 精品国产美女在线| 日韩亚洲欧美成人一区| 亚洲国产成人porn| 国产丝袜欧美中文另类| 91在线观看地址| 日韩欧美午夜| 成人精品影院| 国产精品超碰| 粉嫩久久久久久久极品| 欧美黄色激情视频| 日韩精品一区二区在线视频 | 久久久久久亚洲精品| 日韩hd视频在线观看| 亚洲18女电影在线观看| 亚洲另类色综合网站| 欧美精彩视频一区二区三区| 99精品一区二区| www.亚洲色图.com| 成年人网站91| thepron国产精品| 激情深爱一区二区| 国产麻豆视频精品| 香蕉视频一区| 精品乱子伦一区二区| 国产jzjzjz丝袜老师水多 | 日韩福利小视频| 国语对白一区二区| 国产高潮国产高潮久久久91| 久久免费看少妇高潮v片特黄| 亚洲第一黄色网址| 永久免费毛片在线观看| 精品自拍偷拍视频| 天天躁日日躁狠狠躁av麻豆男男 | 欧美日韩国产一区在线| 精品欧美aⅴ在线网站| 精久久久久久| 欧美精品密入口播放| 国产剧情在线观看一区| 亚洲视频分类| 欧美日韩国产探花| 日韩电影在线免费观看| 国产成人精品aa毛片| 91在线超碰| 欧亚一区二区| 欧美午夜寂寞| 欧美成人激情| 石原莉奈在线亚洲二区| 国产91精品一区二区麻豆亚洲| 97久久超碰精品国产| 亚洲男人天堂av| 91久久线看在观草草青青| 欧美精品欧美精品系列| 亚洲欧美精品一区二区| 久久在线视频在线| 国产精品久久久久久久久影视| 91九色蝌蚪嫩草| 亚洲人成网站在线播放2019| 欧美 激情 在线| 国产手机在线观看| 成人免费视频国产免费| 黄色片在线看| 日韩三级影视| 久久av网址| 精品一区二区综合| 国产精品国产精品国产专区不片| 欧美在线观看一二区| 精品无人区太爽高潮在线播放| 欧美一级在线亚洲天堂| 欧美在线视频二区| 蜜桃免费在线视频| 女人18毛片毛片毛片毛片区二| 中文字幕第315页| 日本福利在线| 成人福利免费在线观看| 欧美深夜福利| 99在线精品一区二区三区| 一本在线高清不卡dvd| 中文字幕欧美视频在线| 欧美绝品在线观看成人午夜影视| 国产一区二区三区欧美| 国产一区二区在线免费视频| 久草免费福利在线| 日韩亚洲欧美视频| 国产成人无码精品久久二区三| 一区二区精品视频在线观看| 免费看a在线观看| 国产精品对白| 九色综合狠狠综合久久| ...中文天堂在线一区| 日韩一二三四区| 国产精品99久久久久久久久 | 日韩**一区毛片| 亚洲福利国产精品| 久久国产视频网站| 日韩免费电影一区二区| 亚洲 欧美 日韩在线| 在线免费观看日韩视频| 色一区二区三区| 欧美色图麻豆| 国产精品高潮久久久久无| 亚洲欧洲视频在线| 精品久久久久久中文字幕动漫 | 亚洲第一在线综合在线| 亚洲国产精品狼友在线观看| 一卡二卡三卡在线| 欧美成人一二区| 视频一区二区国产| 欧洲精品一区二区| 欧美在线视频一区二区| 免费av手机在线观看| 国产无遮挡裸体免费视频| 久久不射影院| 亚洲午夜久久久久久尤物| 亚洲一区二区美女| 欧美俄罗斯乱妇| 久操网在线观看| 亚洲欧美在线视频免费| av激情在线| 黄色成人在线网站| 一区二区三区波多野结衣在线观看| 中文字幕亚洲在线| 久久最新免费视频| 国产午夜精品无码| 欧美日韩国产观看视频| 日本人妖一区二区| 欧美日韩二区三区| 欧美诱惑福利视频| 思思久久精品视频| 精品人妻伦一二三区久久| 日韩三级毛片| 国产精品传媒入口麻豆| 国语自产精品视频在免费| 无码aⅴ精品一区二区三区浪潮| 欧美特黄aaaaaa| 日本一区二区三区电影免费观看| aaa欧美日韩| 久久久国产精品亚洲一区| 美女在线免费视频| 国产91av在线播放| 日韩在线观看中文字幕| 国产精品每日更新在线播放网址| 久久色免费在线视频| 久久久久久久久久久久久久国产| www.香蕉视频| 99视频精品全部免费在线视频| 亚洲一区二区三区视频在线| 国产欧美日韩免费| 男人天堂av电影| av剧情在线观看| 国产精品系列在线观看| 日韩在线免费av| 手机在线看福利| 国产三级电影在线观看| 9色精品在线| 日韩精品视频在线免费观看| 日韩精品久久一区二区| 国产黄a三级三级三级| 国产精品传媒精东影业在线 | 精品一区二区三区在线播放视频| 亚洲美女激情视频| 黄色av网址在线播放| 亚洲av成人精品毛片| av成人天堂| 中文字幕在线不卡国产视频| 国产91色在线|| 亚洲一区二区乱码| av免费看在线| 国产一二精品视频| 久久精品视频在线观看| 四虎永久免费观看| 91色在线看| 国产美女在线观看一区| 久久久久久九九九| 成年人三级黄色片| 国产区美女在线| av日韩在线网站| 456国产精品| 伊人久久久久久久久久久久久久| 91精品国产色综合久久不卡粉嫩| 一色屋精品亚洲香蕉网站| 亚洲精品欧美日韩专区| 日韩欧美激情视频| 国产精品不卡| 亚洲精选一区二区| 日韩精品aaa| 69av成人| 亚洲美女精品一区| 国产一区二区黄色| 在线观看毛片视频| 99热免费精品| 久热精品视频在线免费观看| 国产伦精品一区二区三区妓女| 男女啪啪999亚洲精品| 动漫精品一区二区| 国产免费内射又粗又爽密桃视频| 久久精品国产亚洲a∨麻豆| 麻豆精品一区二区综合av| 欧美成人一二三| 成年人视频软件| 久久中文资源| 日韩三级.com| 精产国品一二三区| 99re久久| 欧美午夜精品久久久久久久| japanese在线播放| 成人在线影视| 中文乱码免费一区二区| 日韩欧美一区二区三区四区| 天天色综合久久| 99在线精品观看| 免费看国产精品一二区视频| 日本人妻熟妇久久久久久| av在线这里只有精品| 成人做爰66片免费看网站| av网站免费大全| 狠狠色伊人亚洲综合成人| 亚洲一区美女视频在线观看免费| 国产成人精品a视频| 国产精品综合在线视频| 91精品网站| 人妻偷人精品一区二区三区| www.亚洲人| 日韩精品av一区二区三区| 3d成人动漫在线| 中文字幕一区二区三区不卡在线| 精品一区二区成人免费视频| 视频免费一区| 国产精品视频yy9299一区| 精品视频一区在线| 午夜视频在线免费观看| 亚洲欧洲www| 玖玖精品在线视频| 欧美xxxhd| 精品国产免费视频| 波多野结衣先锋影音| 精品日韩一区| 欧美精品18videos性欧| 国产在线视频二区| 久久99国产精品免费| 激情小说综合网| 成人av福利| 91久久久免费一区二区| aaaa黄色片| 亚洲婷婷免费| 91牛牛免费视频| 国产色a在线| 欧美日韩综合视频| 无码精品一区二区三区在线播放| 日韩中文首页| 国产精品高清在线| 欧美色视频免费| 亚洲国产成人va在线观看天堂| 欧美体内she精高潮| 亚洲一本二本| 国产在线精品自拍| 免费在线观看黄| 日韩视频一区二区三区在线播放 | 人妻少妇精品久久|