日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

通過vue.extend實現消息提示彈框的方法記錄

瀏覽:29日期:2022-10-12 10:33:24
前提回顧

在項目開發中我們經常使用的組件注冊分為兩種,一個是全局注冊和另一個是局部注冊,假設我們的業務場景是用戶在瀏覽注冊頁面時,點擊頁面中的注冊按鈕后,前端根據用戶的注冊信息先做一次簡單的驗證,并根據驗證彈出一個對應消息提示彈框我們拿到這個需求后,便開始著手準備要通過局部注冊消息彈框組件的方法來實現這個場景,在通過局部注冊消息彈框組件的方法解決完這個需求后,自然是沾沾自喜,緊接著又迎來了一個需求,該需求是用戶在點擊該注冊按鈕時,點擊幾次就要出現幾次這個消息彈框,你開始犯了難,并思考難道我要在頁面中提前插入n個組件標簽,不然我怎么知道用戶要點擊幾次注冊按鈕?

在你還沒有解決第二個需求的時候,又一個需求來了,第三個需求是不僅僅是注冊頁面需要用到這個消息彈框組件,在其他多個頁面中也需要用到這個消息彈框組件。

基于上述的業務需求,我們可以通過vue.extend編程式的使用組件,從而實現功能性的動態的消息提示彈框

局部注冊消息彈框組件

先通過局部注冊的方法來實現消息彈框組件

效果圖如下:

通過vue.extend實現消息提示彈框的方法記錄

構造目錄如下:

通過vue.extend實現消息提示彈框的方法記錄

’src/main.js’文件的代碼:

import Vue from ’vue’import App from ’./App.vue’//全局引入樣式文件import ’./assets/css.css’;Vue.config.productionTip = falsenew Vue({ render: h => h(App)}).$mount(’#app’)

’src/bus/bus.js’文件的代碼:

import vue from ’vue’;var bus=new vue()export default bus;

’src/App.vue’文件的代碼:

