Heim > Web-Frontend > View.js > Warum geht router.beforeEach in vue zweimal?

Warum geht router.beforeEach in vue zweimal?

下次还敢
Freigeben: 2024-05-02 20:31:02
Original
1119 Leute haben es durchsucht

In Vue kann router.beforeEach aus folgenden Gründen zweimal ausgeführt werden: 1. Falsche Navigationsreihenfolge 2. Mehrere Routing-Guards 3. Vuex-Speicheränderungen; Um dies zu vermeiden, vermeiden Sie die Navigation in beforeEach, führen Sie mehrere Routenwächter zusammen und verwenden Sie Überwachungen, um auf Vuex-Speicheränderungen zu warten.

Warum geht router.beforeEach in vue zweimal?

Warum wird router.beforeEach in Vue zweimal ausgeführt? router.beforeEach 会走两次?

router.beforeEach 是 Vue Router 中的一个钩子函数,它会在路由导航发生之前触发。一般情况下,它只会被触发一次,但在某些特定情况下,它可能会被触发两次。

可能的原因:

  • 错误的导航顺序:如果在 beforeEach 钩子函数内部执行了路由导航,则该钩子函数将再次触发。这是因为路由导航是一个异步过程,在它完成之前,beforeEach 钩子函数可能已经被执行了。
  • 多个路由守卫:如果有多个路由守卫(global 和 per-route)注册了 beforeEach 钩子函数,则它们都会被触发。这可能会导致重复的逻辑或意外行为。
  • Vuex 存储变更:如果 beforeEach 钩子函数依赖于 Vuex 存储的状态,并且在导航期间触发了状态变更,则该钩子函数可能会被再次触发。这是因为 Vuex 存储变更会触发组件重新渲染,这反过来又会导致路由导航。

如何避免:

为了避免 router.beforeEach 触发两次,可以采取以下措施:

  • 避免在 beforeEach 钩子函数中执行路由导航:如果需要在 beforeEach 钩子函数中执行路由导航,请使用 next() 回调来延迟导航,直到当前导航完成。
  • 合并多个路由守卫:如果有多个路由守卫需要注册 beforeEach 钩子函数,请考虑将它们合并为一个函数。
  • 使用 watch 监听 Vuex 存储变更:如果 beforeEach 钩子函数依赖于 Vuex 存储的状态,请使用 Vuex 的 watch() 函数来监听状态变更,而不是在导航期间触发状态变更。

结论:

router.beforeEach 在 Vue 中触发两次通常是由于错误的导航顺序、多个路由守卫或 Vuex 存储变更。通过遵循上述措施,可以避免这种情况,确保 beforeEach

router.beforeEach ist eine Hook-Funktion in Vue Router, die vor der Routennavigation ausgelöst wird. Normalerweise wird es nur einmal ausgelöst, aber in bestimmten Fällen kann es zweimal ausgelöst werden. 🎜🎜🎜Mögliche Ursachen: 🎜
  • 🎜Falsche Navigationsreihenfolge: Wenn die Routennavigation innerhalb der Hook-Funktion beforeEach durchgeführt wird, wird die Hook-Funktion erneut ausgelöst . Dies liegt daran, dass die Routennavigation ein asynchroner Prozess ist und die Hook-Funktion beforeEach möglicherweise vor ihrem Abschluss ausgeführt wurde.
  • 🎜Mehrere Route Guards: Wenn mehrere Route Guards (global und pro Route) mit der Hook-Funktion beforeEach registriert sind, werden sie alle ausgelöst. Dies kann zu doppelter Logik oder unerwartetem Verhalten führen.
  • 🎜Vuex-Speicheränderungen: Wenn die Hook-Funktion beforeEach auf dem gespeicherten Vuex-Status basiert und während der Navigation eine Statusänderung ausgelöst wird, wird die Hook-Funktion möglicherweise erneut ausgelöst . Dies liegt daran, dass Vuex-Speicheränderungen ein erneutes Rendern von Komponenten auslösen, was wiederum eine Routennavigation verursacht.
🎜🎜So vermeiden Sie: 🎜🎜Um zu vermeiden, dass router.beforeEach zweimal auslöst, können Sie folgende Maßnahmen ergreifen: 🎜
  • 🎜Vermeiden Sie die Routennavigation in der Hook-Funktion beforeEach ausführen: Wenn Sie die Routennavigation in der Hook-Funktion beforeEach ausführen müssen, verwenden Sie bitte den next() Rückruf, um die Navigation zu verzögern, bis die aktuelle Navigation abgeschlossen ist.
  • 🎜Mehrere Route Guards zusammenführen: Wenn es mehrere Route Guards gibt, die die Hook-Funktion beforeEach registrieren müssen, ziehen Sie bitte in Betracht, sie in einer Funktion zusammenzuführen.
  • 🎜Verwenden Sie watch, um Vuex-Speicheränderungen zu überwachen: Wenn die Hook-Funktion beforeEach vom Status des Vuex-Speichers abhängt, verwenden Sie bitte watch() Funktion, um auf Statusänderungen zu warten, anstatt Statusänderungen während der Navigation auszulösen.
🎜🎜Fazit: 🎜🎜router.beforeEach Zweimaliges Auslösen in Vue ist normalerweise auf eine falsche Navigationsreihenfolge, mehrere Routenwächter oder Vuex-Speicheränderungen zurückzuführen. Indem Sie die oben genannten Schritte ausführen, können Sie diese Situation vermeiden und sicherstellen, dass die Hook-Funktion beforeEach wie erwartet ausgeführt wird. 🎜

Das obige ist der detaillierte Inhalt vonWarum geht router.beforeEach in vue zweimal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
vue
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage