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

您的位置:首頁技術(shù)文章
文章詳情頁

vue實現(xiàn)點擊出現(xiàn)操作彈出框的示例

瀏覽:26日期:2022-11-06 08:23:19

vue實現(xiàn)點擊出現(xiàn)操作彈出框的示例

如上圖所示,這次要實現(xiàn)一個點擊出現(xiàn)操作彈框的效果;并將這個功能封裝成一個函數(shù),便于在項目的多個地方使用。

具體思路是:

封裝一個組件,組件保護一個插槽,我們可以根據(jù)不同的場景,利用插槽隨意在這個彈框里插入任何元素,這個彈框顯示時根據(jù)我鼠標(biāo)的點擊位置,定位彈窗的位置,并在組件里面監(jiān)聽鼠標(biāo)抬起事件,觸發(fā)事件時將彈窗隱藏;

接著在函數(shù)中利用createElement和appendChild方法將彈出框創(chuàng)建并插入到頁面中;

  本次實現(xiàn)基于vuecli3

接下來,具體實現(xiàn):

首先,我們先寫一個demo組件

  在點擊出現(xiàn)彈出框的元素上把事件對象數(shù)據(jù)傳遞一下,以便獲取點擊時鼠標(biāo)的數(shù)據(jù),以此確定彈出框的位置

// 文件路徑參考: src > views > demo> index.vue<template> <div class='demo-wrapper'> <div class='demo-div'> <span>更多功能</span> <i @click.stop=’showMenu($event)’></i> // 為了獲取鼠標(biāo)位置,這里把事件對象數(shù)據(jù)傳遞一下 </div> </div></template><script lang='ts'> import { Vue, Component, Prop, Watch} from 'vue-property-decorator'; @Component({ }) export default class articleView extends Vue { showMenu($event:any){ // 點擊時出現(xiàn)彈出框 } };</script>

接著,我們把彈出框里面的組件也寫一下

組件隨便命名為ActionList,組件里面把把列表數(shù)據(jù)及點擊事件都基于父組件傳遞的值而定,由于只是小demo,所以我們傳遞的menu數(shù)據(jù)數(shù)組只是簡單的字符串?dāng)?shù)組

// 文件路徑參考: src > components > ActionList > index.vue<template> <ul class='menu-wrapper'> <li v-for='item in menu' :key='item' @click='handleClick(item)' > {{ item }} </li> </ul></template><script lang='ts'>import { Component, Prop, Vue } from ’vue-property-decorator’;@Componentexport default class ActionList extends Vue { @Prop() menu: string[]; handleClick(str: string) { this.$emit(’click’, str); }}</script>

接著,開始著手寫彈框組件

  1、彈框組件的顯示隱藏用v-show控制,為什么不用v-if ?因為這里我監(jiān)聽了mouseup事件來讓彈框隱藏,如果在插槽里的元素綁定事件,比如點擊事件,用v-if 的話,點擊插槽里的元素時,彈框先消失,插槽里的點擊事件就不會生效了。

2、handleOpen事件里我們根據(jù)鼠標(biāo)點擊位置定位彈框位置。

// 文件路徑參考: src > components > PublicModel > index.vue<template> <div : v-show=’showModel’> <slot></slot> </div></template><script lang='ts'>import { Component, Prop, Vue } from ’vue-property-decorator’;interface IStyle { left?: string; right?: string; top?: string; bottom?: string;}@Componentexport default class PublicModel extends Vue { showModel:boolean = false; style:IStyle = {}; // 組件顯示時 handleOpen($event:any){ const { clientWidth, clientHeight, scrollWidth, scrollHeight } = document.body || document.documentElement; const { pageX, pageY, clientX, clientY } = $event; let style:IStyle = {} if(clientX > (clientWidth * 2)/3 ){ style.right = scrollWidth - pageX + 10 + ’px’; }else{ style.left = pageX+10+’px’ } if(clientY > (clientHeight * 2) / 3 ){ style.bottom = scrollHeight - pageY + 10 + ’px’; }else{ style.top = pageY + 10 + 'px' } this.style = style; this.showModel = true; document.addEventListener(’mouseup’,this.closeModel) } // 隱藏關(guān)閉此組件 closeModel(){ this.showModel = false; document.removeEventListener(’mouseup’, this.closeModel); } // 組件銷毀生命周期 destroyed(){ document.removeEventListener(’mouseup’, this.closeModel); }}</script>

接著,重點來了,書寫公用封裝函數(shù)

  我們要在demo組件點擊時觸發(fā)這個函數(shù),即在demo組件里的showMenu事件觸發(fā)函數(shù),這個函數(shù)要利用createElement和appendChild方法將彈出框創(chuàng)建并插入到頁面中。

  因為是點擊時創(chuàng)建并插入元素,所以為了性能優(yōu)化,避免有惡意瘋狂點擊,不斷創(chuàng)建和插入元素,我們利用throttle-debounce插件做一個節(jié)流。

  先直接看代碼,其他注釋寫在了代碼里,函數(shù)名隨意取:ModelFun

// 文件路徑參考: src > components > PublicModel > index.tsimport Vue from ’vue’;import PublicModel from ’./index.vue’; // 導(dǎo)入上面所寫的彈框組件const throttleDebounce = require(’throttle-debounce’); // throttle-debounce插件const debounce = throttleDebounce.debounce;const PublicModelConstructor = Vue.extend(PublicModel);let instance:any;const initInstance = () => { instance = new PublicModelConstructor({ el: document.createElement(’div’), }); document.body.appendChild(instance.$el);}const insertInstanceSlot = (slotVNode:any, $event:any) => { // 這里兩個參數(shù)一個是彈框里插槽的組件,還有就是點擊的事件對象(方便定位彈框位置) if(!instance){ initInstance() } instance.$slots.default = [slotVNode]; // 將傳遞過來的插槽組件插入彈框組件中 instance.handleOpen($event) // 觸發(fā)彈框組件(見上一段代碼)的彈框獲取定位信息并顯示的事件}const ModelFun = debounce(200, false, insertInstanceSlot) // 使用throttle-debounce里的debounce保證在一系列調(diào)用時間中回調(diào)函數(shù)只執(zhí)行一次,這里是200毫秒 // 第二個參數(shù)為false時,在點擊時會在200毫秒后再執(zhí)行callback(即insertInstanceSlot),但為true時,會立即先執(zhí)行一次;export default ModelFun

接著,重點來了,書寫公用封裝函數(shù)

  我們要在demo組件點擊時觸發(fā)這個函數(shù),即在demo組件里的showMenu事件觸發(fā)函數(shù),這個函數(shù)要利用createElement和appendChild方法將彈出框創(chuàng)建并插入到頁面中。

  因為是點擊時創(chuàng)建并插入元素,所以為了性能優(yōu)化,避免有惡意瘋狂點擊,不斷創(chuàng)建和插入元素,我們利用throttle-debounce插件做一個節(jié)流。

  先直接看代碼,其他注釋寫在了代碼里,函數(shù)名隨意取:ModelFun

// 文件路徑參考: src > components > PublicModel > index.tsimport Vue from ’vue’;import PublicModel from ’./index.vue’; // 導(dǎo)入上面所寫的彈框組件const throttleDebounce = require(’throttle-debounce’); // throttle-debounce插件const debounce = throttleDebounce.debounce;const PublicModelConstructor = Vue.extend(PublicModel);let instance:any;const initInstance = () => { instance = new PublicModelConstructor({ el: document.createElement(’div’), }); document.body.appendChild(instance.$el);}const insertInstanceSlot = (slotVNode:any, $event:any) => { // 這里兩個參數(shù)一個是彈框里插槽的組件,還有就是點擊的事件對象(方便定位彈框位置) if(!instance){ initInstance() } instance.$slots.default = [slotVNode]; // 將傳遞過來的插槽組件插入彈框組件中 instance.handleOpen($event) // 觸發(fā)彈框組件(見上一段代碼)的彈框獲取定位信息并顯示的事件}const ModelFun = debounce(200, false, insertInstanceSlot) // 使用throttle-debounce里的debounce保證在一系列調(diào)用時間中回調(diào)函數(shù)只執(zhí)行一次,這里是200毫秒 // 第二個參數(shù)為false時,在點擊時會在200毫秒后再執(zhí)行callback(即insertInstanceSlot),但為true時,會立即先執(zhí)行一次;export default ModelFun

最后,我們回過頭來完善一下demo組件

利用vue的 $createElement 將ActionList組件插入彈框中,并將數(shù)據(jù)和事件傳遞給ActionList組件,這里我們傳遞的事件是簡單的彈出我們點擊的數(shù)據(jù)

