【学习笔记04】生命周期的钩子函数

news2024/11/19 0:44:18

目录

    • 一、生命周期的钩子函数
    • 二、创建阶段
    • 三、挂载阶段
    • 四、父子组件创建和挂载阶段钩子函数的执行次序
    • 五、更新阶段
    • 六、销毁阶段
    • 七、复习和补充
      • 1、MVVM
      • 2、v-for中的key值
      • 3、$nextTick


一、生命周期的钩子函数

  • 在组件的生命周期的过程中自动的调用的函数,叫做生命周期的钩子函数
    在这里插入图片描述

二、创建阶段

  • beforeCreate :组件实例初始化之后,自动调用
  • created :组件实例完成所有状态相关的处理之后会自动调用 ,可以拿到数据
    <div id="box">
        {{a}}
        <input type="text" id="abc" ref="txt">
        <!-- ref既可以标识节点,也可以标识组件,标识组件后,就可以访问组件的数据,调用组件的方法 -->
        <Child ref="child"></Child>
    </div>
    <script>
        let Child = {
            template: `
            <div>
                child<input type='text' v-model="str"  />
            </div>`,
            data() {
                return {
                    str: "init"
                }
            },
        }
        Vue.createApp({
            components: {
                Child
            },
            data() {
                return {
                    a: 123
                }
            },
            beforeCreate() {  //拿不到任何数据
                console.log("beforeCreate:", this.a);
            },
            created() {  //可以拿到数据
                console.log("created:", this.a)
            },
        }).mount("#box")
    </script>

在这里插入图片描述

三、挂载阶段

  • boforeMount:组件挂载前自动调用
  • mounted:组件挂载后自动调用 ,不但可以拿到数据,还可以拿到真实的dom节点
    <div id="box">
        {{a}}
        <input type="text" id="abc" ref="txt">
        <!-- ref既可以标识节点,也可以标识组件  标识组件后,就可以访问组件的数据,调用组件的方法 -->
        <Child ref="child"></Child>
    </div>
    <script>
        let Child = {
            template: `<div>child
                    <input type='text' v-model="str"  />
                </div>`,
            data() {
                return {
                    str: "init"
                }
            },
            methods: {
                fun() {
                    console.log("Fun")
                }
            }
        }
        Vue.createApp({
            components: {
                Child
            },
            data() {
                return {
                    a: 123
                }
            },
            beforeMount() {
                console.log("app beforeMount:", this.a, this)
            },
            mounted() {
                console.log("app mounted:", this.a, this)
                //拿到文本框节点
                // let txt = document.getElementById("abc");
                let txt = this.$refs.txt;
                console.log(txt);
                txt.focus();
                console.log(this.$refs.child.str)  //父组件通过ref标识访问子组件的数据
                this.$refs.child.str = this.a      //父组件通过ref修改子组件的数据
                this.$refs.child.fun()             //父组件通过ref调用子组件的方法
            }

        }).mount("#box")
    </script>

在这里插入图片描述

ref可以标识组件 ,父组件可以读写子组件里的数据,也可以访问子组件里的方法
<input type="text"  ref="txt">
this.$refs.ref的标识  就可以拿到节点了

四、父子组件创建和挂载阶段钩子函数的执行次序

  1. app beforeCreate
  2. app created
  3. app beforeMount
  4. child beforeCreate
  5. child created
  6. child beforeMount
  7. child mounted
  8. app mounted
    <div id="box">
        <Child></Child>
    </div>
    <script>
        let Child = {
            template: `<div>child</div>`,
            beforeCreate() {
                console.log("child beforeCreate")
            },
            created() {
                console.log("child created")
            },
            beforeMount() {
                console.log("child beforeMount");
            },
            mounted() {
                console.log("child mounted");
            },
        }
        Vue.createApp({
            components: {
                Child
            },
            beforeCreate() {
                console.log("app beforeCreate")
            },
            created() {
                console.log("app created")
            },
            beforeMount() {
                console.log("app beforeMount");
            },
            mounted() {
                console.log("app mounted");
            },
            data() {
                return {
                }
            },
        }).mount("#box")
    </script>

在这里插入图片描述

