最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實(shí)現(xiàn)自定義全局右鍵菜單

 更新時(shí)間:2022年04月08日 17:24:02   作者:Manon103  
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)自定義全局右鍵菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前段時(shí)間公司在做一個(gè)webIDE項(xiàng)目,其中有對(duì)文件樹的各種操作,主要通過右鍵菜單實(shí)現(xiàn),今天就來記錄一下怎么在vue項(xiàng)目中實(shí)現(xiàn)全局的自定義右鍵菜單。效果如圖所示:

注意:

需要在項(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"?
? ? ? ? :style="{'left': contextMenu.clientX + 'px', 'top': contextMenu.clientY + 'px'}">
? ? ? ? <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(){
?? ??? ?// ...
?? ?}
}

總結(jié)

這種可以實(shí)現(xiàn)全局右鍵菜單,并且支持自定義右鍵內(nèi)容,但是vue3.0對(duì)event bus的取消會(huì)導(dǎo)致不可用。

目前有一種優(yōu)化方法:項(xiàng)目中對(duì)應(yīng)會(huì)使用組件庫,例如element ui,在定義contextMenu.vue的時(shí)候,使用dialog,將內(nèi)容定義在Popover 彈出框中,當(dāng)組件使用右鍵菜單時(shí),使用子組件的方式使用ContextMenu.vue,點(diǎn)擊右鍵菜單內(nèi)容時(shí)就不需要使用emit觸發(fā)了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue實(shí)現(xiàn)附件上傳功能

    Vue實(shí)現(xiàn)附件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)附件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 基于Vue組件化的日期聯(lián)動(dòng)選擇器功能的實(shí)現(xiàn)代碼

    基于Vue組件化的日期聯(lián)動(dòng)選擇器功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了基于Vue組件化的日期聯(lián)動(dòng)選擇器的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • vue中的雙向數(shù)據(jù)綁定原理與常見操作技巧詳解

    vue中的雙向數(shù)據(jù)綁定原理與常見操作技巧詳解

    這篇文章主要介紹了vue中的雙向數(shù)據(jù)綁定原理與常見操作技巧,結(jié)合實(shí)例形式詳細(xì)分析了vue中雙向數(shù)據(jù)綁定的概念、原理、常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • Vite多環(huán)境配置項(xiàng)目高定制化能力詳解

    Vite多環(huán)境配置項(xiàng)目高定制化能力詳解

    這篇文章主要為大家介紹了Vite多環(huán)境配置項(xiàng)目高定制化能力詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Vue使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能

    Vue使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-04-04
  • VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn)

    VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn)

    本文主要介紹了VueCLI通過process.env配置環(huán)境變量的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue?+?SpringBoot?實(shí)現(xiàn)文件的斷點(diǎn)上傳、秒傳存儲(chǔ)到Minio的操作方法

    Vue?+?SpringBoot?實(shí)現(xiàn)文件的斷點(diǎn)上傳、秒傳存儲(chǔ)到Minio的操作方法

    這篇文章主要介紹了Vue?+?SpringBoot?實(shí)現(xiàn)文件的斷點(diǎn)上傳、秒傳存儲(chǔ)到Minio的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-06-06
  • Vue?Token過期問題的2種解決方案小結(jié)

    Vue?Token過期問題的2種解決方案小結(jié)

    在使用token進(jìn)行登錄的過程中,如果token過期了,需要重新輸入用戶名和密碼登錄,這種體驗(yàn)肯定是不好的,下面這篇文章主要給大家介紹了關(guān)于Vue?Token過期問題的2種解決方案,需要的朋友可以參考下
    2023-02-02
  • 基于 Vue 的樹形選擇組件的示例代碼

    基于 Vue 的樹形選擇組件的示例代碼

    本篇文章主要介紹了基于 Vue 的樹形選擇組件的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Vue3插槽(slot)使用方法詳解

    Vue3插槽(slot)使用方法詳解

    在VUE開發(fā)項(xiàng)目的過程中,插槽<slot>是重要的承載分發(fā)內(nèi)容的出口,下面這篇文章主要給大家介紹了關(guān)于Vue3插槽(slot)使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論

海晏县| 乌拉特前旗| 云梦县| 新龙县| 祥云县| 康马县| 高青县| 宜章县| 乾安县| 同仁县| 秦皇岛市| 赤水市| 定结县| 安塞县| 梅州市| 洪泽县| 阜康市| 连云港市| 绥棱县| 革吉县| 泗洪县| 温宿县| 海南省| 晴隆县| 育儿| 文昌市| 武邑县| 秦安县| 芦溪县| 宁安市| 衡南县| 龙门县| 昌邑市| 吉隆县| 泸定县| 江西省| 苍溪县| 中超| 西昌市| 伊川县| 南川市|