Vue中监听路由参数变化的几种方式

news2024/10/7 10:13:24

目录

一. 路由监听方式: 通过 watch 进行监听

1. 监听路由从哪儿来到哪儿去

2. 监听路由变化获取新老路由信息

3.  监听路由变化触发方法

4. 监听路由的 path 变化

5. 监听路由的 path 变化, 使用handler函数

6. 监听路由的 path 变化,触发methods里的方法 

二. 路由监听方式:key是用来阻止“复用”的

三. 路由监听方式:通过vue-router的钩子函数

1. 组件内监听

2. 全局监听路由

🔽 参考资料


vue页面开发中,我们经常需要根据路由的变化去实现一些操作,那么vue.js中如何监听路由的变化呢?监听路由变化的方法都有哪些?这篇文章主要介绍了vue监听路由变化的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 

——👇 vue中路由参数的变化监听,这里总结了常用的几种方式 👇——

一. 路由监听方式: 通过 watch 进行监听

1. 监听路由从哪儿来到哪儿去

返回 “从哪里来” 和 “哪里去” 的路由信息

// 方式1、监听路由 $route 变化
export default{
    watch: { // 监听,当路由发生变化的时候执行
        $route(to, from){
            console.log('路由变化了')
            console.log('当前页面路由:' + to);
            console.log('上一个路由:' + from);
            // console.log(from.path); // 从哪来
            // console.log(to.path); // 到哪去
        },
    }
}

2. 监听路由变化获取新老路由信息

返回 “新” “老” 路由信息

// 方式2、监听路由 $route 变化, 使用handler函数
export default{
    watch: { // 监听,当路由发生变化的时候执行
        '$route': { // $route可以用引号,也可以不用引号
            handler(to, from){
            console.log('路由变化了')
            console.log('当前页面路由:' + to); //新路由信息
            console.log('上一个路由:' + from); //老路由信息
            },
            deep: true, // 深度观察监听
            immediate: true, // 第一次初始化渲染就可以监听到
        }
    }
}

如果我们需要在最初绑定值的时侯,也执行监听函数,则就需要用到immediate属性。

✔️ 当设置immediate属性为true时,无论值是否发生改变,时刻都会监听;

✔️ 当设置immediate属性为false时,常规用法,只有值发生改变才会监听。

参考:Vue中watch(监听器)的用法详解(通俗易懂,简单明了)


3.  监听路由变化触发方法

// 方式3、监听路由 $route 变化,触发methods里的方法
export default{
  watch: { // 监听,当路由发生变化的时候执行
    '$route':'getPath'
  },
  methods: {
    getPath(){
    console.log(this.$route.path);
    }
 
  }

}

4. 监听路由的 path 变化

// 方式4、监听路由的 path 变化
export default{
    watch: { // 监听,当路由发生变化的时候执行
        '$route.path'(toPath, fromPath){
            console.log('路由变化了')
            console.log('当前页面路由地址:' + toPath)
            console.log('上一个路由地址:' + fromPath)
         },
    }
}

5. 监听路由的 path 变化, 使用handler函数

// 方式5、监听路由的 path 变化, 使用handler函数
export default{
    watch: { // 监听,当路由发生变化的时候执行
        '$route.path': {
            handler(toPath, fromPath){
                console.log('路由变化了')
                console.log('当前页面路由地址:' + toPath)
                console.log('上一个路由地址:' + fromPath)
            },
            deep: true, // 深度监听
            immediate: true, // 第一次初始化渲染就可以监听到
        }
    }
}

6. 监听路由的 path 变化,触发methods里的方法 

// 方式6、监听路由的 path 变化,触发methods里的方法
export default{
    watch: { // 监听,当路由发生变化的时候执行
        '$route.path': 'getpath'
    },
    methods: {
        getpath(){
            console.log('路由变化了')
        }
    }
}

二. 路由监听方式:key是用来阻止“复用”的

Vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可(Vue文档原话)

<router-view :key="key"></router-view>
computed: {
  key(){
    return this.$route.name !== undefined? this.$route.name +new Date(): this.$route +new Date()
  }
}

使用computed属性和Date()可以保证每一次的key都是不同的,这样就可以如愿刷新数据了。

三. 路由监听方式:通过vue-router的钩子函数

1. 组件内监听

❓ 如何在组件中监听路由参数的变化?❓

当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。

因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

那如果我们要在组件中监听路由参数的变化,就只能通过watch (监测变化) $route 对象,或使用 beforeRouteUpdate 的组件内守卫。

方式一: 通过watch 监听 $route
 

const User = {
  template: '...',
  watch: {
    $route(to, from) {
      // 对路由变化作出响应...
    }
  }
}

方式二:通过组件内的导航守卫

beforeRouteUpdate ,(和created(){}生命周期函数同级别)

const User = {
  template: '...',
  beforeRouteUpdate(to, from, next) {
    // react to route changes...
    // don't forget to call next()
  }
}

⏬ 通过vue-router的组件内钩子函数beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave进行监听

示例1:

export default{
    // 监听,当路由发生变化的时候执行
    beforeRouteEnter(to, from, next){
      // 在渲染该组件的对应路由被确认前调用这个钩子,
      // 不!能!获取组件实例 `this`
      // 因为当钩子执行前(也就是说,我们使用的是进入路由之前的钩子),那时组件实例还没被创建,所以不能获取this,自然这里就不能使用this
        console.log(this) // 结果为:undefined
        console.log('beforeRouteEnter')
        next()
    },
    // 监听,当路由发生变化的时候执行
    beforeRouteUpdate(to, from, next){
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
      // 可以访问组件实例 `this`
        console.log(this) // 可以访问this
        console.log('beforeRouteUpdate')
        next()
    },
    // 监听,当路由发生变化的时候执行
    beforeRouteLeave(to, from, next){
        // 导航离开当前路由的时候被调用,this可以被访问到
        console.log(this) // 可以访问组件实例 `this`
        console.log('beforeRouteLeave')
        next()
    },
}

示例2: 

<script>
  // 引入 Tabbar组件
  import mTabbar from './components/Tabbar'
  import mTabbarItem from './components/TabbarItem'
  // 引入 vuex 的两个方法
  import {mapGetters, mapActions} from 'vuex'
  
  export default {
    name: 'app',
    // 计算属性
    computed:mapGetters([
      // 从 getters 中获取值
      'tabbarShow'
    ]),

    // 监听,当路由发生变化的时候执行
    watch:{
      $route(to,from){
        if(to.path == '/' || to.path == '/Prisoner' || to.path == '/Goods' ||
         to.path == '/Time' || to.path == '/Mine'){
          /**

           * $store来自Store对象

           * dispatch 向 actions 发起请求

           */
          this.$store.dispatch('showTabBar');
        }else{
          this.$store.dispatch('hideTabBar');
        }
      }
    },

    beforeRouteEnter (to, from, next) {
      // 在渲染该组件的对应路由被 confirm 前调用
      // 不!能!获取组件实例 `this`
      // 因为当钩子执行前,组件实例还没被创建
    },

    beforeRouteUpdate (to, from, next) {
      // 在当前路由改变,但是该组件被复用时调用
      // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
      // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
      // 可以访问组件实例 `this`
    },

    beforeRouteLeave (to, from, next) {
      // 导航离开该组件的对应路由时调用
      // 可以访问组件实例 `this`
    },

    components:{
      mTabbar,
      mTabbarItem
    },

    data() {
      return {
        select:"Building"
      }
    }
  }
</script>

2. 全局监听路由

⏬ 通过vue-router的全局钩子函数beforeEach——this.$router.beforeEach

