vue實(shí)現(xiàn)右鍵點(diǎn)擊彈框信息功能
vue右鍵點(diǎn)擊彈框信息功能
當(dāng)某個(gè)地方需要右鍵彈出信息,已供快速選擇時(shí),例如一些用到慣用語(yǔ)的地方。
輸入框部分代碼
<el-row style="margin-top:50px"> <el-col :span="24"> <el-form-item label="意見(jiàn)" prop="note1"> <div v-click-outside> <div @contextmenu.prevent="rightShow"> <el-input type="textarea" :autosize="{ minRows: 4}" v-model="ruleForm.note1" @input="forceInput()" placeholder="請(qǐng)輸入整改驗(yàn)收意見(jiàn)" ></el-input> <ul id="menu" ref="msgRightMenu" v-show="isPersoncontextMenus"> <li @click.stop="selectPhrase(item)" v-for="item in sceneList" :key="item.id">{{ item.content}}</li> </ul> </div> </div> </el-form-item> </el-col> </el-row>
showRightMenu: false, isPersoncontextMenus:false, sceneList:[]
// 位置在 export default {} 里,點(diǎn)擊輸入框外的地方會(huì)關(guān)閉彈窗 directives: { clickOutside: {//自定義指令:clickOutside bind (el, bindings, vnode) {//自定義指令生命周期:bind ;參數(shù):el, bindings, vnode let handler = (e) => { if (el.contains(e.target)) { if (!vnode.context.isPersoncontextMenus) { vnode.context.focus() } } else { if (vnode.context.isPersoncontextMenus) { vnode.context.blur() } } } el.handler = handler document.addEventListener('click', handler) }, unbind (el) {//自定義指令生命周期:unbind document.removeEventListener('click', el.handler) } } },
// methods rightShow() { let menu = this.$refs.msgRightMenu this.isPersoncontextMenus = true this.$post('/test/getList', {}, res => { if (res.success === true) { this.sceneList = res.data; } else { this.isCommiting = false this.isPersoncontextMenus = false } }) var evt = event || window.event; var clientWidth = document.documentElement.clientWidth || document.body.clientWidth ; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; var clientHeight = document.documentElement.clientHeight || document.body.clientHeight ; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop ; //給left和top分別賦值為鼠標(biāo)的位置; menu.style.left = evt.pageX+"px"; menu.style.top = evt.pageY+"px"; //如果鼠標(biāo)右邊放不下菜單,就把left的值的改了 if(evt.pageX+100>clientWidth+scrollLeft){//菜單應(yīng)該在鼠標(biāo)左邊; var left1 = evt.pageX-100; menu.style.left = left1+"px"; } //如果鼠標(biāo)下邊放不下菜單,就把top的值的改了 if(evt.pageY+100>clientHeight+scrollTop){ var top1 = (evt.pageY-100); menu.style.top = top1+"px"; } menu.style.display = "block"; }, // 選擇要用的常用語(yǔ) selectPhrase(item) { // if (item.content === '暫無(wú)慣用語(yǔ)') return this.ruleForm.note1 = item.content this.isPersoncontextMenus = false }, // showNo(){ // console.log('showNo') // console.log('showNossssssssssssssss') // let menu = this.$refs.msgRightMenu // menu.style.display = "none"; // }, focus () { this.isPersoncontextMenus = true let menu = this.$refs.msgRightMenu menu.style.display = "block"; }, blur () { this.isPersoncontextMenus = false let menu = this.$refs.msgRightMenu menu.style.display = "none"; },
如果加完右鍵功能,發(fā)現(xiàn)該輸入框或者的內(nèi)容無(wú)法修改,也無(wú)法輸入。
出現(xiàn)該問(wèn)題的原因是
vue頁(yè)面進(jìn)行數(shù)據(jù)渲染時(shí),層次嵌套或者多重?cái)?shù)據(jù)綁定導(dǎo)致該組件信息框數(shù)據(jù)不能被Vue實(shí)時(shí)監(jiān)聽(tīng)到,以此出現(xiàn)了數(shù)據(jù)發(fā)生改變但頁(yè)面上更新或刪除對(duì)應(yīng)信息框的數(shù)據(jù)毫無(wú)反應(yīng)的現(xiàn)象,此時(shí)需要強(qiáng)制更新,重新渲染。
可以在輸入框添加@input=“forceInput()”,然后在methods中添加方法:
forceInput() { this.$forceUpdate(); },
forceUpdate用來(lái)強(qiáng)制渲染,避免data中對(duì)象層次太深,Vue框架不自動(dòng)渲染的情況。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在vue3.0+中使用tinymce及實(shí)現(xiàn)多圖上傳文件上傳公式編輯功能
本文給大家分享tinymce編輯器如何在vue3.0+中使用tinymce及實(shí)現(xiàn)多圖上傳文件上傳公式編輯功能,tinymce安裝方法文中也給大家詳細(xì)介紹了,對(duì)vue tinymce實(shí)現(xiàn)上傳公式編輯相關(guān)知識(shí)感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05解決vue動(dòng)態(tài)下拉菜單 有數(shù)據(jù)未反應(yīng)的問(wèn)題
這篇文章主要介紹了解決vue動(dòng)態(tài)下拉菜單 有數(shù)據(jù)未反應(yīng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08ElementUI中el-form組件的rules參數(shù)舉例詳解
Form組件提供了表單驗(yàn)證的功能,只需要通過(guò)rules屬性傳入約定的驗(yàn)證規(guī)則,并將Form-Item的prop屬性設(shè)置為需校驗(yàn)的字段名即可,下面這篇文章主要給大家介紹了關(guān)于ElementUI中el-form組件的rules參數(shù)的相關(guān)資料,需要的朋友可以參考下2023-10-10vue中解決el-date-picker更改樣式不生效問(wèn)題
在使用Vue.js進(jìn)行前端開(kāi)發(fā)的過(guò)程中,Element?UI?是一個(gè)非常流行的UI庫(kù),它提供了一套完整的組件來(lái)快速搭建美觀的用戶界面,但是我們經(jīng)常遇到一個(gè)問(wèn)題使用Element?UI提供的el-date-picker組件時(shí),嘗試自定義其樣式卻無(wú)法生效,所以本文給大家介紹如何解決這個(gè)問(wèn)題2024-10-10vue多級(jí)復(fù)雜列表展開(kāi)/折疊及全選/分組全選實(shí)現(xiàn)
這篇文章主要介紹了vue多級(jí)復(fù)雜列表展開(kāi)/折疊及全選/分組全選實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11vue.js移動(dòng)端app之上拉加載以及下拉刷新實(shí)戰(zhàn)
這篇文章主要介紹了vue.js移動(dòng)端app之上拉加載以及下拉刷新實(shí)戰(zhàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09vue項(xiàng)目中做編輯功能傳遞數(shù)據(jù)時(shí)遇到問(wèn)題的解決方法
這篇文章主要介紹了vue項(xiàng)目中做編輯功能傳遞數(shù)據(jù)時(shí)遇到問(wèn)題的解決方法,vue父組件向子組件傳遞數(shù)據(jù)的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Vue.js實(shí)現(xiàn)價(jià)格計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)價(jià)格計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08