您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“vue怎么實(shí)現(xiàn)自定義全局右鍵菜單”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
效果如圖所示:
注意:
需要在項(xiàng)目中找到頁面整體布局的組件,比如項(xiàng)目使用Home.vue作為整個(gè)項(xiàng)目的公共布局,將根元素定位設(shè)置成relative,使右鍵菜單相對(duì)于其進(jìn)行定位。
本文的右鍵菜單主要使用vuex實(shí)現(xiàn)
一、vuex中定義全局狀態(tài)用于管理右鍵菜單
export default { /** * menuContent格式: * [ * { * name: '新建文件', // 操作名 * method: 'createDirectory', // 需要執(zhí)行的對(duì)應(yīng)組件中的方法 * disabled: true // 是否禁用,可以根據(jù)頁面具體邏輯進(jìn)行調(diào)整 * } * ] * * * 整體右鍵菜單采用絕對(duì)定位,所以clientX、clientY代表是left和top定位 */ state: { menuContent: [], // 右鍵菜單內(nèi)容 clientX: '', // left clientY: '', // top displayContextMenu: false // 是否展示右鍵菜單 }, mutations: { SET_CONTEXT_MENU: (state, payload) => { state.menuContent = payload.menuContent; state.clientX = payload.clientX; state.clientY = payload.clientY; state.displayContextMenu = payload.displayContextMenu; }, } }
二、定義公共組件ContextMenu.vue
<template> <div class="context-menu" v-show="contextMenu.displayContextMenu" :> <ul> <li v-for="(item, i) in contextMenu.menuContent" :key="i" :class="item.disabled ? 'disabled' : ''" @click="emitEvent(item.method)"> {{item.name}} </li> </ul> </div> </template> <script> import { mapState } from 'vuex'; import bus from '@/views/common/bus'; export default { name: 'ContextMenu', data(){ return { } }, computed: { ...mapState(['contextMenu']) }, methods: { emitEvent(type){ bus.$emit('operateDirectory', type) } } } </script> <style lang="scss" scoped> .context-menu { position: absolute; background: #FFF; color: #34495E; min-width: 100px; box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.2); border-radius: 2px; cursor: pointer; z-index: 1002; &>ul { text-align: left; padding: 5px 10px; &>li { padding: 3px 4px; font-size: 12px; list-style: none; height: 24px; line-height: 24px; &:hover { background: #EDF6FF; } } .disabled { color: #888585; pointer-events: none; } } } </style>
三、在組件中使用
import { mapState } from 'vuex'; // ... computed: { ...mapState(['contextMenu']) }, created(){ bus.$on('operateDirectory', (param) => { // 點(diǎn)擊右鍵菜單時(shí),應(yīng)觸發(fā)組件內(nèi)的同名方法,首先應(yīng)判斷該方法是否在本組件內(nèi)存在,存在則調(diào)用 if(this[param]){ this[param](); } }); }, // ... methods: { showContextMenu(event, data) { event.preventDefault(); // 阻止瀏覽器的默認(rèn)事件 const menuContent = { menuContent: [ { icon: "el-icon-upload2", name: "運(yùn)行", method: "run", }, { icon: "el-icon-refresh", name: "編輯", method: "editConfig", }, { icon: "el-icon-refresh", name: "添加", method: "addCommond", }, { icon: "el-icon-refresh", name: "刪除", method: "deleteConfig", }, ], clientX: event.clientX, clientY: event.clientY, displayContextMenu: true, }; this.$store.commit("SET_CONTEXT_MENU", menuContent); // 再次點(diǎn)擊頁面,右鍵菜單消失 document.onclick = (event) => { this.$store.commit("SET_CONTEXT_MENU", { displayContextMenu: false, }); }; }, run(){ // ... }, editConfig(){ // ... }, addCommond(){ // ... }, deleteConfig(){ // ... } }
“vue怎么實(shí)現(xiàn)自定義全局右鍵菜單”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。