// 方式1、在App.vue的create中进行全局路由监听
export default  {
    name:  'App',
    created() {
        this.$router.beforeEach((to, from, next) => {
            console.log(to);
            console.log(from);
            next()
        })
    }
}
// 方式2、在路由文件(/router/index.js)中进行全局路由监听
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)

let routes = [
     {
       path: '/login',
       component: resolve => require(['@/views/login'], resolve),
     },
]

let router = new Router({
    mode: 'history', // 去掉 url 中的 #
    scrollBehavior: () => ({ y: 0 }),
    base: process.env.VUE_APP_BASE_DOMAIN,
    routes,
})

router.beforeEach((to, from, next) => {
    console.log(to);
    console.log(from);
    next()
})

export {
    routes
    router
}

🔽 参考资料

  • Vue监听路由变化的几种方式小结
  • Vue.js怎么监听路由变化
  • Vue路由监听的方式
  • Vue几种监听路由变化的方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

QCustomPlot 给出的测试用例图示

0 1 2 3 4 5 6 7 8 9 10 移动 11 12 13 14 15 移动 16 17 18 19 20

高翔《自动驾驶中的SLAM技术》代码详解 — 第6章 2D SLAM

目录 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 6.2 扫描匹配算法 6.2.1 点到点的扫描匹配 // src/ch6/test_2dlidar_io.cc // Created by xiang on 2022/3/15. // #include <gflags/gflags.h> #include <glog/logging.h> #include <opencv2/highgui.hpp>…

Vue3如何获取和操作DOM元素

Vue3如何获取和操作DOM元素 环境&#xff1a;vue3tsvite 目标&#xff1a; 1.修改DOM的文本值和样式 2.获取后代子DOM元素,操作修改 <template><div class"content"><h1>演示</h1><p ref"pText1">这是ref为pText1的一段文…

【网络编程】揭开套接字的神秘面纱

