在app.vue中,修改this.$route.meta,watch设置了deep: true,没有监听到变化?

发布于 2022-09-11 23:46:20 字数 448 浏览 9 评论 0

在app.vue中,修改this.$route.meta,watch设置了deep: true,没有监听到变化,页面也没有渲染?

// App.vue中
watch: {
    $route: {
      deep: true,
      handler(to, from) {
        console.log(6666666666, to); // 执行modify方法无法打印
      }
    }
},
methods: {
    modify() {
      console.log(777777);
      this.$route.meta.navName = "修改";
      // this.$set(this.$route.meta, "navName", "修改"); // 用这个也无效
    },
}

如何才能监听到meta的更新?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遗忘曾经 2022-09-18 23:46:20

手动给 this.$route.meta 添加双向监听

// *.vue 中
created(){
  this.watcher(this.$route.meta, 'navName', this.callback)
},
methods:{
  watcher(obj, name, callback){
    let value = obj[name]
    Object.defineProperty(obj, name, {
      set:function(e){
        value = e
        callback && callback(e)
      }.bind(this),
      get:function(){
        return value
      }.bind(this)
    })
  },
  callback(){
    console.log(event)
  }
}
关于从前 2022-09-18 23:46:20
  Vue.mixin({
    beforeCreate () {
      if (isDef(this.$options.router)) {
        this._routerRoot = this
        this._router = this.$options.router
        this._router.init(this)
        Vue.util.defineReactive(this, '_route', this._router.history.current)
      } else {
        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
      }
      registerInstance(this, this)
    },
    destroyed () {
      registerInstance(this)
    }
  })
  Object.defineProperty(Vue.prototype, '$router', {
    get () { return this._routerRoot._router }
  })

  Object.defineProperty(Vue.prototype, '$route', {
    get () { return this._routerRoot._route }
  })

读源码可知$route其实就是根组件$root_route属性, 他并没有定义在data里, 而是调用Vue.util.defineReactive(this, '_route', this._router.history.current), 该方法只会监听_route这个对象的最表层, 也就是_route被赋值=xxx, 才会触发响应式监听被watch到.
相反,定义在data里的数据在组件被实例化时

initData (vue.esm.js?115c:4762)
initState (vue.esm.js?115c:4668)
Vue._init (vue.esm.js?115c:5015)

initData时会被深度地响应式化

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文