Vue - Vue的生命周期

125 阅读1分钟

首先先看一下官网的生命周期图:

根据demo来理解Vue的生命周期中的每个步骤:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>

<body>
    <div id="app" v-cloak>
        <ul>
            <li v-for="(item, i) in userlist">
                {{i+1}}-{{item.nickname}}
            </li>
        </ul>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        Vue.config.devtools = false;
        Vue.config.productionTip = false;

        var app = new Vue({
            el: '#app',
            // 初始化事件和的生命周期,然后执行beforeCreate()
            beforeCreate() {
                console.log("beforeCreate", this.$data, this.$el);
            },
            // 注入数据&校验数据,然后执行created()
            created() {
                // data初始化完成
                // ajax请求数据
                console.log("created", this.$data, this.$el);
                this.getList();
            },
            // 判断是否指定了容器el,*若没指定el,则当调用app.$mount(el)函数时执行下面的操作
            // 判断是否指定了模板template,
            // 若指定了template,则将template编译到render函数(渲染template)
            // 若没指定template,则将el外部的HTML(outerHTML)作为template编译
            beforeMount() { 
                // el挂载完成
                console.log("beforeMount", this.$data, this.$el);
            },
            // 创建app.$el,替换页面中的el(将Vue容器渲染进页面)
            mounted() {
                // 初始化DOM插件
                console.log("mounted", this.$data, this.$el);
            },
            // Vue挂载完毕
            // 此时,当data被修改时,会触发beforeUpate()和updated()
            beforeUpdate() {
                console.log("beforeUpdate");
            },
            // 更新数据:重新渲染虚拟DOM并应用更新
            updated() {
                console.log("updated");
            },
            // 当调用app.$destroy()时才会执行销毁操作
            beforeDestroy() {
                console.log("beforeDestroy");
            },
            // 解除绑定,销毁子组件以及事件监听器
            destroyed() {
                console.log("destroyed");
            },
            data() {
                return {
                    userlist: [],
                    msg: "123"
                }
            },
            methods: {
                async getList() {
                    let { data } = await axios.get("http://47.92.50.43:8888/sys/jslist");
                    this.userlist = data;
                }
            },
        });

        setTimeout(() => {
            app.$destroy();
        }, 3000);
    </script>
</body>
</html>

运行结构如下: