vue 用户点击不同的导航菜单,显示对应菜单所展示的区域

情景:

导航栏在一个单独组件NavigationBar/index.vue,中间的内容区也是一个单独组件ContentComponents/index.vue,但这个组件都是属于Home子组件,NavigationBar和ContentComponents属于兄弟级组件

需求:

用户通过点击NavigationBar组件里每一个导航菜单,把所点击的导航菜单名称value和类型type(该类型可控制中间的内容区划分的是一半区域,整个区域或默认初始区域)传给ContentComponents组件,ContentComponents组件根据接收到的值显示所划分的不同区域内容

图1:默认初始区域

图2:一半区域

 图3:整个区域

 实现:主要利用兄弟组件之间传值的知识,两种方法

        方法一:利用事件总线bus,通常用于两个兄弟组件之间没有任何关联,如没有共同的父级

        方法二:利用父组件在中间作桥梁,相互传值(子组件A传值给父组件,父组件传值给子组件B),本项目中使用的是第二种方法

子组件A:绑定导航菜单点击事件clickNav,传两个参数value,type,this.$emit发送事件和需要用到的值

<template>
  <div class="navigator">
    <div class="column">
      <img src="/images/icon-01.png" alt="" />
      <p>首页</p>
    </div>
    <!-- 实况预报 -->
    <div class="column adver">
      <div class="title">
        <p>实况预报</p>
      </div>
      <div class="text">
        <div class="no-hd">
          <ul>
            <li>
              <a href="" @click.prevent="clickNav(navList[0], 'half')"
                >天气实况</a
              >
            </li>
            <li>
              <a href="" @click.prevent="clickNav(navList[1], 'half')">卫星云图</a>
            </li>
          </ul>
        </div>
        <div class="no-hd">
          <ul>
            <li>
              <a href="" @click.prevent="clickNav(navList[2], 'half')"
                >天气预报</a
              >
            </li>
            <li>
              <a href="" @click.prevent="clickNav(navList[3], 'half')">雷达回波</a>
            </li>
          </ul>
        </div>
        <div class="no-hd">
          <ul>
            <li>
              <a href="" @click.prevent="clickNav(navList[4], 'half')">预警信号</a>
            </li>
            <li>
              <a href="" @click.prevent="clickNav(navList[5], 'half')"
                >生活指数</a
              >
            </li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "index",
  data() {
    return {
      navList: [
        "天气实况",
        "卫星云图",
        "天气预报",
        "雷达回波",
        "预警信号",
      ],
    };
  },
  methods: {
    clickNav(value, type) {
      this.$emit("contentChange", { type, value });
    },
  },
};
</script>

<style scoped>
@import "./index.css";
</style>

父组件

<template>
    <!--导航栏-->
    <div class="navigation-bar">
      <!--组件A,父组件接收第一个孩子提供的值 -->
      <NavigationBar @contentChange="contentChange" />
    </div>

    <!--内容区域-->
    <div class="content-components">
        // 组件B
       <!-- <ContentComponents :getValue="getValue" /> -->
       <ContentComponents ref="contentCom" />
    </div>
</template>
<script>
    import NavigationBar from "./NavigationBar";
    import TipsMessage from "./TipsMessage";
    import ContentComponents from "./ContentComponents";
    export default {
      name: "index",
      data() {
        return {
          getValue: "",
        };
      },
      components: {
        NavigationBar,
        ContentComponents
      },
      mounted() {},
      methods: {
        contentChange(conInfo) {
          this.$refs.contentCom.mainContentName = conInfo.value; // 调用函数
          this.$refs.contentCom.contentType = conInfo.type;
          console.log("msg----" + conInfo);
        },
      },
    };
</script>

子组件B

data() {
    return {
      contentType: "default",
      mainContentName: "",
    };
  },

即contentType代表type,mainContentName代表导航菜单的名称value

<div>
    ///整个区域
    <div v-if="contentType == 'full'" class="full-content">
      <MeteorologicalInformation v-if="mainContentName == '气象资讯'" />
    </div>

    <div v-else class="scatter-content">
      <div class="left-content">
        ///默认初始区域
        <div v-if="contentType == 'default'" class="default">
          <div class="map-message">
            <div class="map-content">
              <WeatherMap />
            </div>

            <div class="weather-message">
              <WeatherMessage />
            </div>
          </div>

          <div class="whole-point">
            <WholePoint></WholePoint>
          </div>

          <div class="agromete-orology">
            <AgrometeOrology></AgrometeOrology>
          </div>
        </div>
        ///一半区域
        <div v-if="contentType == 'half'" class="half-content">
          <WeatherFacts v-if="mainContentName == '天气实况'" />
          <LifeIndex v-if="mainContentName == '生活指数'" />
        </div>
      </div>

      <div class="right-content">
        <!--登录和预警-->
        <div class="login-warn">
          <LoginWarn />
        </div>
        <div class="new-media-weather">
          <NewMediaWeather></NewMediaWeather>
        </div>
      </div>
    </div>
</div>

补充:

兄弟组件之间相互传值:

1.vuex传值

2.$emit传值,props接收

见收藏博客,参考:vue兄弟组件之间传值的两种办法_袋鼠@糊糊的博客-CSDN博客_vue兄弟组件传值

兄弟组件之间相互调用方法

见收藏博客,参考:vue兄弟组件之间传值和方法调用_南有樛木。的博客-CSDN博客_vue调用兄弟组件的方法

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue侧边菜单导航是一种常用的网页导航方式。它通常位于页面的侧边栏,用于展示网站或应用的不同功能页面或模块,并提供用户快速切换页面的功能。 Vue框架提供了开发这种导航组件的便利性。我们可以使用Vue组件化能力,将侧边菜单导航拆分成多个组件,使得每个导航项都可以独立管理和维护。这样,当我们需要增加、删除或修改导航项时,只需要修改相应的组件代码,无需影响其他部分。 在实现侧边菜单导航时,我们可以使用Vue Router进行页面的切换。通过在导航菜单组件中配置路由链接,当用户点击某个导航项时,Vue Router会根据配置的路由规则,动态加载对应组件,并渲染到主内容区域。 为了增加用户体验,我们可以使用Vue的动画效果来实现导航菜单的展开和收起。当用户点击导航菜单的折叠按钮时,我们可以通过动画效果平滑地展开或收起导航菜单,使页面的切换过渡更加流畅。 另外,为了提高导航的可用性,我们可以在导航菜单中添加一些交互效果,比如在用户当前所处页面的导航项上添加高亮效果,以提示用户当前所在的位置。我们也可以为导航菜单项添加一些图标或标识,使得用户更容易辨认各个功能页面。 总之,Vue侧边菜单导航是一种简洁、灵活、易于维护的网页导航方式。通过合理的组件划分、使用Vue Router实现页面切换、应用动画效果和交互效果,能够为用户提供良好的导航体验,并提高网站或应用的可用性和用户满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值