vuejs / router

🚦 The official router for Vue.js
https://router.vuejs.org/
MIT License
3.74k stars 1.15k forks source link

Introduce `passive` option for `router.push`/`router.replace` #2232

Closed AlttiRi closed 1 month ago

AlttiRi commented 1 month ago

What problem is this solving

I want to update the location URL without triggering scrollBehavior.

I need to trigger scrollBehavior only on the page refresh, or when I go to the route from other one to scroll the page to the selected item. (I select an item by a click on it then I add its ID to the location URL).

Proposed solution

Add a passive option for router.push/router.replace to skip scrollBehavior and guards, for example, if there is no transition to another route.

router.replace({ params: { id: item.name }, passive: true });

As you can see in this example, I do not use neither name, or path. I'm still on the same route ("/items/:id?") after using replace. Using of hash (/items#1), or searchParams(/items?id=1) for storing a data on the same route have this issue too.


Or add any way to attach a meta object (for example, {passive: true, foo: "bar"}) to check it in scrollBehavior and guard functions. A simple if (to.state.passive) { return; } in scrollBehavior will be acceptable option too.

Describe alternatives you've considered

Yeah, I can write a workaround, but I (and not only me) would like to see this simple and expected option from the box.

posva commented 1 month ago

Please stop opening issues that should be questions. Open discussions explaining what you are trying to do.

Add a passive option for router.push/router.replace to skip scrollBehavior and guards, for example, if there is no transition to another route.

Guards and scrollBehavior() are functions, you can already skip them when needed.