vue-router creates always a new Component instance

后端 未结 3 627
一整个雨季
一整个雨季 2021-01-13 04:01

I found an issue in vue-router which triggers me a lot. Always when I switch between my routes, a new instance of the component is created. Further the old instances are not

相关标签:
3条回答
  • 2021-01-13 04:31

    There are 2 ways to solve this problem:

    Properly cleaning up in the destroy hook

    If you use any outside event listeners, like setInterval, addEventListener, etc you also need to deregister them when your component gets destroyed, example:

    {
        name: '...',
        template: '...',
        data() {
            return {
                interval: undefined,
                timeout: undefined
            };
        },
        mounted() {
            interval = setInterval(() => {console.log('Instance ' + this._uid + ' of myself is running')}, 500);
            timeout = setTimeout(() => {console.log('Instance ' + this._uid + ' of myself is running')}, 500);
            document.addEventListener('click', this.onOutsideClick);
        },
        beforeDestroy() {
            // Cleanup interval
            clearInterval(interval);
            // Cleanup any pending timeouts
            clearTimeout(timeout);
            // Cleanup any event listeners outside the root of the element
            document.removeEventListener('click', this.onOutsideClick);
        },
        methods: {
            onOutsideClick() {
                ...
            }
        }
    }
    

    Using keep-alive to keep the component alive

    When using keepalive, Vue caches your component, and keeps it alive in the background, this means that only one instance will ever exists. This can potentially consume more memory if you have a large amount of routes

    <keep-alive>
        <router-view></router-view>
    </keep-alive>
    
    0 讨论(0)
  • 2021-01-13 04:39

    The same issue is stated here : https://github.com/vuejs/vuex/issues/1580

    As a workaround you can use transition mode out-in. Rolandoda

    <transition mode="out-in">    <router-view></router-view> </transition>
    
    0 讨论(0)
  • 2021-01-13 04:50

    Always when I switch between my routes, a new instance of the component is created.

    That's expected. you can keep instanes alive and re-use them with the <keep-alive> component, but that's usually not necessary and if so, requires special attention to re-initiate all local state of re-used components where necesseray.

    Creating a fresh instance is much cleaner and therefore the default behaviour.

    Further the old instances are not deleted and are running in background!

    That's not expected. Previous instances are destroyed.

    setInterval(() => {console.log('Instance ' + this._uid + ' of Foo is running')}, 500);
    

    Well, since this intervall callback contains a reference to the component instance, it can't be garbage collected by the browser, So you are keeping them alive, not Vue.

    Without that intervall, I woudl expect the instance to be garbage collected after the router destroyed them.

    0 讨论(0)
提交回复
热议问题