vue實現(xiàn)右鍵點擊彈框信息功能
vue右鍵點擊彈框信息功能
當某個地方需要右鍵彈出信息,已供快速選擇時,例如一些用到慣用語的地方。
輸入框部分代碼
<el-row style="margin-top:50px"> <el-col :span="24"> <el-form-item label="意見" prop="note1"> <div v-click-outside> <div @contextmenu.prevent="rightShow"> <el-input type="textarea" :autosize="{ minRows: 4}" v-model="ruleForm.note1" @input="forceInput()" placeholder="請輸入整改驗收意見" ></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 {} 里,點擊輸入框外的地方會關(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分別賦值為鼠標的位置; menu.style.left = evt.pageX+"px"; menu.style.top = evt.pageY+"px"; //如果鼠標右邊放不下菜單,就把left的值的改了 if(evt.pageX+100>clientWidth+scrollLeft){//菜單應該在鼠標左邊; var left1 = evt.pageX-100; menu.style.left = left1+"px"; } //如果鼠標下邊放不下菜單,就把top的值的改了 if(evt.pageY+100>clientHeight+scrollTop){ var top1 = (evt.pageY-100); menu.style.top = top1+"px"; } menu.style.display = "block"; }, // 選擇要用的常用語 selectPhrase(item) { // if (item.content === '暫無慣用語') 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)容無法修改,也無法輸入。
出現(xiàn)該問題的原因是
vue頁面進行數(shù)據(jù)渲染時,層次嵌套或者多重數(shù)據(jù)綁定導致該組件信息框數(shù)據(jù)不能被Vue實時監(jiān)聽到,以此出現(xiàn)了數(shù)據(jù)發(fā)生改變但頁面上更新或刪除對應信息框的數(shù)據(jù)毫無反應的現(xiàn)象,此時需要強制更新,重新渲染。
可以在輸入框添加@input=“forceInput()”,然后在methods中添加方法:
forceInput() { this.$forceUpdate(); },
forceUpdate用來強制渲染,避免data中對象層次太深,Vue框架不自動渲染的情況。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何在vue3.0+中使用tinymce及實現(xiàn)多圖上傳文件上傳公式編輯功能
本文給大家分享tinymce編輯器如何在vue3.0+中使用tinymce及實現(xiàn)多圖上傳文件上傳公式編輯功能,tinymce安裝方法文中也給大家詳細介紹了,對vue tinymce實現(xiàn)上傳公式編輯相關(guān)知識感興趣的朋友跟隨小編一起學習下吧2021-05-05解決vue動態(tài)下拉菜單 有數(shù)據(jù)未反應的問題
這篇文章主要介紹了解決vue動態(tài)下拉菜單 有數(shù)據(jù)未反應的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08ElementUI中el-form組件的rules參數(shù)舉例詳解
Form組件提供了表單驗證的功能,只需要通過rules屬性傳入約定的驗證規(guī)則,并將Form-Item的prop屬性設(shè)置為需校驗的字段名即可,下面這篇文章主要給大家介紹了關(guān)于ElementUI中el-form組件的rules參數(shù)的相關(guān)資料,需要的朋友可以參考下2023-10-10vue多級復雜列表展開/折疊及全選/分組全選實現(xiàn)
這篇文章主要介紹了vue多級復雜列表展開/折疊及全選/分組全選實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11vue.js移動端app之上拉加載以及下拉刷新實戰(zhàn)
這篇文章主要介紹了vue.js移動端app之上拉加載以及下拉刷新實戰(zhàn),非常具有實用價值,需要的朋友可以參考下2017-09-09vue項目中做編輯功能傳遞數(shù)據(jù)時遇到問題的解決方法
這篇文章主要介紹了vue項目中做編輯功能傳遞數(shù)據(jù)時遇到問題的解決方法,vue父組件向子組件傳遞數(shù)據(jù)的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12