久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

解決vue單頁面多個組件嵌套監聽瀏覽器窗口變化問題

瀏覽:139日期:2022-12-22 09:35:36

需求

最近公司有個大屏展示項目(如下圖)

解決vue單頁面多個組件嵌套監聽瀏覽器窗口變化問題

頁面的元素需要做響應式監聽,圖表需要跟著窗口響應變化

問題

每一個圖表都被我寫成了一個組件,然后就在每一個組件里寫了一串代碼,監聽瀏覽器變化

結果只有父組件的代碼生效

mounted(){ window.onresize = () => { //當窗口發生改變時觸發 // };}

原因

經簡單測試后發現,同一個路由頁面只能注冊一次瀏覽器窗口監聽事件,第二次注冊的會覆蓋第一次注冊

下邊代碼即可測試

mounted(){ window.onresize = () => { //當窗口發生改變時觸發 console.log(1) }; window.onresize = () => { //當窗口發生改變時觸發 (會覆蓋上一個函數) console.log(2) };}

父子嵌套組件同理,子組件生命周期執行在父組件之前,父組件函數會覆蓋子組件函數

解決方案

1、只在父頁面寫個監聽,但是通過組件傳值的方式傳給子組件,并且子組件用watch監聽傳值的變化,響應改變

2、假如是多層組件嵌套,用vuex可能會更省力

補充知識:vue/組件嵌套/無限嵌套/嵌套組件消息傳遞/嵌套父子組件傳值

目前接到一個需求,是我之前從來沒有實踐過的,正好趁此機會做一個深度剖析,并記錄下這次的成長,并分享給大家。

需求文檔

一 、(一個廠商編號和一個版本號)唯一決定一個配置

二 、 配置內容支持無限嵌套

三、配置數據格式示例(配置包括項和模塊):

{ 'vendorId': 'IL03#sub_01', 'version': '9.0.0', 'config': { 'module-1': { 'property-1': 'value-1', 'property-2': 'value-2', 'property-3': 'value-3', 'module-1_1': { 'property-1_1': 'value-1_1', 'property-1_2': 'value-1_2', 'property-1_3': 'value-1_3' } }, 'module-2': { 'property-4': 'value-4', 'property-5': 'value-5' } }}

四、配置成果物如下:

解決vue單頁面多個組件嵌套監聽瀏覽器窗口變化問題

需求分解

一個簡單的嵌套組件:

<template> <div> <span>{{data.content}}<span> <div> <nested :data='data.child'></nested> <div> </div></template><script>export default { name: ’nested’, props: [’data’]}</script>

我們給最外層的組件(根嵌套組件)綁定形如

{ 'content': 'value', 'child': { 'content': 'value-1' 'child': { 'content': 'value-1_1' ...... } }}

的數據結構,就可以看見效果了,是不是和我們前面需求的數據結構很像?

開始動工

step1:最外層列表展示

這里作為靜態路由頁面展示即可(分頁、查詢、刪除功能在這里做)

<!-- 這里使用了EL-UI --><template> <!-- 應用配置入口 --> <div class='app-config-wrap'> <!-- 增 --> <div class='app-config-add'> <el-button type='primary' size='mini' @click='handleClickAdd'>新增配置</el-button> </div> <!-- 查 --> <div class='app-config-search'> <div @click='isShowFilter = !isShowFilter'> <span class='text'>查詢App配置</span> <span v-if='!isShowFilter'></span> <span v-else></span> </div> <div @click='handleClearAll' v-if='isShowFilter'> <span class='text'>清空條件</span> </div> <div v-show='isShowFilter'> <div class='by-vendorId'> <el-input type='text' size='mini' placeholder='按廠商編號查詢' clearable v-model.trim='vendorId'> </el-input> </div> <div class='by-version'> <el-input type='text' size='mini' placeholder='按版本號查詢' clearable v-model.trim='version'> </el-input> </div> <div class='search-button'> <el-button type='primary' size='mini' @click='handleClickSearch'>查 詢</el-button> </div> </div> </div> <div :style='tableHeight'> <el-table size='mini' :data='configList' stripe @row-click='handleClickRow' highlight-current-row style='width: 100%;'> <el-table-column type='index' label='No.' width='60'></el-table-column> <el-table-column prop='vendorId' label='廠商編號' :show-overflow-tooltip='true'></el-table-column> <el-table-column prop='version' label='版本號' :show-overflow-tooltip='true'></el-table-column> <el-table-column prop='operation' label='操作'> <template slot-scope='scope'> <!-- 刪 --> <el-button type='danger' size='mini' @click='handleClickDelete(scope.row.id)'>刪除配置</el-button> </template> </el-table-column> </el-table> </div> <el-pagination v-if='total' background small :current-page='pageNum' :page-sizes='[10, 20, 40, 60]' :page-size='pageSize' layout='total, sizes, prev, pager, next, jumper' :total='parseInt(total)' @current-change='changePageNo' @size-change='changePageSize'> </el-pagination> </div></template><script>export default { name: ’appConfig’, components: {}, props: [], data () { return { isShowFilter: false, vendorId: ’’, version: ’’, pageNum: 1, pageSize: 20, total: 0, configList: [{ // 假數據 id: 1, vendorId: ’cjm’, version: ’10.0.0’ }] } }, computed: { tableHeight () { return this.isShowFilter ? { height: ’calc(100% - 129px)’ } : { height: ’calc(100% - 90px)’ } } }, methods: { handleClearAll () { this.vendorId = ’’ this.version = ’’ }, handleClickSearch () { // 這里發送查詢請求 }, changePageNo (val) { // 這里發送分頁請求 this.pageNum = val }, changePageSize (val) { // 這里發送分頁請求 this.pageSize = val }, handleClickDelete (id) { // 這里發送刪除請求 }, handleClickAdd () { // 使用路由方式跳轉到配置頁面(增加配置和修改配置同一頁面即可) this.$router.push({ name: ’configData’, query: {} }) }, handleClickRow (row) { // 通過id讓配置頁面初始化時請求數據,在跳轉頁面中watch即可 this.$router.push({ name: ’configData’, query: { id: row.id } }) } }}</script>// 樣式我就不貼了,節省篇幅

step2:動態路由頁準備

由于配置頁面展示是根據廠商編號和版本號動態改變的,所以這里用到

this.$router.push({ name: ’configData’, query: { id: row.id }})

來實現動態路由頁面,這里也需要引入我們的根嵌套組件(嵌套入口)。

<template> <div class='config-data-warp'> <div class='config-head'> <span class='text'>廠商編號:</span> <el-input type='text' size='mini' placeholder='廠商編號' clearable v-model.trim='vendorId'> </el-input> </div> <div class='config-head'> <span class='text'>版本號:</span> <el-input type='text' size='mini' placeholder='版本號' clearable v-model.trim='version'> </el-input> </div> <div class='config-main'> <config-module :data='config' :root='true' :commit='commit' @commit='handlerCommit'></config-module> </div> <el-button type='primary' size='mini' @click='commit = true'>確認提交</el-button> </div></template><script>import configModule from ’./configModule’export default { name: ’configData’, components: {configModule}, data () { return { id: this.$route.id, commit: false, vendorId: ’’, version: ’’, config: {} // 這里放點假數據 } }, mounted () { // 如果id存在,就去請求數據 if (id) { ... } }, methods: { handlerCommit (data) { // 這里是匯總數據的地方,記下來,等下提到了好找 console.log(data) this.commit = false } }}</script>

值得注意的是,確認提交按鈕只是將commit變量置為true,而commit綁定在我們的嵌套組件中。

<div v-for='(value, index) in configJsonChildren' :key='index + ’child’ + moduleName'> <config-module :index='index' @change='changeChildName' @commit='handlerCommit' :commit='commit' :data='{key: value[0], child: value[1]}'></config-module></div>

這是嵌套組件的部分代碼,我們可以看到commit被原封不動的傳遞給了子嵌套組件,也就是說,這里的commit變量起到通知所有嵌套組件執行了提交動作,這也是父組件控制子組件組件的唯一方式——傳遞數據變化props(或者使用vuex也可以)。

這里還有一點,就是定義什么是嵌套部分,什么是嵌套外部分,顯然,廠商編號和版本號不屬于嵌套部分。

還有傳入的root變量,是為了控制根嵌套組件的名稱不可修改,所以傳個true就可以了。

step3:嵌套組件的實現(重點)

這里梳理一下嵌套組件需要提供的功能點:

1、能夠做到傳入數據的展示

2、能夠動態添加項和模塊

3,能夠將修改了的數據傳遞出去

傳入數據的展示

我們再回過頭看看后臺傳給我們的數據格式:

{ 'vendorId': 'IL03#sub_01', 'version': '9.0.0', 'config': { 'module-1': { 'property-1': 'value-1', 'property-2': 'value-2', 'property-3': 'value-3', 'module-1_1': { 'property-1_1': 'value-1_1', 'property-1_2': 'value-1_2', 'property-1_3': 'value-1_3' } }, 'module-2': { 'property-4': 'value-4', 'property-5': 'value-5' } }}

從中我們是否可以提煉出每個嵌套組件的數據格式?

module: { property-1: value-1, property-2: value-2, ...... module-1: { ...... }, mpdule-2: { ...... }, ......}

而且,我們需要這個對象的key和value是可以被雙向綁定的。

可是我們想一下,對象的key可以雙向綁定嗎?顯然不能!

這也就是說,原始傳入的數據結構并不能用,需要進行處理:

<template> <div class='config-module-warp'> <div class='config-head'> <!-- 根組件固定模塊名,或者說不需要模塊名 --> <span v-if='root'>配置:</span> <div v-else> <el-input type='text' size='mini' placeholder='模塊名' clearable v-model='moduleName' @change='changeModuleName'></el-input> </div> <el-button type='primary' size='mini' @click='handleClickAddProperty'>新增項</el-button> <el-button type='primary' size='mini' @click='handleClickAddModule'>新增模塊</el-button> <el-button v-if='root' type='danger' size='mini' @click='handleClickClear'>清空配置</el-button> <el-button v-else type='danger' size='mini' @click='handleClickDeleteModule'>刪除模塊</el-button> <div v-for='(value, index) in configJsonProperty' :key='index + ’property’'> <el-input type='text' size='mini' placeholder='key' clearable v-model='value[0]'></el-input> : <el-input type='text' size='mini' placeholder='value' clearable v-model='value[1]'></el-input> <el-button type='danger' size='mini' @click='handleClickDeleteProperty(index)'>刪除該項</el-button> </div> <div v-for='(value, index) in configJsonChildren' :key='index + ’child’'> <config-module :index='index' @change='changeChildName' @commit='handlerCommit' :commit='commit' :data='{key: value[0], child: value[1]}'></config-module> </div> </div></template>...data () { return { moduleName: ’’, // 綁定當前子模塊名 configJsonProperty: [], // 這里是子模塊的property configJsonChildren: [], // 這里是子模塊下的子模塊(?I模塊^-^) ... }}...mounted () { if (this.data && this.root) { // 由于根節點是沒有模塊名的,數據的解析結構是{key: moduleName, child: moduleValue},參上。 this.classify({child: this.data}) } else if (this.data) { this.classify(this.data) }}// 或者將引用根組件的地方改成下面這樣也可以:// <config-module :data='{child: config}' :root='true' :commit='commit'// @commit='handlerCommit'></config-module>// _____________________________________// mounted () {// if (this.data) {// this.classify(this.data)// }// }...classify (prop) { let data = prop.child this.moduleName = prop.key for (let key in data) { if (typeof data[key] === ’object’) { this.configJsonChildren.push([ // 這里將數組轉化為可以雙向綁定的二維數組 key, data[key] ]) } else { this.configJsonProperty.push([ key, data[key] ]) } }}

實現動態增加

只需要添加空項就行了,但由于模塊是由父組件傳入的,所以改變模塊名也需要同步改變父組件的模塊名,而這里就用到了props中的index,代表父組件中的位置。

handleClickAddProperty () {this.configJsonProperty.push([ ’’, ’’ ])},handleClickAddModule () { this.configJsonChildren.push([ ’’, {} ])},changeModuleName (value) { this.$emit(’change’, this.index, value)},changeChildName (index, name) { this.$set(this.configJsonChildren[index], 0, name)},

孿生兄弟:動態刪除

其實,增加數據和刪除數據無外乎就是,本地數據本地改,外部數據同步改:

handleClickClear () { // 如果本身就是空,就無需操作,防止誤操作,畢竟我挺討厭彈窗的 if (!this.configJsonProperty.length && !this.configJsonChildren.length) { return } // 敏感操作給個彈窗 this.$confirm(’確定清空所有配置?’, ’警告’, { confirmButtonText: ’確定’, cancelButtonText: ’取消’, type: ’warning’ }).then(() => { // 這個是本地觸發的哦! this.configJsonProperty = [] this.configJsonChildren = [] })},handleClickDeleteProperty (index) { // 本地數據本地改 this.configJsonProperty.splice(index, 1)},handleClickDeleteModule () { // 外部數據傳出改,由于是刪除操作,外部銷毀了會直接導致本地銷毀,本地無需再銷毀 // 和改模塊名不一樣 // 改模塊名時,雖然外部數據改變觸發了本地更新,但由于是push操作,并不會改變本地數據 this.$emit(’delete’, this.index)},deleteModule (index) { // 與handleClickDeleteProperty方法比較,一定要分清哪個是子組件觸發,哪個是父組件觸發 this.configJsonChildren.splice(index, 1)},

重中之重:提取這個樹結構中的數據

數據在各個子組件中保存,怎么把它們提取出來呢?

聰明的你肯定馬上想到了我之前所說的commit變量吧,它將這個動作分發到了各個子組件。

所以,只要每個子組件聽從命令,把數據層層上報,是不是就完成了呢?

這就好比是公司總經理想要開發一個軟件,他就只要告訴各個部門:

哎,你們軟件部負責做出軟件可行性方案;

你們市場部負責調查同類軟件和市場份額;

你們營銷部趕快出爐軟件推廣方案,等等。

然后部門總監給各項目經理發小人物,然后項目經理再分解任務成需求給你。

最后做完了,流程就是:你 -》經理-》總監-》總經理。

在我們這份代碼中,也是這樣子的:

第一步:你要知道任務來了:

watch: { commit (val) { if (val) { this.handleClickCommit() // 接到任務 } else { this.commitData = {} // 這里也標記一下 } }},

第一步:找到最底層的“你”,也就是找到這個樹組件的末梢節點,

它的標志是:

if (!this.configJsonChildren.length) { ...... } // 他沒有子節點了

d收集它的“工作成果”:

let obj = {}this.configJsonProperty.forEach(v => { if (v[0] && v[1]) { obj[v[0]] = v[1] } else { this.$emit(’error’) // 如果有項不完整,可以報錯 }})

你覺得上面代碼有沒有小問題?給你五秒想一想。

1

2

3

4

5

有沒有這樣一種情況?我們一不注意寫了兩個同樣鍵名的項,不管是寫到了錯的模塊里面還是怎樣。

那么在上面的代碼中,就會使得新值覆蓋舊值,就有可能導致嚴重的事故?。?!

所以我們改成:

handleClickCommit () { if (!this.configJsonChildren.length) { if (!this.moduleName && !this.root) { this.$emit(’error’) return } let obj = {} for (let v of this.configJsonProperty) { if (v[0] && v[1]) { if (obj.hasOwnProperty(v[0])) { this.$emit(’error’) // 啊,一不小心走神了 return } obj[v[0]] = v[1] } else { this.$emit(’error’) // 這里不需要return是因為不會造成嚴重后果,當然也可以加上 // 主要是我用這個功能時會一口氣添加好多項,也不一定全填滿,省得一個個刪。 } } this.$emit(’commit’, { // 把數據給經理!??!這個殺千刀的,天天催! key: this.moduleName, // 身份狗牌 value: obj }) }}

啊,工作終于提交了,再也不擔心了,接下來的事就交給經理去做吧!

經理:我手下管著這么多人,不可能來一個我上交一個吧?那就等他們全部上交了,我再整個打包上交吧。

首先第一步,我需要一個箱子來存他們的成果:

data () { return { moduleName: ’’, configJsonProperty: [], configJsonChildren: [], commitData: {} // 存放成果的箱子 }}

接下來就等他們上交了:

handlerCommit (data) { if (!this.moduleName && !this.root) { // 領導也要有名字,但總經理只有一個 this.$emit(’error’) return } this.commitData[data.key] = data.value // 先按人頭收下成果 for (let item of this.configJsonChildren) { if (!this.commitData.hasOwnProperty(item[0])) return // 如果沒收齊,繼續等待 } // 歐耶,收齊了 let obj = {} for (let v of this.configJsonProperty) { // 這個for循環可以封成一個函數的,畢竟寫了兩次 if (v[0] && v[1]) { if (obj.hasOwnProperty(v[0])) { this.$emit(’error’) return } obj[v[0]] = v[1] } else { this.$emit(’error’) } } this.$emit(’commit’, { key: this.moduleName, value: Object.assign(obj, this.commitData) // 領導自己的成果加上員工的成果 })}

還記得上面我讓你記下的地方嗎?

handlerCommit (data) { console.log(data) // 匯總數據,在這里可以發送給后臺了 this.commit = false // 任務完成標志}

watch: { commit (val) { if (val) { this.handleClickCommit() } else { this.commitData = {} // 初始化子組件 } }},

到這里,嵌套組件也大致完工了,貼全代碼:

<template> <div class='config-module-warp'> <div class='config-head'> <span v-if='root'>配置:</span> <div v-else> <el-input type='text' size='mini' placeholder='模塊名' clearable v-model='moduleName' @change='changeModuleName'></el-input> </div> <el-button type='primary' size='mini' @click='handleClickAddProperty'>新增項</el-button> <el-button type='primary' size='mini' @click='handleClickAddModule'>新增模塊</el-button> <el-button v-if='root' type='danger' size='mini' @click='handleClickClear'>清空配置</el-button> <el-button v-else type='danger' size='mini' @click='handleClickDeleteModule'>刪除模塊</el-button> </div> <div v-for='(value, index) in configJsonProperty' :key='index + ’property’'> <el-input type='text' size='mini' placeholder='key' clearable v-model='value[0]'></el-input> : <el-input type='text' size='mini' placeholder='value' clearable v-model='value[1]'></el-input> <el-button type='danger' size='mini' @click='handleClickDeleteProperty(index)'>刪除該項</el-button> </div> <div v-for='(value, index) in configJsonChildren' :key='index + ’child’'> <config-module :index='index' @change='changeChildName' @delete='deleteModule' @commit='handlerCommit' :commit='commit' :data='{key: value[0], child: value[1]}'></config-module> </div> </div></template><script>export default { name: ’configModule’, props: [’data’, ’root’, ’commit’, ’index’], data () { return { moduleName: ’’, configJsonProperty: [], configJsonChildren: [], commitData: {}, error: false } }, watch: { commit (val) { if (val) { this.handleClickCommit() } else { this.commitData = {} this.error = false } } }, computed: { }, mounted () { if (this.data) { this.classify(this.data) } }, methods: { classify (prop) { let data = prop.child this.moduleName = prop.key for (let key in data) { if (typeof data[key] === ’object’) { this.configJsonChildren.push([ key, data[key] ]) } else { this.configJsonProperty.push([ key, data[key] ]) } } }, handleClickAddProperty () { this.configJsonProperty.push([ ’’, ’’ ]) }, handleClickAddModule () { this.configJsonChildren.push([ ’’, {} ]) }, handleClickClear () { if (!this.configJsonProperty.length && !this.configJsonChildren.length) { return } this.$confirm(’確定清空所有配置?’, ’警告’, { confirmButtonText: ’確定’, cancelButtonText: ’取消’, type: ’warning’ }).then(() => { this.configJsonProperty = [] this.configJsonChildren = [] }) }, handleClickDeleteProperty (index) { this.configJsonProperty.splice(index, 1) }, handleClickDeleteModule () { this.$emit(’delete’, this.index) }, deleteModule (index) { this.configJsonChildren.splice(index, 1) }, changeModuleName (value) { this.$emit(’change’, this.index, value) }, changeChildName (index, name) { this.$set(this.configJsonChildren[index], 0, name) }, handleClickCommit () { if (!this.configJsonChildren.length) { if (!this.moduleName && !this.root) { this.$emit(’error’) return } let obj = {} for (let v of this.configJsonProperty) { if (v[0] && v[1]) { if (obj.hasOwnProperty(v[0])) { this.$emit(’error’) return } obj[v[0]] = v[1] } else { this.$emit(’error’) } } this.$emit(’commit’, { key: this.moduleName, value: obj }) } }, handlerCommit (data) { if (!this.moduleName && !this.root) { this.$emit(’error’) return } this.commitData[data.key] = data.value for (let item of this.configJsonChildren) { if (!this.commitData.hasOwnProperty(item[0])) return } let obj = {} for (let v of this.configJsonProperty) { if (v[0] && v[1]) { if (obj.hasOwnProperty(v[0])) { this.$emit(’error’) return } obj[v[0]] = v[1] } else { this.$emit(’error’) } } this.$emit(’commit’, { key: this.moduleName, value: Object.assign(obj, this.commitData) }) } }}</script>

總結

其實聰明的人根本就不需要我總結嘛,代碼是最好的語言

所以這里我提出一些我的不足和沒做完的部分,不過都是細枝末節啦:

第一個是錯誤的處理,我這邊沒有加上

第二個是模塊應該有折疊功能,不然配置多看著就眼花繚亂,

不過v-show的使用大家應該也是登峰造極了。

然后,大家有什么意見和建議都可以在下方反饋。

感謝大家看完這一篇長文,么么噠~希望能給大家一個參考,也希望大家多多支持好吧啦網

標簽: Vue
相關文章:
主站蜘蛛池模板: 不卡的一区二区 | 黄色片地址 | 日韩成人精品在线 | 国产福利电影一区 | 91aiai| 欧美日韩成人在线播放 | 国产女人免费看a级丨片 | 一级免费网站 | 一区在线观看视频 | 日韩一级免费在线观看 | 银杏成人影院在线观看 | 得得啪在线视频 | 9999国产精品 | 日韩一片 | 国产毛片在线 | 久久成人毛片 | 国产网站视频 | 国产乱码一区二区三区在线观看 | 一区在线看 | 日韩成人黄色 | 亚洲精品国产剧情久久9191 | 国产精品美女久久久久aⅴ国产馆 | 日韩精品一区二区在线观看 | 午夜免费看片 | 国产一区视频网站 | 久久99国产一区二区三区 | 日本精品视频在线播放 | 欧美一区二区三区电影 | 色免费视频 | 欧美日韩亚洲国产综合 | a级在线免费视频 | 国产浪潮av色综合久久超碰 | 97国产在线视频 | 国产婷婷在线视频 | 日本久久精品一区二区 | 久草日韩 | 亚洲视频中文字幕 | 国产成人免费视频网站视频社区 | 国产精品久久久久久久久久久久午夜片 | 国产麻豆乱码精品一区二区三区 | 日韩不卡一区二区 | 亚洲一区二区三区在线 | 国产激情偷乱视频一区二区三区 | 日韩精品一区二区三区中文字幕 | 国产特级毛片 | 亚洲欧美激情精品一区二区 | 成人午夜免费视频 | av2014天堂网| av在线播放网站 | 超碰一区 | 夜夜骚| 国产精品视频一区二区三区 | 亚洲欧洲一区二区 | 亚洲精品无 | 国产精品久久久久久久竹霞 | 国产精品一区二区精品 | 涩涩视频在线看 | 日韩一区二区三区在线观看 | av国产精品 | 99成人精品 | 国产精品日本一区二区不卡视频 | 成人激情在线 | 中文字幕精品一区久久久久 | 亚洲一区中文字幕在线 | 日产欧产va高清 | 一级片欧美 | 午夜婷婷丁香 | 国产一区二区三区免费 | 亚洲电影免费 | 亚洲精品国产电影 | 日韩一区电影 | 国产激情在线视频 | 超级碰在线视频 | 精品欧美一区二区在线观看 | 日韩中文字幕在线免费 | 免费av电影在线观看 | 成年人网站在线免费看 | 91视频免费网站 | 日韩视频在线不卡 | www.日韩视频 | julia一区二区三区中文字幕 | 久久久精品日本 | 韩日av在线| 国产美女www爽爽爽免费视频 | 久久久久久亚洲精品 | 久久99精品久久久久久琪琪 | 国产成人精品综合 | 国产亚洲一区二区三区在线观看 | 特黄色一级片 | 成人涩涩日本国产一区 | 久久丁香 | 欧美日韩视频在线播放 | av免费网站 | 99精品99| 国产精品成人国产乱一区 | 亚洲嫩草 | 久久久久国产一区二区三区四区 | 亚洲精品视频大全 | 久久91久久久久麻豆精品 | 中文字幕一区在线观看视频 | 黄色国产一级片 | 精品国产一区二区在线 | 欧洲精品在线视频 | 久久精品 | 国产v日产∨综合v精品视频 | 韩国精品主播一区二区在线观看 | 国产成人中文字幕 | 九九热这里都是精品 | 波多野结衣在线网址 | 香蕉久久久 | 99热精品在线 | 91视在线国内在线播放酒店 | 久久精品国产99久久久 | 免费毛片视频 | 国产亚洲女人久久久久毛片 | 成人在线一区二区 | 国产男人的天堂 | 欧美一区二区三区男人的天堂 | 欧美成人免费一级人片100 | 91原创国产| 91丁香| 亚洲在线视频 | av手机电影 | 精品国产精品三级精品av网址 | 中文字幕在线影院 | avsex国产| 日韩一区二区三区精品 | 日韩在线亚洲 | 国产大片aaa | 黄视频在线播放 | 黄网址在线观看 | 黄片毛片在线观看 | 亚洲第一免费看片 | 中文字幕一区二区三区乱码图片 | 99伊人 | 亚洲一区二区在线播放 | 久草日韩 | 黄色免费网站观看 | 国产成人高清精品免费5388 | 免费亚洲视频 | 成人在线免费视频 | 嫩草影院黄色 | 亚洲一区二区三区免费在线 | av一区二区三区四区 | a中文在线视频 | 久久精品在线 | 91看片网 | 亚洲欧美第一页 | 精品国产欧美一区二区三区成人 | 一级片免费视频 | 人人人艹 | 日本aa级毛片免费观看 | 久久午夜视频 | 国产精品久久久久久久免费大片 | 欧美日韩成人在线播放 | 日韩三级视频 | 欧美亚洲免费 | 午夜社区 | 91伊人| 日韩小视频在线播放 | 91麻豆精品国产91久久久更新资源速度超快 | 婷婷在线观看视频 | 久久久999精品视频 99国产精品久久久久久久 | 久久国产精品一区二区 | 久久视频免费在线 | 久久涩| 日韩精品久久 | 99精品全国免费观看视频软件 | 国产一区二区三区在线 | 亚洲人成在线观看 | 五月激情综合网 | 99国产精品久久久久久久 | 国产区第一页 | 操视频网站 | 欧洲精品一区 | 成人精品 | 国产成人高清在线 | 91婷婷射| 中文字幕高清视频 | 黄网免费 | 欧美日韩高清 | 美女黄网 | 久久久久国产视频 | 国产午夜精品一区二区三区嫩草 | 欧美久久久久久久 | 国产精品久久久久久久久久久久久 | 成人精品视频免费 | 亚洲免费在线视频 | 亚洲天堂成人在线 | 午夜精品亚洲日日做天天做 | 日本三级做a全过程在线观看 | 国产一级一级特黄女人精品毛片 | 一本色道久久综合狠狠躁篇的优点 | 欧美黄色一级毛片 | 成人精品久久久 | 久久久精品国产 | 亚洲精品一区二区三区 | 999精品视频 | 毛片毛片毛片毛片毛片毛片 | 成av在线 | 91精品久久久久久久久 | 精品伊人 | 少妇黄色一级片 | 欧美黄 片免费观看 | 看免费av | 中文字幕一页二页 | 日韩欧美理论片 | 国产1区2区精品 | 久久久久亚洲精品 | 国产精品成人在线观看 | 凹凸日日摸日日碰夜夜爽孕妇 | 色综合中文 | 欧美在线播放一区 | 在线一区观看 | 国产精品一区二区三区在线 | 日本天天操 | 中文字幕亚洲一区二区三区 | 日韩精品一区二区三区在线观看 | 91视频免费在线 | 亚洲国产91 | 国产精品久久久 | 在线a视频 | 羞羞视频网站 | 香港黄色录像片 | www.av7788.com | 亚洲视频在线免费观看 | 欧美成人区 | 伊人网在线视频免费观看 | 久久精品国产清自在天天线 | 日韩视频网站在线观看 | 欧美在线观看黄 | 国产精品久久久久国产精品 | 中文字幕在线免费视频 | 久久国产亚洲 | 99综合 | 久久亚洲一区二区 | 成人免费高清 | 婷婷在线免费视频 | 97精品一区| 久久精品99国产精品日本 | 国内精品久久久久久中文字幕 | 亚洲欧美日韩一区 | 一区二区影视 | 国产亚洲欧美在线 | 欧美精品综合在线 | 亚洲自啪| 久久99精品久久久水蜜桃 | 日韩在线大片 | 九九热re| 成人在线视频播放 | 久久av在线 | 精品久久久久一区二区国产 | 国产一级免费在线 | 欧美一区二区三区xxxx监狱 | 亚洲乱码国产乱码精品精 | 午夜三级在线 | 国产精品美女在线观看 | 色综合天天综合网国产成人网 | 日本手机在线视频 | 国产一区www | 日韩精品视频在线 | 欧美精品一区二区在线观看 | 亚洲一区中文字幕 | 国产欧美精品一区二区三区 | 在线成人亚洲 | 欧美亚洲国产一区 | 91精品国产综合久久久久久 | www天天干 | 美女一级a毛片免费观看97 | 日韩av中文在线 | 亚洲精品一区二区三区蜜桃下载 | 精品国产一区二区三区在线观看 | 久精品视频 | 亚洲一区二区三区中文字幕 | 日韩精品一区二区三区四区 | 有码在线 | 国产免费一区二区三区网站免费 | 精品一区久久 | 99re国产精品视频 | 日韩午夜激情 | 久久久久久久久一区二区三区 | 国内自拍偷拍视频 | 久久二区三区 | 538在线精品 | 日韩精品专区 | 国产精品久久久久久久久久大牛 | 91破解版在线 | 亚洲 | 黄色小视频在线免费观看 | 国产精品欧美日韩在线观看 | 日本一区二区三区免费观看 | 黄色一级毛片 | 99视频精品 | 亚洲欧美综合乱码精品成人网 | 免费看91 | 免费xxxxx在线观看网站软件 | 日本午夜网 | 亚洲一区二区三区四区的 | 国产精品美女视频免费观看软件 | 亚洲国产1区 | 六月综合激情 | 中文字幕一区二区三区四区 | 懂色中文一区二区在线播放 | 日韩成人av在线 | 久久亚洲二区 | 激情开心成人网 | 99久久夜色精品国产亚洲1000部 | 国产一区二区三区视频 | 韩日在线观看视频 | 国产精品免费久久 | 欧美一区二区三区视频 | 国产一区在线看 | 可以看的毛片网站 | 九九成人| 九九热在线观看 | 亚洲骚片 | 国内精品久久久久国产 | 日韩精品观看 | 欧美一级免费 | 视频1区 | 国产免费国产 | 欧美日韩中文在线 | 国家aaa的一级看片 h片在线看 | 激情一区| 欧美日韩亚洲三区 | 超碰人人在线 | 亚洲一区二区精品视频 | 一区免费看 | 欧美视频在线一区 | 91 在线 | 91精品国产综合久久久久久丝袜 | 97久久精品人人做人人爽50路 | 日韩欧美中字 | 视频一区二区三区在线播放 | 亚洲 成人 av | 日韩欧美视频一区 | www.国产欧美 | 亚洲一区精品在线 | 亚洲热在线视频 | www久久99 | 中文字幕亚洲一区二区三区 | 一区二区三区精品视频 | 在线免费观看激情视频 | 成人欧美一区二区三区黑人孕妇 | 亚洲成人免费视频在线观看 | 精品久久久久久久久久久久 | 色一情一乱一伦一区二区三区 | 99免费在线播放99久久免费 | 黄色国产精品 | 99久久婷婷国产综合精品电影 | 国产精品视频久久久 | 一区二区三区高清不卡 | 性色浪潮 | 精品国产乱码久久久久久密桃99 | 你懂的在线视频播放 | 国产视频亚洲精品 | 最新日韩在线观看视频 | 九九热在线免费视频 | 日韩精品视频在线观看一区二区 | 久久久久久国产精品美女 | 一区二区三区四区不卡视频 | 日批的视频 | 国产精品一区二区久久久久 | 午夜激情免费在线观看 | 国产欧美久久久久久 | 大陆一级毛片免费视频观看 | 亚洲电影在线观看 | 日韩一区二区在线播放 | 亚洲国产精品免费 | 久久国产精品电影 | 欧美白人做受xxxx视频 | 成全视频免费观看在线看黑人 | 一区二区三区视频 | 国产在线专区 | 午夜视频在线观看网站 | 五月婷婷综合久久 | 色天天综合久久久久综合片 | 精品亚洲一区二区三区在线观看 | 天天摸夜夜摸爽爽狠狠婷婷97 | 久久久久久久久综合 | 中文字幕免费看 | 一区二区三区在线视频播放 | 视频一区二区中文字幕 | 亚洲成人久久久 | 精国产品一区二区三区四季综 | 久久精品99| 色综合久| 国产视频一区二区 | 欧美日韩在线视频一区二区 | 亚洲成人一区二区 | 精品久久久久久久久久久下田 | 亚洲成人国产精品 | 亚洲一区二区中文字幕 | 欧美1区 | 国产一区二区久久 | 欧美成人免费视频 | 日韩综合一区 | 中文字幕高清视频 | 日韩一区欧美一区 | 免费观看a视频 | 一区二区蜜桃 | 国产在视频一区二区三区吞精 | 黑人性dh| 日韩爱爱视频 | 亚洲一区二区视频在线观看 | 亚洲二区视频 | 国产精品美女久久久久久久久久久 | 欧美激情五月 | 可以看的毛片网站 | 日韩免费在线视频 | 久久精品国产久精国产 | 欧美日韩一区不卡 | 成人精品鲁一区一区二区 | 在线久| 欧美日韩一区在线 | 亚洲啪啪网站 | 四虎欧美 | 自拍偷拍在线视频 | 刘亦菲的毛片 | 亚洲国产日韩a在线播放性色 | 国产激情在线视频 | 天天操导航 | 午夜精品久久久久久久久久久久 | 国产丝袜一区二区三区免费视频 | 欧美综合精品 | 99热欧美 | 国产99精品视频 | 天堂久久爱资源站www | 国产中文字幕一区 | 国产精品三级久久久久久电影 | 99精品亚洲 | 国产农村妇女精品一二区 | 精品1区 | 国产免费黄色 | 黄色天堂网| 精品一区二区在线观看 | 久久久国产精品入口麻豆 | 一区二区视屏 | 一区二区三区日本 | 中文字幕一区二区三区四区 | 久久精品99国产精品亚洲最刺激 | 国产精品欧美一区二区三区 | 理论片免费在线观看 | 国产精品久久久久久久久污网站 | 国产第一区二区 | 日韩成人片 | 97人人干| 久久99国产精品久久99大师 | 日韩欧美一区二区三区 | 成人毛片视频网站 | 国产偷录视频叫床高潮对白 | 久久亚洲一区 | 日韩免费视频中文字幕 | 免费一区二区三区 | 中国一级大黄大黄大色毛片 | 欧美色视频在线观看 | 能免费看av的网站 | 国产成人精品久久 | 青青久在线视频 | 黑人巨大精品欧美一区二区免费 | 久久叉| 欧美在线 | 一级毛片免费完整视频 | 欧美一级淫片免费视频黄 | 国产高清精品一区二区三区 | 成人精品网站在线观看 | 91资源在线 | 国产精品视频免费播放 | 在线欧美日韩 | 亚洲成人精品在线观看 | 91中文字幕 | 毛片一区二区 | 欧美日一级片 | 无码日韩精品一区二区免费 | 日韩在线视频观看 | 久久久精品一区 | 国产精品一区二区在线看 | 午夜爱视频 | 国产在线小视频 | 中文成人无字幕乱码精品 | 亚洲一区二区免费在线观看 | 久久久久久久中文 | 成人精品国产 | 国产福利91精品一区二区三区 | 狠狠躁日日躁夜夜躁东南亚 | 亚洲视频在线观看免费 | 国产免费自拍 | 国产精品一级 | 国产精品亚洲视频 | 在线视频亚洲 | 亚洲福利二区 | 色播久久 | 99re免费视频精品全部 | 国产成人精品一区二区在线 | 国产a级大片 | 99精品国产热久久91蜜凸 | 在线观看亚洲一区 | 一级大片免费观看 | 国产精品视频导航 | 欧美精品一区二区在线观看 | 色综合中文| 午夜欧美| 久久视频精品 | 91精品中文字幕一区二区三区 | 国产伦精品一区二区三区四区视频 | 日韩视频免费 | 狠狠操电影 | 亚洲在线一区二区 | 国产高清一区 | 欧美专区在线 | 久久综合久久综合久久综合 | 天天夜操 | 日韩手机专区 | 中文字幕国产日韩 | 亚洲最大av网站 | 免费一区二区三区视频在线 | 国产成人高清 | 色综合天天综合网国产成人网 | 成年人在线看 | 久久久日韩精品一区二区三区 | 中文字幕高清av | 一级片在线免费看 | 午夜网址 | 国产精品久久久久久久久 | 成人片免费看 | av男人电影天堂 | 95香蕉视频 | 精品成人 | 国产精品日韩精品 | 久久一精品 | 亚洲国产精品免费 | 午夜视频| 国产精品成人在线观看 | 高清国产一区二区三区四区五区 | 亚洲av毛片一级二级在线 | 欧美日韩一区二区三区在线观看 | 精品国产一区二区三区小蝌蚪 | 免费av一区二区三区 | 男女av在线 | 久久99精品国产.久久久久 | 中文字幕 国产精品 | 欧美涩涩网 | 日本妇人成熟免费视频 | 国产女人和拘做受在线视频 | 91视频黄色 | 国产日韩一区二区三区 | 国产精品无码久久久久 | 伊人激情网 | 夜夜夜操 | 日韩一区二区在线观看 | 91亚洲国产 | 日韩不卡| 欧美日韩三级在线 | 成人免费视频7777777 | 日韩精品一区二区三区中文在线 | 欧美午夜视频在线观看 | 国产成人福利 | 国产精品久久久久久福利一牛影视 | 在线成人av | 日本精品在线 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 欧美成人一区二区 | 亚洲一区二区三区四区五区中文 | 成人影| 人人干人人干人人 | 欧美一区不卡 | 成人免费高清视频 | www.44181com| 精品久久久久久久久久久久 | 国产成人一区 | 人人做人人澡人人爽欧美 | 奇米成人影视 | 天天夜夜操 | 国产精品美女久久久久久久久久久 | 青草福利 | 欧美综合激情 | 亚洲第一中文字幕 | 婷婷91| 精品欧美乱码久久久久久1区2区 | 天天操天天摸天天干 | 日韩色av| 在线 丝袜 欧美 日韩 制服 | 69黄在线看片免费视频 | 91久久精品日日躁夜夜躁国产 | 日韩免费在线观看视频 | 亚洲在线视频 | 欧美亚洲国产一区 | 古风h啪肉1v1摄政王 | 亚洲永久免费 | 奇米色欧美一区二区三区 | 国产精品中文字幕在线观看 | 精品久久香蕉国产线看观看亚洲 | 日韩成人 | 亚洲性人人天天夜夜摸 | 色一情一乱一伦一区二区三区 | 亚洲一区中文字幕 | 男女污污网站 | 玖玖精品 | 91精品国产福利在线观看 | 韩国av一区二区 | 午夜在线影院 | 亚洲欧美一区二区三区在线 | 国产精品九九九 | 久久青青| 国产精品视频在线观看 | 精品视频久久 | 国产免费看 | 特级生活片 | 一级电影免费看 | 91久久精品国产 | 伊人狠狠干 | 亚洲欧美日韩精品久久亚洲区 | 欧美视频在线一区 | 亚洲一区二区三区在线 | 久久福利| 91视频国产区 |