五、更新阶段

  • beforeUpdate:组件因为一个响应式状态改变后,更新dom树之前自动调用
  • updated:组件因为一个响应式状态改变后,更新 dom树之后自动调用
    <div id="box">
        <Child v-if="flag"></Child>
        {{k}} <button @click="k++">+k</button> <br>
        {{n}} <button @click="n++">+n</button> <br>
        {{obj.a}} <button @click="obj.a++">obj.a++</button> <br>
    </div>
    <script>
        let Child = {
            template: `<div>child</div>`,
        }
        let app = Vue.createApp({
            components: {
                Child
            },
            beforeUpdate() {    //监控组件里的所有数据变化
                console.log("app beforeUpdate", this.k)
            },
            updated() {
                console.log("app updated", this.k)
            },
            beforeUnmount() {
                console.log("app beforeUnmount")
            },
            unmounted() {
                console.log("app unmounted")
            },
            watch: {  //监听组件里特定数据的变化
                k(n, o) {
                    console.log(n, o)
                },
                obj: {
                    handler(n) {  //对象的监控要用handler处理
                        console.log(n)
                    },
                    deep: true,  //对象必须是深度监控
                    immediate: true //立即监控
                }
            },
            data() {
                return {
                    k: 1,
                    n: 2,
                    obj: {
                        a: 1
                    },
                    flag: true  //true 渲染Child组件
                }
            },
        })
        app.mount("#box")
    </script>

在这里插入图片描述

六、销毁阶段

  • beforeUnmount:组件卸载前调用,清理资源,防止内存泄露
  • unmounted:组件卸载后调用
    <div id="box">
        <Child v-if="flag"></Child>
        {{k}} <button @click="k++">+k</button> <br>
        {{n}} <button @click="n++">+n</button> <br>
        {{obj.a}} <button @click="obj.a++">obj.a++</button> <br>
        <button @click="kill">kill</button> <br>
        <button @click="flag=false">卸载子组件</button> <br>
    </div>
    <script>
        let Child = {
            template: `<div>child</div>`,
            beforeCreate() {
                console.log("child beforeCreate")
            },
            created() {
                console.log("child created")
            },
            beforeMount() {
                console.log("child beforeMount");
            },
            mounted() {
                console.log("child mounted");
                this.timer = setInterval(() => {
                    console.log(111)
                }, 1000)
            },
            beforeUnmount() {
                console.log("child beforeUnmount")
                clearInterval(this.timer)
            },
            unmounted() {
                console.log("child unmounted");
            }
        }
        let app = Vue.createApp({
            components: {
                Child
            },
            methods: {
                kill() {
                    app.unmount();  //卸载组件
                }
            },
            beforeCreate() {
                console.log("app beforeCreate")
            },
            created() {
                console.log("app created")
            },
            beforeMount() {
                console.log("app beforeMount");
            },
            mounted() {
                console.log("app mounted");
            },
            beforeUpdate() {    //监控组件里的所有数据变化
                console.log("app beforeUpdate", this.k)
            },
            updated() {
                console.log("app updated", this.k)
            },
            beforeUnmount() {
                console.log("app beforeUnmount")
            },
            unmounted() {
                console.log("app unmounted")
            },
            watch: {  //监听组件里特定数据的变化
                k(n, o) {
                    console.log(n, o)
                },
                obj: {
                    handler(n) {  //对象的监控要用handler处理
                        console.log(n)
                    },
                    deep: true,  //对象必须是深度监控
                    immediate: true //立即监控
                }
            },
            data() {
                return {
                    k: 1,
                    n: 2,
                    obj: {
                        a: 1
                    },
                    flag: true  //true 渲染Child组件
                }
            },
        })
        app.mount("#box")
    </script>

在这里插入图片描述

七、复习和补充

1、MVVM

  • M(model):模型层 数据
  • V(view):视图,渲染数据展示数据
  • m (viewModel):视图模型 ,视图和模型沟通的桥梁,模型数据变化了,视图也会变化

2、v-for中的key值

  • vfor 中的key值得作用 ,为了找到修改数据的那个对应的虚拟dom节点的条件之一,能提高比对效率

