当前位置:首页 > VUE

vue实现左右菜单联动实现

2026-01-08 05:14:34VUE

Vue 实现左右菜单联动

使用事件总线通信

在 Vue 中可以通过事件总线实现左右菜单的通信。创建一个中央事件总线实例,让左右菜单通过事件监听和触发实现联动。

// eventBus.js
import Vue from 'vue';
export const EventBus = new Vue();

在左侧菜单组件中触发事件:

// LeftMenu.vue
import { EventBus } from './eventBus';

methods: {
  handleMenuClick(item) {
    EventBus.$emit('menu-selected', item.id);
  }
}

在右侧菜单组件中监听事件:

// RightMenu.vue
import { EventBus } from './eventBus';

created() {
  EventBus.$on('menu-selected', (menuId) => {
    this.activeMenuId = menuId;
  });
}

使用 Vuex 状态管理

对于更复杂的联动逻辑,可以使用 Vuex 集中管理状态。定义共享的状态和 mutations,让左右菜单通过 commit 和 getters 实现联动。

// store.js
export default new Vuex.Store({
  state: {
    activeMenuId: null
  },
  mutations: {
    setActiveMenu(state, menuId) {
      state.activeMenuId = menuId;
    }
  }
});

左侧菜单触发 mutation:

// LeftMenu.vue
methods: {
  handleMenuClick(item) {
    this.$store.commit('setActiveMenu', item.id);
  }
}

右侧菜单响应状态变化:

vue实现左右菜单联动实现

// RightMenu.vue
computed: {
  activeMenuId() {
    return this.$store.state.activeMenuId;
  }
}

使用父子组件通信

如果左右菜单是父子组件关系,可以通过 props 和 $emit 实现联动。父组件维护共享状态,通过 props 传递给子组件,子组件通过事件通知父组件更新状态。

父组件:

// ParentComponent.vue
<template>
  <div>
    <LeftMenu :activeId="activeMenuId" @menu-change="handleMenuChange" />
    <RightMenu :activeId="activeMenuId" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeMenuId: null
    };
  },
  methods: {
    handleMenuChange(menuId) {
      this.activeMenuId = menuId;
    }
  }
};
</script>

左侧子组件:

vue实现左右菜单联动实现

// LeftMenu.vue
<template>
  <div>
    <div v-for="item in menuItems" @click="$emit('menu-change', item.id)">
      {{ item.name }}
    </div>
  </div>
</template>

右侧子组件:

// RightMenu.vue
<template>
  <div>
    <div v-if="activeId === 1">Content for Menu 1</div>
    <div v-if="activeId === 2">Content for Menu 2</div>
  </div>
</template>

<script>
export default {
  props: ['activeId']
};
</script>

使用 provide/inject

对于深层嵌套的组件,可以使用 provide/inject 实现跨层级通信。祖先组件提供数据,后代组件注入使用。

祖先组件:

// Ancestor.vue
export default {
  provide() {
    return {
      menuData: {
        activeId: this.activeMenuId,
        setActiveId: this.setActiveId
      }
    };
  },
  data() {
    return {
      activeMenuId: null
    };
  },
  methods: {
    setActiveId(id) {
      this.activeMenuId = id;
    }
  }
};

后代组件:

// Descendant.vue
export default {
  inject: ['menuData'],
  methods: {
    handleClick() {
      this.menuData.setActiveId(123);
    }
  }
};

标签: 菜单vue
分享给朋友:

相关文章

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽 子…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现返回

vue实现返回

返回按钮功能实现 在Vue中实现返回功能通常有两种方式:使用浏览器历史记录的history.back()或结合Vue Router进行编程式导航。以下是具体实现方法: 使用浏览器API metho…

vue课程实现

vue课程实现

Vue 课程实现方案 课程内容设计 Vue课程应从基础到高级逐步展开,涵盖Vue核心概念、组件化开发、状态管理、路由、构建工具等。基础部分包括Vue实例、模板语法、计算属性和侦听器。中级部分深入组件通…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue实现抖动

vue实现抖动

Vue 实现抖动效果 在 Vue 中实现抖动效果可以通过 CSS 动画或 JavaScript 动画库来实现。以下是几种常见的方法: 使用 CSS 动画 通过定义 @keyframes 动画并在 V…