zoukankan      html  css  js  c++  java
  • vue生命周期及使用 && 单文件组件下的生命周期

    生命周期钩子

      这篇文章主要记录与生命周期相关的问题。 之前,我们讲到过生命周期,如下所示:

    根据图示我们很容易理解vue的生命周期:

    • js执行到new Vue() 后,即进入vue的beforeCreate状态。
    • 接着观察data下的数据,紧接着create。
    • create之后,就会检测是否含有el属性,如果有,就直接检测是否含有模板属性; 如果没有,就当vm.$mount()调用之后再检测,vm.$mount()的作用就是将Vue实例挂载到某一个DOM元素上。
    • 如果有template,那么我们就编译模板到render函数中,作用就是为了将模板中的元素渲染进去;如果没有template,我们就把el所在的HTML作为模板编译。
    • 这样就进入了 beforeMount 状态。
    • 在mounted 之前,就会创建一个 vm.$el 用来替代 实例中的el, ok! 这样就可以mouted了。
    • 接着,如果data发生了变化,就会有beforeUpdata,在替换了之后,就是updated的状态啦! 这是一个循环的过程,因为updated是可以一直更新的嘛!
    • 最后如果我们调用了 vm.$destroy() 就会进入 beforeDestory, 然后解除 watchers、child components 以及 listeners,最后就destroyed了, 那么他的生命也就结束了。

    总结来说: 是 new Vue() 开启了vue实例的生命周期, vm.$destroy() 结束了vue实例的生命周期。

    当然了,对于不同的生命周期,都对应着相应的钩子函数,且一共有8个钩子函数,如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>vue</title>
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="example">
            <p>朱振伟</p>
            {{message}}
        </div>
        <script>
            var example=new Vue({
                el:'#example',
                beforeCreate () {
                    alert("beforeCreate");
                },
                created () {
                    alert("created");
                },
                beforeMount () {
                    alert("beforeMount"); 
                },
                mounted () {
                    alert("mounted");
                },
                beforeUpdate () {
                    alert("beforeUpdate");
                },
                updated () {
                    alert("updated");
                },
                beforeDestroy () {
                    alert("beforeDestroy");
                },
                destroyed () {
                    alert("destroyed");
                }
            });
        </script>
    </body>
    </html>

    当我们运行之后,会发现,beforeCreate、created、beforeMount、mounted以此触发,如果我们在控制台输入 example.message = "JohnZhu"; 那么就又会依次触发 beforeUpdate 和 updated 对应的钩子函数, 如果我们在控制台输入 example.$destroy() 那么就会依次触发 beforeDestroy 和 destroyed 对应的钩子函数。

    生命周期大概就是这样了。

    补充: 

      除了在vue官网(上图)中提到的生命周期钩子之后,vue2中还添加了 activated 和 deactivated 钩子函数,当渲染的组件启用了 keep-alive 时,那么进入一个路由指定的组件时,就会调用 activated 钩子函数,如果一个组件没有设定 keep-alive ,那么就不会调用 activated 钩子函数, 而是调用 deactivated 钩子函数。

      比如:

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

      这里的 router-view 是所有的页面都会在这里渲染的,而 keep-alive 又包裹在这之外,所以说这个app中的所有路由在切换时都会调用 activated 钩子函数。

     

    单文件组件下的生命周期

      先看下面这个例子:

    <template>
        <div class="personal-wrap">
          <Personal></Personal>
          <button v-on:click="exit" class="btn" v-if="loginBool">退出登录</button>
          <button v-on:click="login" class="btn btn-login" v-else>现在登录</button>
          <FooterMenu></FooterMenu>
        </div>
    </template>
    
    <script>
      import FooterMenu from '@components/menu';
      import Personal from '@components/personal';
      import {mapState,mapMutations, mapActions} from 'vuex'
      export default {
        components: {
          FooterMenu,
          Personal
        },
    
        data () {
          return {
            loginBool: Boolean(sessionStorage.getItem("loginBool"))
          }
        },
    
    
        methods: {
          ...mapMutations([
            'UPDATE_PICTURES'
          ]),
          ...mapActions([
            'loginWx'
          ]),
    
          exit: function () {
            var result = confirm("确认注销登录?");
            if (result ==  true) {
              window.location.href =  window.location.href.replace(window.location.search, "");
            }
          },
          login: function () {
            this.loginWx(2);
          }
        },
        beforeCreate () {
          document.title = "替换之后";
        },
        created () {
          this.UPDATE_PICTURES(3);
          alert( 'created' + JSON.stringify(document.querySelector('.btn')));
        },
        beforeMount () {
          alert( 'beforeMounte' + JSON.stringify(document.querySelector('.btn')));
        },
        mounted () {
          alert( 'mounted' + JSON.stringify(document.querySelector('.btn')));
        }
    
      }
    </script>

      这是一个单文件组件,因为只是为了说明生命周期的使用,删去了一部分。

    • beforeCreate 是在创建data之前的钩子,即这时刚刚创建完Vue实例,然后el,data这些还都没有,但是因为这是单文件组件,所以,document.title是可以访问到的,这点值得注意。并且由于这时候是没有data和method可以使用的,所以不能使用method下的方法。
    • 接着在created之后,el仍然是没有挂载的,但是data已经初始化完成了,并且一些方法(methods)也已经可以使用了,没有挂载,所以访问不到单组件中的html元素。
    • boforeMount 这时仍然没有挂载,只是开始调用了render函数,同样,没有挂载,也是访问不到vue单组件中的html元素的。
    • 在mounted之后, 这时已经将vue和组件联系起来,挂载完成,所以就可以得到其中的html元素了。

     

    常用的钩子

      可以看出,我们可以在beforeCreate中使用一些操作document的方法。 在created中可以使用大部分的方法。 在 mounted中可以使用与挂载元素相关的一些方法,如操作dom。

    补充: 当然,因为localStorage这种东西都是一直存在的,所以在任何生命周期下都是可以正常访问 localStorage 和 sessionStorage的。

  • 相关阅读:
    亚马逊云服务器VPS Amazon EC2 免费VPS主机配置CentOS及其它内容
    Linux + Mono 目前已经支持Entity Framework 6.1
    CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
    Linux CentOS下如何确认MySQL服务已经启动
    C#使用Timer.Interval指定时间间隔与指定时间执行事件
    MySQL数据库有外键约束时使用truncate命令的办法
    C++中字符和字符串的读取与使用
    结构体的运算符重载
    P1358 扑克牌
    P1284 三角形牧场
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/6903158.html
Copyright © 2011-2022 走看看