3、$nextTick

  • 延迟执行回调函数,知道下一次循环dom更新后执行
    <div id="box">
        <ul>
            <!-- 根据key值找到变化前的对应的虚拟dom节点 patch -->
            <!-- 虚拟dom 和 diff算法-->
            <li v-for="item in list" :key="item">
                <input type="checkbox" />
                <span ref="liitem">{{item}}</span>
            </li>
        </ul>
        <button @click="add">insert</button>
    </div>
    <script>
        Vue.createApp({
            data() {
                return {
                    list: ["aa", "bb", 'cc']
                }
            },
            methods: {
                add() {

                    this.list.unshift("dddd")
                    //延迟执行回到。到下一次循环,dom就绪后再执行
                    this.$nextTick(() => {
                        //数据更新后,dom结构并没有立即更新
                        //通过nextTick 下一次循环,dom就更新了
                        console.log(this.$refs.liitem);
                    })

                }
            }
        }).mount("#box")
    </script>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++进阶 多态讲解

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;简单介绍C中多态的概念 多态多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变析构函数的重写C11…

【ML】numpy meshgrid函数使用说明(全网最简单版)

【ML】numpy meshgrid函数使用说明meshgrid的作用&#xff1f;怎么使用&#xff08;举例说明&#xff09;手工描点&#xff08;帮助理解&#xff09;怎么画三维&#xff1f;附画图代码meshgrid的作用&#xff1f; 首先要明白numpy.meshgrid()函数是为了画网格&#xff0c;&…

Systemverilog实现参数化的Round-Robin Arbiter Tree

本篇内容涉及的rtl代码为开源组织PLUP的common cell仓库中的源代码&#xff0c;本文只是对其进行些许解读。源码链接如下&#xff1a;[https://github.com/pulp-platform/common_cells/blob/dc555643226419b7a602f0aa39d449545ea4c1f2/src/rr_arb_tree.sv] “想要快速提升编程能…

基于springboot的公司人事管理系统

1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目&#xff0c;公司人事管理系统。 计算机毕业生设计,课程设计需要帮助的可以找我 源码获取------》 链接&#xff1a;https://pan.baidu.com/s/1CdxrlV7GeRRmsT9UWEMtJg 提取码&#xff1a;cygy 2 设计概要 21世纪…

测试人不得不知的 HTTP 状态码知识

HTTP协议是当前使用最广泛的一种通信协议&#xff0c;在性能测试中&#xff0c;也使用的非常广泛。但是&#xff0c;确有很多人在调试性能测试脚本的时候&#xff0c;弄不明白HTTP状态码&#xff0c;不能通过HTTP状态码做些基本判断&#xff0c;今天&#xff0c;就来给大家好好…

客户终身价值(CLTV)计算和回归预测模型(Python)

内容介绍 本文整理了客户终身价值&#xff08;CLV或者CLTV&#xff09;的相关概念&#xff0c;并对一家英国线上零售公司的一年交易数据进行分析&#xff0c;计算该公司所有客户的CLV并且建立回归预测模型。 一、客户生命周期价值 用户生命周期价值Customer Lifetime value(…

常见实用的锁策略详解

&#x1f388;专栏链接:多线程相关知识详解 目录 1.乐观锁VS悲观锁 2.读写锁VS普通互斥锁 3.轻量级锁VS重量级锁 4.自旋锁VS挂起等待锁 5. 公平锁VS非公平锁 6.可重入锁VS不可重入锁 7.关于synchronized的锁策略以及自适应 1.乐观锁VS悲观锁 乐观锁:预测锁…

Windows中安装配置RabbitMQ

本次安装环境win10&#xff0c;采用版本 OTP 25.0.3https://github.com/erlang/otp/releases/tag/OTP-25.0.3RabbitMQ 3.10.13 Release RabbitMQ 3.10.13 rabbitmq/rabbitmq-server GitHubOpen source RabbitMQ: core server and tier 1 (built-in) plugins - Release Rabbi…

[N1CTF 2018]eating_cms parse_url绕过

index.php <?php require_once "function.php"; if(isset($_SESSION[login] )){Header("Location: user.php?pageinfo"); } else{include "templates/index.html"; } ?> function.php <?php session_start(); require_once &q…

Kafka Producer 自定义 拦截器 序列化