// 文件路徑參考: src > views > demo> index.vue<template> <div class='demo-wrapper'> <div class='demo-div'> <span>更多功能</span> <i @click.stop=’showMenu($event)’></i> </div> </div></template><script lang='ts'> import { Vue, Component, Prop, Watch} from 'vue-property-decorator'; import ActionList from '@/components/ActionList/index.vue'; import modelFun from '@/components/PublicModel/index'; @Component({ }) export default class articleView extends Vue { menuList: string[] = [’菜單1’,’菜單2’,’菜單3’]; menuClick(name:string){ // 彈框里插槽的點擊事件 this.$message({message:name,type:’success’}) } showMenu($event:any){ modelFun(this.$createElement( ActionList, { props: { menu:this.menuList }, on:{ click: this.menuClick, } }),$event ) } };</script>

至此,效果如下

vue實現(xiàn)點擊出現(xiàn)操作彈出框的示例

最后,我們利用element ui 的 tree 組件結(jié)合我們封裝的彈框看一下效果代碼:

<template> <div class='demo-wrapper'> <el-tree:data='data' node-key='id':default-expand-all='true' :expand-on-click-node='false' show-checkbox ><div iv slot-scope='{ node }'> <span>{{ node.label }}</span> <span @click.stop='showMenu($event)' > <i class='el-icon-more'></i> </span></div> </el-tree> </div></template><script lang='ts'> import { Vue, Component, Prop, Watch} from 'vue-property-decorator'; import ActionList from '@/components/ActionList/index.vue'; import modelFun from '@/components/PublicModel/index'; @Component({ }) export default class articleView extends Vue { menuList: string[] = [’菜單1’,’菜單2’,’菜單3’]; data:any[] = [{ id: 1, label: ’一級 1’, children: [{ id: 4, label: ’二級 1-1’, children: [{ id: 9, label: ’三級 1-1-1’ }, { id: 10, label: ’三級 1-1-2’ }] }] }, { id: 2, label: ’一級 2’, children: [{ id: 5, label: ’二級 2-1’ }, { id: 6, label: ’二級 2-2’ }] }, { id: 3, label: ’一級 3’, children: [{ id: 7, label: ’二級 3-1’ }, { id: 8, label: ’二級 3-2’ }] }]; menuClick(name:string){ console.log(name) this.$message({message:name,type:’success’}) } showMenu($event:any){ modelFun(this.$createElement( ActionList, { props: { menu:this.menuList }, on:{ click: this.menuClick, } }),$event ) } };</script>

效果:

vue實現(xiàn)點擊出現(xiàn)操作彈出框的示例

以上就是vue實現(xiàn)點擊出現(xiàn)操作彈出框的示例的詳細內(nèi)容,更多關(guān)于vue 彈出框的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲电影在线一区二区三区| 蜜桃久久久久久| 精品视频免费| 一区二区三区国产在线| 成人国产精品久久| 久久久久观看| 国产一区二区三区精品在线观看| 欧美激情麻豆| 青草久久视频| 国产自产自拍视频在线观看| 欧洲av不卡| 欧美xxxx中国| 国产伦精品一区二区三区千人斩| 亚洲天堂免费| 久久精品电影| 91欧美日韩| 精品国产一区二| 欧美黄色一区| 国产精品红桃| 国产欧美日韩亚洲一区二区三区| 人人爽香蕉精品| 欧美一级专区| 日韩网站在线| 亚洲福利久久| 欧美不卡在线| 婷婷色综合网| 在线一区欧美| 欧美二三四区| 精品日韩一区| 久久久久伊人| 日韩精品第一| 久久久91麻豆精品国产一区| 精品国产欧美日韩| 中文在线免费视频| 久久人人精品| av一区二区高清| 99国产精品| 美国三级日本三级久久99 | 美日韩一区二区三区| 国产精东传媒成人av电影| 国产精品66| 韩国久久久久久| 欧美a级一区| 蜜臀91精品一区二区三区| 免费视频最近日韩| 午夜亚洲福利| 久久狠狠亚洲综合| 国产精品观看| 成人台湾亚洲精品一区二区| 一区二区精品伦理...| 国产夫妻在线| 欧美天堂亚洲电影院在线观看| 极品日韩av| 免费的成人av| 国产探花一区| 国产不卡av一区二区| 久久久成人网| 免费视频久久| 国产三级一区| 国产资源在线观看入口av| 欧美一区二区三区高清视频| 伊人久久大香线蕉av超碰演员| 久久亚洲精品伦理| 日韩和欧美一区二区| 国产精品**亚洲精品| 欧美成人基地| 亚洲制服一区| 国产调教精品| 日韩视频一区| 91精品国产自产精品男人的天堂| 99成人超碰| 免费的成人av| 国产精品久久久久久久久久白浆| 国语精品一区| 99精品99| 国产精品嫩模av在线| 日韩在线短视频| 亚洲综合日本| 国产午夜久久av| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 免费人成在线不卡| 欧美黄色一区| 亚洲激情社区| 久久av免费看| 日本国产精品| 免费成人在线影院| 国产精品亚洲片在线播放| 欧美成人aaa| 99视频+国产日韩欧美| 国产精品网站在线看| 99久久亚洲精品| 久久亚洲精品伦理| 久久精品国产亚洲一区二区三区| 国产一区二区三区成人欧美日韩在线观看 | 亚洲伦乱视频| 日韩在线黄色| 天堂а√在线最新版中文在线| 综合一区av| 天堂中文在线播放| 欧美性www| 国产一区二区高清| 精品资源在线| 日日摸夜夜添夜夜添国产精品| 鲁鲁在线中文| 日本不卡一二三区黄网| 91精品啪在线观看国产18| 国产精品欧美大片| 综合在线一区| 欧美日韩国产亚洲一区| 不卡专区在线| 国产精品任我爽爆在线播放| 亚洲欧洲一区二区天堂久久| 国产欧美日韩综合一区在线播放| 91精品国产成人观看| 欧美亚洲tv| 国产一级久久| 午夜精品网站| 国产v综合v| 久久永久免费| 日韩精彩视频在线观看| 婷婷激情图片久久| 最新中文字幕在线播放| 手机精品视频在线观看| 亚洲不卡系列| 国产精品蜜芽在线观看| 国产欧美日韩一区二区三区在线| 免费看精品久久片| 99国产精品久久久久久久成人热| 日韩一区二区中文| 国产一区二区精品久| 亚洲3区在线| 亚洲精品国产偷自在线观看| 日韩在线卡一卡二| 日韩一区电影| 欧美日韩伊人| 美女尤物久久精品| 91久久久精品国产| 四虎4545www国产精品| 精品视频高潮| 国产精品伦一区二区| 午夜天堂精品久久久久| 欧美专区一区二区三区| 激情综合自拍| 人人精品亚洲| 丝袜美腿一区| 日韩av自拍| 国产精品久久久久久久久妇女| 国产日韩欧美一区二区三区在线观看 | 成人在线免费观看网站| 国产美女精品视频免费播放软件| 蜜桃久久av一区| 老牛国产精品一区的观看方式| 一区久久精品| 亚洲免费高清| 99国产精品久久久久久久| 国精品一区二区三区| 99久久婷婷| 视频一区中文| 激情综合自拍| 在线亚洲观看| 视频一区二区中文字幕| 美美哒免费高清在线观看视频一区二区| 91精品二区| 成人va天堂| 欧美影院三区| 亚洲一区二区三区免费在线观看| 国产一区日韩欧美| 日韩视频一区二区三区在线播放免费观看| 激情综合网站| 日韩天堂av| 久久成人国产| 亚洲精品中文字幕99999| 日韩在线网址| 亚洲精品四区| 日韩欧美综合| 欧美午夜不卡影院在线观看完整版免费| 激情综合在线| 亚洲综合不卡| 国产一区二区精品| 亚洲另类av| 97se亚洲| 精品欠久久久中文字幕加勒比| 激情视频网站在线播放色| 久久久久国产| 石原莉奈在线亚洲三区| 日韩av字幕| 国产精品宾馆| 久久激情一区| 亚洲+小说+欧美+激情+另类| 欧美激情视频一区二区三区免费 | 国产精品久久久久久妇女| 久久精品亚洲| 成人羞羞视频播放网站| 99亚洲视频| 911亚洲精品| 岛国av在线网站| 日韩精品一二三四| 欧美日韩a区| 国产不卡人人| 天堂av在线一区|