Vue + el-menu刷新选中 + 路由监听 + 路由重复点击

0. 整体代码:

【App.vue】

<template>
  <div id="app">
    <HeaderPage :routerData="routerData"/>
    <br>
    <router-view v-if="isRouterAlice"/>
  </div>
</template>

<script>
import HeaderPage from './components/Header.vue'

export default {
  name: 'App',
  components: {
    HeaderPage
  },
  provide () {
    return {
      reload: this.reload
    }
  },
  methods: {
    reload () {
      this.isRouterAlice = false
      this.$nextTick(function () {
        this.isRouterAlice = true
      })
    }
  },
  data: function () {
    return {
      isRouterAlice: true,
      routerData: [
        {
          index: 0,
          title: '汇总',
          route: '/summarization'
        },
        {
          index: 1,
          title: '管理',
          route: '/management'
        },
        {
          index: 2,
          title: 'TestOne',
          route: '/testone'
        },
      ]
    }
  }
}
</script>

 【HeaderPage.vue】

<template>
  <div class="hello">
<!--    <ul>-->
<!--      <router-link v-for="(item,index) in routerData" :key="index" :to="{path:item.route}" @click.native="flushRouter">{{item.title}}&emsp;</router-link>-->
<!--    </ul>-->
    <el-menu class="el-menu--popup" :default-active="defaultActive" router>
      <el-menu-item v-for="(item,index) in routerData" :key="index" :index="item.route" @click.native="flushRouter">{{item.title}}</el-menu-item>
    </el-menu>
  </div>
</template>

<script>
export default {
  name: 'HeaderPage',
  inject: ['reload'],
  props: {
    routerData: Array
  },
  data:function(){
    return {
      defaultActive : ''
    }
  },
  methods: {
    flushRouter () {
      this.reload()
    }
  },
  watch: {
    $route: {
      immediate: true,
      handler(to) {
        if (to.fullPath.endsWith('testone'))
        this.defaultActive = to.path // 给defaultActive重新赋值为当前组件的路由地址
      }
    }
  }
}
</script>

 【整体效果】:

1. el-menu刷新选中:

 el-menu菜单,在刷新时选中当前的菜单,,通过路由监听实现

 【要点】:

  • el-menu标签中绑定defaultActive属性,如:default-active=“defaultActive”
  • vue实例中watch监听路由,刷新时,路由地址发生变化,就能被监听到,然后赋值给defaultActive,实现刷新再选中
 watch: {
   $route: {
     immediate: true,
     handler(to) {
       if (to.fullPath.endsWith('testone'))
       this.defaultActive = to.path // 给defaultActive重新赋值为当前组件的路由地址
     }
   }
 }

 【效果】:

 如本栗子,汇总页刷新,菜单的高亮消失了;到TestOne菜单刷新时,会再选中TestOne,依旧高亮

在这里插入图片描述

2. 路由重复点击:

 路由重复点击,默认是不刷新对应路由页面的,要实现路由重复点击刷新,可以采用Provide + inject 来实现

 【要点】:

  • 路由渲染组件标签< router-view > 绑定一变量控制显示,如< router-view v-if=“isRouterAlice”/>
  • 路由渲染组件标签所在组件(本栗子的App.vue)提供暴露一个reload方法,该方法改变isRouterAlice值,让路由不显示,然后再次渲染后又显示回来
  • 在路由标签绑定一个native的点击事件,如@click.native=“flushRouter”
  • 在路由标签所在组件(本栗子的HeaderPage.vue)中inject暴露的reload方法,如inject: [‘reload’],,flushRouter方法中调用reload方法
  • 路由标签是像原生的< router-link > ,或者是本栗通过el绑定实现的

 【整体效果】:

 重复点击TestOne,每点击一次,都触发create方法,打印输出,即实现了重复点击路由刷新

在这里插入图片描述

 但是这种方式,在主页首次点击的时候,会重复点击两次,就相当于在页面中调用两次接口

在这里插入图片描述

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值