文章目录 1 :peach:简单理解TCP/UDP协议 :peach:2 :peach:网络字节序 :peach:3 :peach:socket编程接口 :peach:3.1 :apple:socket 常见API :apple:3.2 :apple:sockaddr结构:apple: 4 :peach:简单的UDP网络程序 :peach:4.1 :apple:基本分析:apple:4.2 :apple:udpServer.hpp(重点…

海外跨境电商网站多语言一键翻译系统开发(java开源)

要搭建一个海外跨境电商网站多语言一键翻译系统&#xff0c;可以按照以下步骤进行&#xff1a; 1. 确定需求&#xff1a;首先&#xff0c;需要明确系统的功能需求和用户需求。例如&#xff0c;确定需要支持哪些语种&#xff0c;界面翻译和数据库翻译的具体要求等。 2. 选择开…

tomcat虚拟主机配置演示

一.新建用于显示的index.jsp文件&#xff0c;写入内容 二.修改tomcat/apache-tomcat-8.5.70/conf/server.xml配置文件 匹配到Host那部分&#xff0c;按上面格式在后面添加自己的域名和文件目录信息 主要是修改name和docBase 保存退出重启tomcat&#xff0c;确保tomcat运行…

0基础学习VR全景平台篇 第80篇:Insta360 影石如何直播推流

一、下载Insta360 Pro APP 1、手机进入Insta360官网Insta360 | Action Cameras | 360 Cameras | VR Cameras&#xff0c;页面往下滑动到Insta360 Pro2相机处&#xff0c;点击相机图片进入详情页。详情页继续下滑到到手机APP处&#xff0c;根据自己的手机系统选择对应的客户端进…

uView之u-line-progress进度条数值小时显示不全

经过测试&#xff0c;可以以10为分界点&#xff0c;百分比小于10的时候&#xff0c;自定义进度条数值的位置和颜色&#xff0c;如下所示&#xff1a; <u-line-progress :percent"percent"><text v-if"percent<10" style"position: absol…

Linux的shell脚本常用命令

1、前提 使用shell脚本可以将所要执行的命令行进行汇总&#xff0c;统一执行&#xff0c;制作为脚本工具&#xff0c;简化重复性工作 1.1、常用命令 1.1.1、启动命令 假设我们拥有一个halloWord.sh的脚本&#xff0c;通过cd 命令进入相对应的目录下 ./halloWord.sh1.1.2、…

Linux 常用操作命令

Linux简介及Ubuntu安装 Linux&#xff0c;免费开源&#xff0c;多用户多任务系统。基于Linux有多个版本的衍生。RedHat、Ubuntu、Debian 安装VMware或VirtualBox虚拟机。具体安装步骤&#xff0c;找百度。 再安装Ubuntu。具体安装步骤&#xff0c;找百度。 常用指令 ls  …

产业互联网-跨境电商B2B平台

【背景】&#xff1a;互联网已经进入web3.0时代&#xff0c;产业互联网是互联网关键时点&#xff0c;特别是跨境电商&#xff0c;速卖通&#xff0c;亚马逊&#xff0c;wish Ebay&#xff0c;还有出海的titok,temu等&#xff0c;中国企业或平台走出来也是一条光明大通&#xff…

激活函数总结(二):ELU、SELU、GELU激活函数

激活函数总结&#xff08;二&#xff09;&#xff1a;ELU、SELU、GELU激活函数 1 引言2. 激活函数2.1 ELU&#xff08;Exponential Linear Unit&#xff09;激活函数2.2 SELU&#xff08;Scaled Exponential Linear Unit&#xff09;激活函数2.3 GELU激活函数 3. 总结 1 引言 …

ArcGIS Pro字段操作代码汇总

属性表是GIS数据的重要组成部分&#xff0c;有了属性表才可以进行分析和分类配色等操作&#xff0c;这里为大家介绍一下ArcGIS Pro中字段操作的相关代码&#xff0c;希望能对你有所帮助。 关键词搜索 打开属性表&#xff0c;点击按属性选择&#xff0c;如下图所示。 点击按属…

【java】final

final final修饰属性fianl修饰方法fianl修饰类 final修饰属性 final可以修饰变量&#xff1a;变量的值一旦初始化后无法修改 final可以修饰属性&#xff1a;那么JVM无法自动进行初始化&#xff0c;需要自己进行初始化, 属性值不能发生变化。 public class chapter15 {public …

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

嵌入式系统开发平台

嵌入式系统开发平台 嵌入式系统开发是一项关键的技术领域&#xff0c;涵盖了从传统家用电器到现代智能手机、智能车辆等各种应用的广泛范围。在学习和开发过程中&#xff0c;选择适合的开发平台对于项目的成功至关重要。本文将介绍几个常用的嵌入式系统开发平台&#xff0c;提…

深入理解Linux内核--信号

信号的作用 信号(signal)是很短的消息&#xff0c;可以被发送到一个进程或一组进程。发送给进程的唯一信息通常是一个数&#xff0c;以此来标识信号。在标准信号中&#xff0c;对参数、消息或者其他相随的信息没有给予关注。 使用信号的两个主要目的是&#xff1a;1.让进程知道…

【Linux命令详解 | cat命令】Linux系统中用于显示或连接文件的命令

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 显示文件内容2. 创建文件3. 连接文件4. 显示行号5. 压缩空行6. 显示特殊字符7. 显示行号和特殊字符8. 从标准输入读取9. 显示文件开头或结尾10. 备份文件11. 显示文件内容至多屏幕大小12. 转义正则表达式13. 显示…

线段树模板12

线段树 洛谷上有两道线段树模板&#xff08;指模板1&#xff0c;模板2&#xff09;都是区间维护的&#xff0c;也就是说&#xff0c;都离不开lasytag的维护&#xff0c;为了提高效率&#xff0c;故使用了lasytag,这里看一下题 【模板】线段树 1 题目描述 如题&#xff0c;已…