前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

作者头像
江咏之
发布2022-06-17 15:18:00
3.9K0
发布2022-06-17 15:18:00
举报
文章被收录于专栏:技术社区技术社区

实际项目开发中有时候需要根据路由的变化去实进行一些操作,在此,我总结了三种方法。

1、watch监听

代码语言:javascript
复制
// 监听,当路由发生变化的时候执行
watch:{
  $route(to,from){
    console.log(to.path);
  }
},
或者
// 监听,当路由发生变化的时候执行
watch: {
  $route: {
    handler: function(val, oldVal){
      console.log(val);
    },
    // 深度观察监听
    deep: true
  }
},
或者
// 监听,当路由发生变化的时候执行
watch: {
  '$route':'getPath'
},
methods: {
  getPath(){
    console.log(this.$route.path);
  }
}

2、:key 阻止复用 vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可(Vue文档原话) 使用computed属性和Date()可以保证每一次的key都是不同的,这样就可以如愿刷新数据了。

代码语言:javascript
复制
<router-view :key="key"></router-view>
computed: {
  key() {
    return this.$route.name !== undefined? this.$route.name +new Date(): this.$route +new Date()
  }
}

3、vue-router 的钩子函数

代码语言:javascript
复制
<script>
  export default {
    name: 'app',
    // 监听,当路由发生变化的时候执行
    beforeRouteEnter (to, from, next) {
      // 在渲染该组件的对应路由被 confirm 前调用
      // 不!能!获取组件实例 `this`
      // 因为当钩子执行前,组件实例还没被创建
    },
    beforeRouteUpdate (to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
      // 可以访问组件实例 `this`
    },
    beforeRouteLeave (to, from, next) {
      // 导航离开该组件的对应路由时调用
      // 可以访问组件实例 `this`
    }
</script>

使用场景: 点击页面内跳转按钮 导航菜单选中 在element中有个NavMenu 导航菜单 组件

在这里插入图片描述
在这里插入图片描述

在A菜单页面中,有一个按钮button组件,点击这个button跳转到B菜单页。虽然页面已经跳过去了,但是导航菜单的选中状态并没有发生改变,还在A菜单上面。也就是default-active,还停留在A上。

在这里插入图片描述
在这里插入图片描述

此时就可以在导航菜单的组件中去监听router。方法如下:

代码语言:javascript
复制
 data() {
    return {
      activeIndex: this.$route.path
    };
  },
 watch:{
    '$route'(to,from){
      this.activeIndex=to.path
    }
  },

组件代码

代码语言:javascript
复制
<template> 
  <el-menu 
    router
    theme="dark"
    :default-active="activeIndex"
    class="el-menu-demo"
    active-text-color="rgb(250,83,83)"
    mode="horizontal"
    @select="handleSelect"
  >
    <el-menu-item index="/">首页</el-menu-item> 
    <el-menu-item index="/Material"  >我要找</el-menu-item>
    <el-menu-item index="/Workbench" >工作台</el-menu-item>
  </el-menu> 
</template>
<script>
export default {
  data() {
    return {
      activeIndex: this.$route.path
    };
  },

  watch:{
    '$route'(to,from){
      this.activeIndex=to.path
    }
  },
  mounted(){

  },
  methods: { 
    handleSelect(key, keyPath) {
    }
  }
};
</script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档