Почему активированный хук жизненного цикла не вызывается при первом посещении - PullRequest
0 голосов
/ 01 марта 2019

У меня проблема с тем, что компонент внутри router-view, который поддерживается живым, не вызывает свою ловушку activated жизненного цикла при первом создании.Вызваны хуки жизненного цикла created и mounted.При втором посещении вызывается хук activated.

Сценарий довольно сложный, поскольку в нем задействовано немного вложенности и использования слотов.

Я пытался создатьминимальный пример, который вы можете найти ниже, или чуть более подробно о https://codesandbox.io/s/251k1pq9n.

К сожалению, он довольно большой и все же не такой сложный, как реальный код, которым я, к сожалению, не могу поделиться.

Хуже того, мне не удалось воспроизвести реальную проблему в моем минимальном примере.Здесь все ловушки жизненного цикла created, mounted и activated вызываются при первом посещении SlotExample.

В моем реальном коде только хуки жизненного цикла created и mounted вызываются при первом посещении, хук activated вызывается при последующих посещениях.Интересно, что все ловушки жизненного цикла вызываются, как и ожидалось, для SlotParent.

Реальный код требует больше вложенности и использует слоты для использования компонентов макета.

Мой код использует Vue 2.5.16и Vue-Router 3.0.1, но он также не работает должным образом в Due 2.6.7 и Vue-Router 3.0.2.Я также использую Vuetify и Vue-Head, но не думаю, что это как-то связано с моей проблемой.

index.js.

У кого-нибудь есть идеи о том, кем я мог бытьделать неправильно.Я на самом деле подозреваю ошибку в vue-router при использовании нескольких вложенных слотов и keep-alive, но не могу воспроизвести.

index.js

import Vue from "vue";
import VueRouter from "vue-router";
import App from "./App.vue";
import Start from "./Start.vue";
import SlotExample from "./SlotExample.vue";

const routes = [
    {
        path: "/start",
       component: Start
    },
    {
        path: "/slotExample/:id",
        component: SlotExample,
        props: true
    }
];

const router = new VueRouter({ routes });

Vue.use(VueRouter);

new Vue({
    render: h => h(App),
    router,
    components: { App }
}).$mount("#app");

App.vue

<template>
    <div id="app">
        <div>
            <keep-alive><router-view/></keep-alive>
        </div>
    </div>
</template>

SlotExample.vue

<template>
    <div>
        <h1>Slot Example</h1>
        <router-link to="/start"><a>start</a></router-link>
        <router-link to="/slotExample/123">
    <a>slotExample 123</a>
  </router-link>
        <slot-parent :id="id">
            <slot-child
                slot-scope="user"
                :firstName="user.firstName"
                :lastName="user.lastName"/>
        </slot-parent>
    </div>  
</template>

<script>
    import SlotParent from "./SlotParent.vue";
    import SlotChild from "./SlotChild.vue";
    export default {
        name: "slotExample",
        components: { SlotParent, SlotChild },
        props: {
            id: {
                type: String,
                required: true
            }
        }
    };
</script>

SlotParent.vue

<template>
    <div>
        <div slot="header"><h1>SlotParent</h1></div>
        <div slot="content-area">
            <slot :firstName="firstName" :lastName="lastName" />
        </div>
    </div>
</template>

<script>
    export default {
        name: "slotParent",
        props: {
            id: {
                type: String,
                required: true
            }
        },
        computed: {
            firstName() {
                if (this.id === "123") {
                    return "John";
                } else {
                    return "Jane";
                }
            },
            lastName() {
                return "Doe";
            }
        }
    };
</script>

SlotChild.vue

<template>
    <div>
        <h2>SlotChild</h2>
        <p>{{ firstName }} {{ lastName }}</p>
    </div>
</template>

<script>
    export default {
        name: "slotChild",
        props: {
            firstName: {
                type: String,
                required: true
            },
            lastName: {
                type: String,
                required: true
            }
        },
        created() {
            console.log("slotChild created");
        },
        mounted() {
            console.log("slotChild mounted");
        },
        activated() {
            console.log("slotChild activated");
        }
    };
</script>

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, вам нужно поместить SlotChild в блок keep-alive.

Взгляните на vue js doc об активированном хуке

...