I'm using vue-router with a series of components like tabs. Each <router-link>
is a tab and the space below is the <router-view>
. Two of the tabs are the same component with different filters, let's say they are products
and the router adds a parameter for filtering: /products/new
& /products/sale
.
Inside of products
are individual product
components which get mounted when the route is opened. My problem is that when I switch between the routes, and the filter parameter is changed, the product
components get remounted every time. I'd like to cache them so switching back and forth is easier. To do this I set up <keep-alive>
and added :key='$route.fullPath'
to my <router-view>
but they don't seem to be cached. Each product
is still firing a mounted()
event when i switch between products
.
<keep-alive>
<router-view :key='$route.fullPath'></router-view>
</keep-alive>
Should I make each products
view into a separate component?
I don't think you will be able to cache
router-view
usingkeep-alive
. From the documentation ofkeep-alive
:And
router-view
is a functional component, from the documentation:To make this work, you need to have dynamic component inside
keep-alive
, like following:For use keep-alive with router view you should use unique key on view router like this:
Dont forgot use max attribute on keep alive to prevent memory overhead
or just include components want cache:
And for each components inside component you need keep alive them if you want cache
Just because your component is re-mounted and therefore fires your function on the
mounted
hook doesn't mean it was ever destroyed. To test if it was kept alive, console log something on thedestroyed
hook, and if it doesn't fire the console log, thekeep-alive
is working. I've run your same code, and it seems to work in Vue 2 at least.Have a look from what I posted here for vue 2+:
vue.js keep-alive and router-view
If you want to swap things around based on the route url you can add children to your routes.js file and bind off parameters that way. For example if you wanted to have your component kept alive but need the data to change from part of the path you can do something like this:
You can route first to /Products, then on say user click of an image or list of whatever you want route to /Products/Overview/Memes, after the user then clicks a specific meme you could route to /Products/Overview/Memes/MrPotatoHead and have the component load data on Mr Potato Head or something to that effect.
Its important to note that the Products component will be kept alive but the sub components will not. Even if you wrap the sub components template in keep-alive it will be destroyed:
destroy nested keep-alive components