vuejs/router

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

Closed this issue · 1 comments

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

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.