Vue 生命周期篇探索 - 第二篇:生命周期-挂载流程

探索学习 Vue 生命周期篇

Vue 官网: https://cn.vuejs.org/v2/guide/forms.html
尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通 https://www.bilibili.com/

第二篇:生命周期-挂载流程

以图例分析挂载流程

-在这里插入图片描述

  • 针对图做详细的说明:
    • 生命周期它是一个函数,需要Vue 来帮我们调用;
    • 绿色的图示,他只是一个环节,我们想干预是干预不了的,它也不是一个函数,就是一个环节;这个环节执行完之后,他会帮忙去调用Vue 的生命周期函数
    • 黄色的图示,他只是一个判断,

1. new Vue

  • new Vue 引出,所有的流程,步骤都以new Vue 开始,没有new Vue 下面所有的就没有了意义

2. init Events & Lifecycle

  • 初始化事件和生命周期
    • 这个环节主要是去制定一些规则,比如说
    1. 生命周期函数到底有几个,都叫什么名,什么时候去调用;
    2. 还有关于事件的,比如事件修饰符 拿once 来说,它叫一次性事件修改符,这里会制定规则,以后我们遇到 once 之后怎么处理事件,都需要在这个环节做好设定,要如何进行操作;
    3. 在这一环境中 new Vue 传入的 data Vm 还没有收到,Vm 身上还没有**_data** _data 都没有,那么就更不用说data 身上的其它属性了;

3. beforeCreate(创建前)

  • 此时:无法通过VM访问到data 中的数据,methods中的方法
  • 在这一周期中因为还没有收到data _data也没有收到 数据代理也没有, 就更不用提怎么拿vm 中的数据了;
  • 验证如下,定义beforeCreate 输出日志,debugger 卡断点 F12 观察Vue 实例情况
  • 上代码
     <div id="root">
            <h1>你好,{{name}}</h1>
            <hr/>
            <h2>当前的n 值为{{n}}</h2>
            <button @click="add"> 点我n++</button>
        </div>
    <script type="text/javascript">
        Vue.config.productionTip = false //设置为 false 以阻止 vue 在启动时生成生产提示
        new Vue({
            el: "#root",
            data: {
                name: "安锐捷",
                n: 1,
            },
            methods: {
                add(){
                    this.n++
                }
            },
            beforeCreate() {
                console.log("beforeCreate: comming");
                console.log("beforeCreate:",this);
                debugger
            },
        })
    </script>
    
    F12 观察图例
    在这里插入图片描述

4. init injections & reactivity

  • init injections & reactivity(初始化数据监测,数据代理)
  • 注入响应式 也就是说初始化数据监测,数据代理
    • 在这个环节也在初始化,初始化什么呢?
    1. Vue 中最重要的 数据监测、 数据代理,就是在这里初始化的
    2. 我们之前了解的Vue 如何进行数据监测对象变化 、监测数组变化 ,给对象中属性匹配getter/setter ,对操作数组进行二次的包装,都是在这里完成的;
    3. 还有之分析的数据代理 Object.defineProperty,也是在这个环节完成的
    4. 引出我们的周期函数 beforeCreate created 创建之前、创建之后; 在什么创建之前、创建之后呢?? 这里说的就是:数据监测、数据代理 创建之前、创建之后

5. created(创建后)

  • created (此时: 可以通过VM访问到data 中的数据,methods中配置的的方法)
    • 前面的环节已经完成了 数据监测,数据代理,这一周期中就是完成后的初次应用
    • 直接上代码观察 分析初始化的结果
    • 验证如下,定义created 输出日志,debugger 卡断点 F12 观察Vue 实例情况
       <div id="root">
              <h1>你好,{{name}}</h1>
              <hr/>
              <h2>当前的n 值为{{n}}</h2>
              <button @click="add"> 点我n++</button>
          </div>
          <script type="text/javascript">
              Vue.config.productionTip = false //设置为 false 以阻止 vue 在启动时生成生产提示
              new Vue({
                  el: "#root",
                  data: {
                  name: "安锐捷",
                  n: 1,
                  },
                  methods: {
                      add(){
                          this.n++
                      }
                  },
                  beforeCreate() {
                      console.log("beforeCreate");
                      console.log("beforeCreate:",this);
                  },
                  created() {
                      console.log("created");
                      console.log("created:",this);
                      debugger
                  },
              })
          </script>
      
    • F12 观察Vue 实例情况
      在这里插入图片描述

6. Has “el” options

  • Has “el” options? 条件判断(这里所说的就是 new Vue 的时候有没有传入 el 的配置项?)

    1. YES 代码 new Vue({ el: '#root', data: {}} )
      • Has “template” options
        1. YES: 代码 new Vue({ el: '#root', template:'', data: {}} )
          • complate template into render function ()
        2. NO 代码 new Vue({ el: '#root', data: {}} )
          • compile el’s outerHTML as template (编译外部的html 作为模板)
    2. NO 代码 new Vue({data:{}})
      1. when vm.$mount(el) is caled
  • 细节:当使用template 配置项时

    1. 细节1 ,建议参数使用ES6 写法的 模板字符串形式,
      template: <h2>当前n的值是:{{n}}</h2><button @click="add">点我n+1</button>
    2. 细节2 ,template 中有且只有一个根节点,根节点必须是唯一的
      如 细节1中写法其实是错误的,正确写法应该是如下,模板中内容使用**
      **包起来
      template: <div> <h2>当前n的值是:{{n}}</h2><button @click="add">点我n+1</button> </div>

    在以上整个大的阶段执行的过程中,就会开始解析模板比如插值表达式,@click,自定义标签等等都开始解析了,完事之后,就会生成虚拟DOM(内存中),页面还不能显示解析好的内容 (这里还没有给页面挂载)

    如下流程图,观察当前所处的流程图位置在这里插入图片描述

7. beforeMount(挂载前)

  • beforeMount(此时,页面呈现的是未经Vue编译的DOM结构,所有的DOM的操作,最终都不奏效)
    • 挂前操作 在第6步编译完虚拟DOM 本方法中加断点 观察页面情况
    • 验证如下,定义beforeMount 输出日志,debugger 卡断点 F12 观察Vue 实例情况
      <div id="root">
          <h1>你好,{{name}}</h1>
          <hr/>
          <h2>当前的n 值为{{n}}</h2>
          <button @click="add"> 点我n++</button>
      </div>
      <script type="text/javascript">
          Vue.config.productionTip = false //设置为 false 以阻止 vue 在启动时生成生产提示
          new Vue({
              el: "#root",
              data: {
              name: "安锐捷",
              n: 1,
              },
              methods: {
                  add(){
                      this.n++
                  }
              },
              beforeCreate() {
                  console.log("beforeCreate");
                  console.log("beforeCreate:",this);
              },
              created() {
                  console.log("created");
                  console.log("created:",this);
              },
              beforeMount() {
                  console.log("beforeMount");
                  console.log("beforeMount:",this);
                  debugger
              },
          })
      
      在这里插入图片描述

8. Create vm.$el and replace “el” with is

  • Create vm.$el and replace “el” with is (将内存中的虚拟DOM转为真实DOM插入页面)
    • 创建一个vm 身上的$el 选项,然后替换掉整个 el 也就是使用$el 替换掉容器中的 el
    • 就在这一步,Vue会把生成的虚拟DOM转为真实Dom,转为真实DOM之后,他给vm.$el 上存储了一份
    • 存这个的目的主要是为了后期有需要复用的节点,直接使用即可
    • 在这里插入图片描述

9. mounted(挂载后)

  • 此时,页面呈现的是经过Vue编译的DOM,对DOM的编译操作均有效(尽可能避免)。
  • 挂载操作 执行完这一步页面解析完成,渲染完成,直接上代码,图例观察
  • 直接上代码
 <div id="root">
         <h1>你好,{{name}}</h1>
         <hr/>
         <h2>当前的n 值为{{n}}</h2>
         <button @click="add"> 点我n++</button>
   </div>
   <script type="text/javascript">
         Vue.config.productionTip = false //设置为 false 以阻止 vue 在启动时生成生产提示
         new Vue({
             el: "#root",
             data: {
             name: "安锐捷",
             n: 1,
             },
             methods: {
                 add(){
                     this.n++
                 }
             },
             beforeCreate() {
                 console.log("beforeCreate");
                 console.log("beforeCreate:",this);
             },
             created() {
                 console.log("created");
                 console.log("created:",this);
             },
             beforeMount() {
                 console.log("beforeMount");
                 console.log("beforeMount:",this);
             },
             mounted() {
                 console.log("mounted");
                 console.log("mounted:",this);
                 debugger
             },
         })
     </script>
  • F12 观察页面情况
    在这里插入图片描述
  • 至此初始化过程结束,
  • 一般在此进行:开启定时器、发送网络请求、订阅消息、绑定自定义事件、等初始化操作
  • 《劝学》颜真卿
  • 三更灯火五更鸡,正是男儿发愤时。
  • 黑发不知勤学早,白首方悔读书迟。

创作不易,欢迎 多多点赞,收藏 各节里面总结的还有不到位的欢迎指证
邮箱:pymxb1991@163.com
微信:py_mxb
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值