<template> <div id='app'> <button @click='handleShowMessage'>點擊出現彈框</button> <TMessage :offsetTop=’50’></TMessage> <TMessage :offsetTop=’100’></TMessage> <TMessage :offsetTop=’150’></TMessage> <!-- 我是不是得在這里埋下幾萬個消息彈框組件??? --> </div></template><script>import TMessage from ’./components/TMessage/TMessage.vue’;import bus from ’./bus/bus’;export default { name:’app’, data() { return { } }, components: { TMessage, }, methods: { handleShowMessage(){ //打印查看消息彈框的組件對象 console.log(TMessage); //點擊按鈕后出現消息彈框 bus.$emit(’showMessage’) } },}</script><style>#app { display: flex; justify-content: center;} #app button{ margin-top: 250px;}</style>

’src/components/TMessage/TMessage.vue’文件的代碼:

<template> <transition name='message-fade'> <div : : v-if='!closed' > <p class='message-content'>提示信息:{{message}}</p> <i class='icon icon-close'></i> </div> </transition></template><script> export default { name: ’TMessage’, data() { return { message: ’這是默認信息’, //彈框的提示內容 type: ’success’, //彈框的樣式 success、warning、error center: true, //彈框是否居中顯示 offset: 20, //彈框默認的偏移量 closed: true, //彈框默認隱藏 通過v-if='!closed'控制 duration: 1000, //彈框消失的時間 timer: null, //準備一個定時器 } }, mounted() { this.offset=this.offsetTop bus.$on(’showMessage’,()=>{ this.closed=false; this.timer = setTimeout(() => { //如果彈框是顯示狀態的話在duration后會變為隱藏狀態 if (!this.closed) { this.close(); } }, this.duration); }) }, props:[’offsetTop’], methods: { close() { this.closed = true; } } }</script>

寫到這里,我們實現的效果為(動圖如下):

通過vue.extend實現消息提示彈框的方法記錄

’src/assets/css.css’文件的代碼:

/*樣式重點解析:1.’message’2.’message-’ + type: 2.1:message-success 2.2:message-warning 2.3:message-error 3.’is-center’ //決定了彈框居中顯示4.’message-fade-enter’ //4和5決定了彈框的的過渡效果5.’message-fade-leave-active’6. .message {top:20px; //決定了彈框的偏移量}*/.message { min-width: 380px; -webkit-box-sizing: border-box; box-sizing: border-box; border-radius: 4px; border-width: 1px; border-style: solid; border-color: #EBEEF5; position: fixed; left: 50%; top: 20px; z-index: 999999999; transform: translateX(-50%); background-color: #edf2fc; transition: opacity .3s, transform .4s, top .4s; overflow: hidden; padding: 15px 15px 15px 20px; display: flex; align-items: center}.message.is-center { -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center}.message p { margin: 0}.message-info .message-content { color: #909399}.message-success { background-color: #f0f9eb; border-color: #e1f3d8}.message-success .message-content { color: #67C23A}.message-warning { background-color: #fdf6ec; border-color: #faecd8}.message-warning .message-content { color: #E6A23C}.message-error { background-color: #fef0f0; border-color: #fde2e2}.message-error .message-content { color: #F56C6C}.message-content { padding: 0; font-size: 14px; line-height: 1}.message-content:focus { outline-width: 0}.message .icon-close { position: absolute; top: 50%; right: 15px; -webkit-transform: translateY(-50%); transform: translateY(-50%); cursor: pointer; color: #C0C4CC; font-size: 16px}.message .icon-close:focus { outline-width: 0}.message .icon-close:hover { color: #909399}.message-fade-enter, .message-fade-leave-active { opacity: 0; transform: translate(-50%, -100%)}編程式的使用組件

上方在通過局部注冊消息彈框組件時體現的局限性:靈活性低、可復用性低、代碼觀感較差

緊接著我們就要使用vue.extend來實現消息提示彈框,做到編程式的使用組件

該構造目錄為:

通過vue.extend實現消息提示彈框的方法記錄

’src/App.vue’文件的代碼:

<template> <div id='app'> <button @click='handleShowMessage'>點擊出現彈框</button> </div></template><script>import Message from ’./components/TMessage/TMessage.js’;export default { name:’app’, data() { return { } }, methods: { handleShowMessage(){ /** * 每點擊一次按鈕就調用一次該工廠函數 * 每調用一次該工廠函數就創建一個彈框組件對象 */ return Message(’我好帥啊我好帥啊我好帥啊’) } },}</script><style>#app { display: flex; justify-content: center;} #app button{ margin-top: 250px;}</style>

’src/components/TMessage/TMessage.vue’文件的代碼:

<template> <transition name='message-fade'> <div : : v-if='!closed' > <p class='message-content'>提示信息:{{message}}</p> <i class='icon icon-close'></i> </div> </transition></template><script> export default { name: ’TMessage’, data() { return {message: ’這是默認信息’, //彈框的提示內容type: ’success’, //彈框的樣式 success、warning、errorcenter: true, //彈框是否居中顯示offset: 20, //彈框默認的偏移量closed: false, //彈框默認隱藏 通過v-if='!closed'控制duration: 1000, //彈框消失的時間timer: null, //準備一個定時器 } }, mounted() { /*為了方便演示先不讓彈框消失 this.timer = setTimeout(() => { //在規定的this.duration后該消息彈框消失 if (!this.closed) { this.close(); }}, this.duration); */ }, methods: { close() {this.closed = true; } } }</script>

’src/components/TMessage/TMessage.js’文件的代碼:

import Vue from ’vue’;import TMessage from './TMessage.vue';function Message(data) { data = data || {}; if (typeof data === ’string’) { data = { message: data } } const TMessageClass = Vue.extend(TMessage); //得到的是一個組件對象VueComponent實例 //new TMessageClass接收的是一個包含組件選項的對象 覆蓋 let instance = new TMessageClass({ data }); instance.$mount(); console.log(instance.$el,’現在才可以訪問$el’); /*instance.$el的打印結果如下: <div style='top: 20px;'> <p class='message-content'>提示信息:我好帥啊我好帥啊我好帥啊</p> <i class='icon icon-close'></i> </div> */ document.body.appendChild(instance.$el);}export default Message

寫到這里,我們來看一下效果,如下圖:

通過vue.extend實現消息提示彈框的方法記錄

通過vue.extend實現消息提示彈框的方法記錄

解決消息彈框覆蓋問題

我們已經做到了每點擊一次按鈕就出現一個消息彈框組件,但是因為定位的問題出現了相互覆蓋,所以得再接著去’TMessage.js’文件中去完善邏輯:

//file:’src/components/TMessage/TMessage.js’/*解決方法:通過維護一個隊列來存儲每一個消息彈框組件對象在每一次生成消息彈框組件時都需要重新計算其top值通過該隊列來計算上一個消息彈框組件對象的top值*/import Vue from ’vue’;import TMessage from './TMessage.vue';//裝有instance消息彈框組件對象的容器let instances = [];function Message(data) { data = data || {}; if (typeof data === ’string’) { data = { message: data } } data.onClose = function() { console.log(’onClose’); // 每消失一個消息彈框就會觸發一個onClose //instance是消息彈框組件的實例對象即VueComponent console.log(instance,’instance’);//每消失一個就得把在instances容器中對應的該組件對象給刪除掉 Message.close(instance); }; const TMessageClass = Vue.extend(TMessage); let instance = new TMessageClass({ data }); instance.$mount(); document.body.appendChild(instance.$el); //如果data數據中有設置偏移量則使用該偏移量 //否則使用默認的偏移量值20 let offset = data.offset || 20; //規定每一個消息彈框的間隔 //這里直接使用offset值做為間隔 let offsetTop = offset; /**思路如下: * let offsetTop=20; * [].forEach(()=>{offsetTop+=10}); * console.log(offsetTop) //還是20 * * [{a:’1’}].forEach(()=>{offsetTop+=10}); * console.log(offsetTop) //才是30 */ /*這里是在循環之后才去push 因為生成的第一個消息彈框是不需要計算offsetTop的 生成的第一個消息彈框直接使用offset值即可 */ //從第一個起instances里有值了(組件對象)以后再去循環計算offsetTop值 instances.forEach( item => { //根據上一個計算的offsetTop+自身的高度+規定的間隔 offsetTop += item.$el.offsetHeight + offset; }); //當前生成的消息彈框的高度為offsetTop //offsetTop是根據上一個生成的消息彈框的三個值計算得到的 //instances容器中第0個是不需要參與計算的即采用默認的offset值 instance.$el.style.top = offsetTop + ’px’; instances.push(instance);}Message.close = function(instance) { //每消失一個就得把在instances容器中對應的該組件對象給刪除掉 instances = instances.filter( item => item !== instance );};export default Message

’src/components/TMessage/TMessage.vue’文件的代碼:

//file:’src/components/TMessage/TMessage.vue’<template> <transition name='message-fade'> <div : : v-if='!closed' > <p class='message-content'>提示信息:{{message}}</p> <i class='icon icon-close'></i> </div> </transition></template><script> export default { name: ’TMessage’, data() { return {message: ’這是默認信息’, //彈框的提示內容type: ’success’, //彈框的樣式 success、warning、errorcenter: true, //彈框是否居中顯示offset: 20, //彈框默認的偏移量closed: false, //彈框默認隱藏 通過v-if='!closed'控制duration: 1000, //彈框消失的時間timer: null, //準備一個定時器,onClose: null //擴充一個功能 彈框消失后觸發 } }, mounted() { //在規定的this.duration后該消息彈框消失 //消息框消失后會觸發this.close()函數方法 this.timer = setTimeout(() => { if (!this.closed) { this.close(); }}, this.duration); }, methods: { close() {this.closed = true;//如果該組件可以接收到this.onClose方法則調用該方法//該方法是在該消息彈框消失的時候被觸發if (typeof this.onClose === ’function’) { this.onClose();} } } }</script>

寫到這里,我們來看一下效果,如下圖:

通過vue.extend實現消息提示彈框的方法記錄

優化消息彈框消失的效果

我們可以進一步的優化消息彈框消失的效果,效果圖如下:

通過vue.extend實現消息提示彈框的方法記錄

’src/components/TMessage/TMessage.vue’文件的代碼:

<template> <transition name='message-fade'> <div : : v-if='!closed' > <p class='message-content'>提示信息:{{message}}</p> <i class='icon icon-close'></i> </div> </transition></template><script> export default { name: ’TMessage’, data() { return {message: ’這是默認信息’, type: ’success’, center: true, offset: 20, closed: false, duration: 1000, timer: null,onClose: null //擴充一個功能 彈框消失后觸發 } }, mounted() { this.timer = setTimeout(() => { if (!this.closed) { this.close(); }}, this.duration); }, methods: { close() {this.closed = true;//當彈框消失時會調用this.onClose()該函數方法if (typeof this.onClose === ’function’) { this.onClose();} } } }</script>

’src/components/TMessage/TMessage.js’文件的代碼:

import Vue from ’vue’;import TMessage from './TMessage.vue';//裝有instance的容器let instances = [];function Message(data) { data = data || {}; if (typeof data === ’string’) { data = { message: data } } const TMessageClass = Vue.extend(TMessage); let instance = new TMessageClass({ data }); instance.$mount(); document.body.appendChild(instance.$el); data.onClose = function() { console.log(’onClose’); // 每消失一個彈框就會觸發一個onClose方法 Message.close(instance); }; //如果data數據中有設置偏移量則使用該偏移量 //否則使用默認的偏移量20 let offset = data.offset || 20; //規定每一個消息彈框的間隔 let offsetTop = offset; instances.forEach( item => { //上一個實例對象的offsetTop+自身的高度+規定的間隔 offsetTop += item.$el.offsetHeight + offset; }); instance.$el.style.top = offsetTop + ’px’; instances.push(instance);}Message.close = function(instance) { /* 每次彈窗關閉都會調用一次這個函數 * 獲取當前這個instance的高度 * 把這個instance后面的所有實例的top減去這個高度,再減去偏移 * */ let removeHeight = instance.$el.offsetHeight + instance.offset; //把傳遞進來的instance在容器instances中刪除 let index = instances.findIndex( item => item === instance ); instances = instances.filter( item => item !== instance ); //對應的消息彈框消失后在該消息彈框后面的消息彈框會依次出現頂上來的效果 //原理是找到對應的消息彈框在instances容器中的下標位置 //通過循環改變對應的消息彈框后面的所有消息彈框的高度 for (let i = index; i<instances.length; i++) { instances[i].$el.style.top = parseFloat(instances[i].$el.style.top) - removeHeight + ’px’; }};export default Message

’src/App.vue’文件的代碼:

<template> <div id='app'> <button @click='handleShowMessage'>點擊出現彈框</button> </div></template><script>import Message from ’./components/TMessage/TMessage.js’;export default { name:’app’, data() { return { } }, methods: { handleShowMessage(){ /** * 調用一次就創建一個彈框組件對象 */ return Message(’我好帥啊我好帥啊我好帥啊’) } },}</script><style>#app { display: flex; justify-content: center;} #app button{ margin-top: 250px;}</style>終極版實現版

我們在上方’src/App.vue’文件中是通過引入TMessage.js后再通過Message()的方式調用使用該組件的,還可以將調用方式掛載到Vue全局上,來看看怎么操作:

’src/main.js’文件的代碼

import Vue from ’vue’import App from ’./App.vue’import ’./assets/css.css’;import Message from ’../src/components/TMessage/TMessage’;Vue.config.productionTip = false//掛載到全局Vue.prototype.$message = Message;new Vue({ render: h => h(App)}).$mount(’#app’)

’src/App.vue’文件的代碼

<template> <div id='app'> <button @click='handleShowMessage'>點擊出現彈框</button> </div></template><script>export default { name:’app’, data() { return { } }, methods: { handleShowMessage(){ this.$message.error(’我好帥啊我好帥啊我好帥啊’) this.$message.success(’我好帥啊我好帥啊我好帥啊’) this.$message.info(’我好帥啊我好帥啊我好帥啊’) this.$message.warning(’我好帥啊我好帥啊我好帥啊’) } },}</script><style>#app { display: flex; justify-content: center;} #app button{ margin-top: 250px;}</style>

’src/components/TMessage/TMessage.vue’文件的代碼:

<template> <transition name='message-fade'> <div : : v-if='!closed' > <p class='message-content'>提示信息:{{message}}</p> <i class='icon icon-close'></i> </div> </transition></template><script> export default { name: ’TMessage’, data() { return {message: ’這是默認信息’, type: ’success’, center: true, offset: 20, closed: false, duration: 1000, timer: null,onClose: null //擴充一個功能 彈框消失后觸發 } }, mounted() { this.timer = setTimeout(() => { if (!this.closed) { this.close(); }}, this.duration); }, methods: { close() {this.closed = true;//當彈框消失時會調用this.onClose()該函數方法if (typeof this.onClose === ’function’) { this.onClose();} } } }</script>

’src/components/TMessage/TMessage.js’文件的代碼:

import Vue from ’vue’;import TMessage from './TMessage.vue';let instances = [];function Message(data) { data = data || {}; if (typeof data === ’string’) { data = { message: data } } data.onClose = function() { console.log(’onClose’); //instance是消息彈框組件的實例對象即VueComponent Message.close(instance); }; const TMessageClass = Vue.extend(TMessage); let instance = new TMessageClass({ data }); instance.$mount(); // console.log(instance.$el,’現在才可以訪問$el’); document.body.appendChild(instance.$el); let offset = data.offset || 20; //規定每一個消息彈框的間隔 let offsetTop = offset; //第一個彈框是不需要計算偏移量的 //從第一個以后再去循環 instances.forEach( item => { //上一個實例對象的offsetTop+自身的高度+規定的間隔 offsetTop += item.$el.offsetHeight + offset; }); instance.$el.style.top = offsetTop + ’px’; instances.push(instance);}Message.close = function(instance) { let removeHeight = instance.$el.offsetHeight + instance.offset; let index = instances.findIndex( item => item === instance ); instances = instances.filter( item => item !== instance ); for (let i = index; i<instances.length; i++) { instances[i].$el.style.top = parseFloat(instances[i].$el.style.top) - removeHeight + ’px’; }};[’info’, ’success’, ’error’, ’warning’].forEach( type => { Message[type] = function(data) { if (typeof data === ’string’) { data = {message: data } } data.type = type; //整合data后再次去調用Message() return Message(data); };} );// Message.error=function(data){// if (typeof data === ’string’) {// data = {// message: data// }// }// return Message({// ...data,// type:’error’// })// }export default Message

完結撒花,最后來看一下效果圖:

通過vue.extend實現消息提示彈框的方法記錄

總結

到此這篇關于通過vue.extend實現消息提示彈框的文章就介紹到這了,更多相關vue.extend實現消息提示彈框內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一级成人av| 国产一区久久| 97精品一区| 伊人精品久久| 欧美美女一区| 亚洲精品九九| 亚洲国产成人精品女人| 日韩高清电影一区| 日韩一区电影| 欧美1区二区| 亚洲欧美在线综合| 激情欧美国产欧美| 国产va在线视频| 久久99久久久精品欧美| 欧美日韩精品一本二本三本 | 热久久免费视频| 亚洲va在线| 久久精品一区二区不卡| 国产精品扒开腿做爽爽爽软件| 久久wwww| 毛片在线网站| 蜜桃国内精品久久久久软件9| 欧美日韩四区| 婷婷亚洲成人| 欧美91在线|欧美| 国产v综合v| 日韩一区精品视频| 欧美aaaaaa午夜精品| 欧美日韩尤物久久| 综合激情一区| 国产精品yjizz视频网| 不卡视频在线| 国产日韩欧美| 国产资源在线观看入口av| 99久久激情| 日韩av影院| 福利一区二区免费视频| 久久亚洲色图| 久久一区精品| 性欧美精品高清| 97精品国产| 亚洲精品极品| 日韩和的一区二在线| 日韩精品成人在线观看| av中文字幕在线观看第一页 | 日韩中文在线电影| 日韩激情综合| 久久激情中文| 国产乱码精品| 日韩中文字幕亚洲一区二区va在线| 免费在线观看一区| 亚洲欧美日韩视频二区| 日韩综合一区| 国产高清视频一区二区| 日韩在线一二三区| 国模 一区 二区 三区| 欧美成a人片免费观看久久五月天| 免费美女久久99| 狠狠色狠狠色综合日日tαg| 国产白浆在线免费观看| 午夜精品福利影院| 婷婷综合亚洲| 丝袜av一区| 成人精品亚洲| 欧美日韩中文字幕一区二区三区| 国产v日韩v欧美v| 麻豆视频一区| 免费一级欧美片在线观看网站| 亚洲影院天堂中文av色| 国产午夜精品一区二区三区欧美| 日本久久成人网| 91亚洲自偷观看高清| 国产不卡精品在线| 欧美丰满日韩| 激情中国色综合| 欧美国产日韩电影| 日本午夜精品久久久| 日本欧美一区| 日本aⅴ精品一区二区三区| 少妇精品久久久一区二区三区| 日本vs亚洲vs韩国一区三区二区| 国产一区二区中文| 丝袜诱惑制服诱惑色一区在线观看 | 久热综合在线亚洲精品| 免费不卡在线视频| 国产精品毛片aⅴ一区二区三区| 美女久久精品| 日本在线不卡视频一二三区| 久久黄色影视| 超碰超碰人人人人精品| 日本欧美在线看| 国产精品视频一区二区三区四蜜臂 | 青草综合视频| 国产精品一区二区精品| 久久青青视频| 日本欧洲一区二区| 精品深夜福利视频| 热久久免费视频| 久久的色偷偷| 99在线精品免费视频九九视| 中文字幕日韩亚洲| 欧美极品中文字幕| 欧美~级网站不卡| 国产精品网在线观看| japanese国产精品| 日韩国产欧美在线播放| 久久国产电影| 国产精品嫩草影院在线看| 欧洲亚洲一区二区三区| 日本精品国产| 99国产精品视频免费观看一公开 | 神马午夜在线视频| 国产日韩欧美中文在线| 久久成人亚洲| 欧洲av一区二区| 国产精品一页| 99在线观看免费视频精品观看| 欧美激情 亚洲a∨综合| 亚洲欧美在线综合| 人人香蕉久久| 国产精品任我爽爆在线播放 | 日韩一区二区三区精品| 久久国产亚洲| 免费亚洲婷婷| 久久国产麻豆精品| 亚洲一区二区三区无吗| 黄色免费成人| 日韩高清欧美| 国产黄大片在线观看| 国产精品一页| 国产精品伦一区二区| 日韩激情av在线| 日本a级不卡| 日韩av不卡在线观看| 国产一区视频在线观看免费| 99精品美女| 亚洲精品在线观看91| 亚洲h色精品| 亚洲激情久久| 国产毛片一区| 亚洲va久久久噜噜噜久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 夜久久久久久| 亚洲精品美女| 欧美激情 亚洲a∨综合| 国产一区二区三区不卡av| xxxxx性欧美特大| 成人午夜精品| 综合国产精品| 亚洲乱码视频| 久久久精品国产**网站| 麻豆mv在线观看| 午夜亚洲精品| 国产精品一页| 久久伦理在线| 日本免费一区二区视频| 国产精品久久久久9999高清| 国产福利91精品一区二区| 国产成人精品亚洲线观看| 日韩毛片视频| 亚洲激情婷婷| 日韩高清在线不卡| 成人在线视频免费| 亚洲激情精品| 蜜桃视频在线观看一区二区| 欧美一区在线观看视频| 国产成人久久精品一区二区三区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲精品97| 国产精品日韩精品中文字幕| 欧美激情另类| 亚洲激情国产| 另类综合日韩欧美亚洲| 国产福利91精品一区二区| 日韩和欧美一区二区三区| 成人欧美一区二区三区的电影| 一区在线视频观看| 嫩草伊人久久精品少妇av杨幂| 久久九九精品| 国产精品一区三区在线观看| 日韩不卡免费高清视频| 日韩动漫一区| 91久久视频| 91嫩草亚洲精品| 欧美一级网站| 久久午夜影视| 午夜欧美巨大性欧美巨大| 国产欧美三级| 国产一在线精品一区在线观看| 欧美片第1页综合| 美女被久久久| 免费欧美一区| 欧美xxxx中国| 福利一区视频| 国产精品视频一区二区三区综合 | 国产日产精品一区二区三区四区的观看方式| 成人精品天堂一区二区三区| 国产精品麻豆成人av电影艾秋| 亚洲欧洲日韩| 日本一区二区三区视频在线看|