Kafka Producer 拦截器 & 序列化 前言 文章中的版本信息、maven依赖如下 JDK17 kafka_2.13-3.3.1 pom文件 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>…

NR HARQ (四)Type-2 HARQ-ACK codebook

微信同步更新欢迎关注同名modem协议笔记 上篇提到type-1 HARQ-ACK codebook&#xff0c;即semi-static codebook&#xff0c;UE要为每个PDSCH候选位置生成反馈&#xff0c;也会包含实际没有下行传输的PDSCH&#xff0c;再加上配置CBG的场景&#xff0c;HARQ-ACK 码本中包含的无…

【Linux 内核 内存管理】物理内存组织结构

一、 UMA和NUMA两种模型 共享存储型多处理机有两种模型 一致内存访问&#xff08;Uniform-Memory-Access&#xff0c;简称UMA&#xff09;模型 非一致内存访问&#xff08;Nonuniform-Memory-Access&#xff0c;简称NUMA&#xff09;模型 UMA模型 物理存储器被所有处理器件均…

超标量处理器设计——第八章_发射

超标量处理器设计——第八章_发射 参考《超标量处理器》姚永斌著 文章目录超标量处理器设计——第八章_发射8.1 简述8.1.1 集中式 VS. 分布式8.1.2 数据捕捉 VS. 非数据捕捉8.1.3 压缩 VS. 非压缩8.2 发射过程的流水线8.2.1 非数据捕捉结构的流水线8.2.2 数据捕捉结构的流水线8…

随手写系列——写一个凯撒密码转换页面

文章目录先展示效果H5编写C3编写JS编写——方法一&#xff1a;过程版JS编写——方法二&#xff1a;对象版代码获取先展示效果 &#xff08;因为主要是实现功能&#xff0c;所以CSS写的很粗糙&#xff09; H5编写 基础结构如下&#xff1a; 先构成最外面的大盒子.box&#…

【Flutter】之便于提高开发效率的周边库和轮子

GetX 状态管理 GetX包含很多功能&#xff0c;各种弹出widget、路由管理、国际化、Utils、状态管理等。 基于路由管理 1. 添加到项目中 1.1. 将此添加到pubspec.yaml文件中。 get: 4.1.4 1.2. 在命令行中运行 flutter packages get 1.3. 在MaterialApp前面加上 “Get”&…

centos7 yum安装postgreSQL

安装环境centos7.6 安装步骤&#xff1a; 1、安装postgresql&#xff1a; yum install postgresql-server 2、安装postgresql 扩展包&#xff1a; yum install postgresql-contrib 3、初始化&#xff1a; postgresql-setup initdb 4、启动开机自启动&#xff1a; systemc…

说话人识别神经网络推理方式

概述 说话人识别是一个序列总结&#xff08;Sequence Summarization&#xff09;任务&#xff0c;输入是音频&#xff08;或者说&#xff0c;声学特征的序列&#xff09;&#xff0c;输出是说话人的嵌入码&#xff0c;有的神经网络可以输入一对音频&#xff0c;直接输出这对音…

java微信支付v3系列——9.微信支付之商家转账API

这个功能就比较复杂了&#xff0c;首先是得有90天的资金流水才能开通&#xff0c;其次开通后还需要在官网进行配置&#xff0c;不能直接调用&#xff0c;并且限制了IP地址。 如下图所示&#xff0c;首先需要进行产品设置&#xff0c;将里面都设置好后才能进行开发&#xff0c;…

feign 调用常见问题避坑指南!

摘要&#xff1a;主要是总结了一下这段时间在使用 feign 的过程中的遇到的一些坑点。一、Get请求自动转化成POST的问题1、client 请求参数没有加上 RequestParam 注解问题代码&#xff1a;GetMapping("/showName") String showName(String name);错误提示&#xff1a…

让 APISpace 告诉你什么场景使用什么API

Q1&#xff1a;某商家打算搞年底促销活动&#xff0c;需要将活动信息通过短信的形式通知给用户&#xff0c;这个场景可以用什么接口&#xff1f; 发送通知类的短信&#xff0c;可以使用 通知短信 API~ 通知短信&#xff0c;支持三大运营商&#xff0c;虚拟运营商短信发送&…