信息发布→ 登录 注册 退出

vue中watch监听器的触发时机(watch的坑及解决)

发布时间:2026-01-11

点击量:
目录
  • watch监听器的触发时机
    • 起因
    • 代码
    • watch
    • 控制台
    • 说明
  • vue watch的理解小记

    watch监听器的触发时机

    起因

    我需要在页面created时获得商家的类型id值,然后监听id值,动态的改变请求接口的地址。请求接口的函数在mounted中执行。业务逻辑写完后发现,页面在第一次加载时,接口没有数据,原因接口地址为空,即接口地址没有改变。

    代码

     created() {
        this.typeId = this.$route.params.id;
        console.log("this.typeId的值发生改变,触发watch");
      },
      mounted() {
        console.log(this.typeUrl, "mounted中的typeUrl的值");
        //访问接口的函数
        this.getData();
      },
    

    watch

      watch: {
      // 监听订单类型 给出对应面包屑
      typeId: function (val) {
        if (val == 1) {
          console.log("watch触发了");
          this.selfBreadcrumb[1].name = "核销订单";
          this.typeUrl = "settlements";
          console.log(this.typeUrl, "这里是watch");
        } else if (val == 2) {
          this.selfBreadcrumb[1].name = "物流订单";
          this.typeUrl = "logistics-orders";
        } else if (val == 4) {
          this.selfBreadcrumb[1].name = "外卖订单";
          this.typeUrl = "takeout-orders";
        }
      },
    

    控制台

    说明

    watch的触发会在created和mounted结束后。

    先占个坑,具体原理如何只有等我项目完成了再来康康。

    vue watch的理解小记

    刚开始学时,感觉自己懂了。可是到用时才发现自己是渣渣中的渣渣。。。

    想通过路由id的变化来改变组件的加载数据时,遇到了一个问题,就是,组件不会重新渲染。一脸懵逼了,,,

    找到了watch的监控方法时,又用不好。扣扣会用了一些,赶紧记下来。

    首先确认 watch是一个对象,一定要当成对象来用。

    对象就有键,有值。

    • 键:就是你要监控的那个家伙,比如说$route,这个就是要监控路由的变化。或者是data中的某个变量。
    • 值可以是函数:就是当你监控的家伙变化时,需要执行的函数,这个函数有两个形参,第一个是当前值,第二个是变化后的值。
    • 值也可以是函数名:不过这个函数名要用单引号来包裹。

    第三种情况厉害了。

    值是包括选项的对象:选项包括有三个。

    • 第一个handler:其值是一个回调函数。即监听到变化时应该执行的函数。
    • 第二个是deep:其值是true或false;确认是否深入监听。(一般监听时是不能监听到对象属性值的变化的,数组的值变化可以听到。)
    • 第三个是immediate:其值是true或false;确认是否以当前的初始值执行handler的函数。
    var vm = new Vue({
      data: {
        a: 1,
        b: 2
      },
      watch: {
        a: function (val, oldVal) {
          console.log('new: %s, old: %s', val, oldVal)
        },
        // 方法名
        b: 'someMethod',
        // 选项的对象
        c: {
          handler: function (val, oldVal) { /* ... */ },
          deep: true,
          immediate: true
        }
      }
    })

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持。 

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!