每次更新路由时调用一个函数 vue.js

Posted

技术标签:

【中文标题】每次更新路由时调用一个函数 vue.js【英文标题】:call a function every time a route is updated vue.js 【发布时间】:2018-01-18 01:09:40 【问题描述】:

我在我的应用程序中集成了对讲机,每次我的网址更改时我都需要致电window.Intercom('update');

我知道我可以将它添加到mounted(),但我宁愿不修改我的所有组件,而是直接使用navigation guards 来完成。 (主要是为了避免在 10 个不同的地方有相同的代码。

目前我有:

router.afterEach((to, from) => 
  eventHub.$off(); // I use this for an other things, here is not important
  console.log(window.location.href ) // this prints the previous url
  window.Intercom('update'); // which means that this also uses the previous url
)

这在更改 url 之前运行 intercom('update'),而我需要在 url 更改后运行它。

是否有一个钩子在 url 更改时运行? 我该怎么做?

谢谢

【问题讨论】:

您可以在 Vue 实例中尝试 watching the $route object。 @thanksd 我说它还没有改变,因为在第 3 行 console.log(window.location.href ) 打印了以前的 url。例如从家里我点击 /about,它打印 home,然后我点击 /team 它打印 /about 等 @Phil 你的意思是在我的基础组件中添加一个观察者?这可以工作.. 我通常会尽量避免观察者,但在这里它可能是有意义的 为什么不给 App.vue 添加一个挂载的钩子。所有其他组件都是 App.vue 的子组件 @KamgaSimoJunior @Phil watch 工作得很好。谢谢。 【参考方案1】:

不确定这是否会起作用,因为您已经拥有的似乎应该没问题,但是这里...

尝试watching the $route object 进行更改

new Vue(
  // ...
  watch: 
    '$route': function(to, from) 
      Intercom('update')
    
  
)

【讨论】:

参数的顺序应该to, from,否则正是我要找的。​​span> @Jonas 他们只是名字,但你是对的,论点应该颠倒过来。将修复 对我来说,观看`'$route'` 没有检测到变化,但$route 检测到了。我的意思是我必须删除引号。 @YeasirArafatMajumder 根本不应该有任何区别【参考方案2】:

我刚刚想出了除菲尔之外的另一个解决方案,您也可以使用Global Mixin。它将其方法或生命周期挂钩合并到每个组件中。

Vue.mixin(
  mounted() 
    // do what you need
  
)

【讨论】:

我建议不要使用此解决方案。如果您使用每个路由一个组件的简单实现,这可能会起作用,但是使用此方法,mounted() 事件将附加到每个组件,因此如果您在路由中有一个或多个子组件,该事件将运行一次他们每个人。这可能会导致您的应用程序出现意外和无法控制的行为。

以上是关于每次更新路由时调用一个函数 vue.js的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js - 更新路由器视图

Vue.js:在 vue.router 路由中使用 mixin 函数

(vue.js)Vue element tab 每个tab用一个路由来管理?

vue,js vue-router 2 组件数据不更新

vue.js路由vue-router——简单路由基础

在 Vue.js2 中使用哪个生命周期钩子在页面加载时调用函数?