谷粒商城实战笔记-42-前端基础-Vue-生命周期和钩子函数

news2024/9/21 0:45:00

下面是Vue官网关于生命周期及不同阶段的钩子函数的图示。
在这里插入图片描述

Vue 实例生命周期是指从一个组件被创建到最终被销毁的整个过程。

在这一过程中,Vue 提供了一系列的“钩子”函数,在生命周期的不同阶段执行自定义的代码。

以下是 Vue 对象生命周期的主要阶段和对应的钩子函数:

一,组件声明周期各阶段

1,创建阶段

  • beforeCreate: 在实例初始化之后,数据观测 (data observer) 和事件/ watcher 事件配置之前被调用。
  • created: 实例创建完成后被立即调用。此时,实例已经完成数据观测和属性、方法的运算,但 $el 尚未被编译和挂载。
  • beforeMount: 在挂载开始之前被调用:相关的 render 函数首次被调用。
  • mounted: el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

2,运行阶段

  • beforeUpdate: 数据更新时调用,发生在虚拟 DOM 打补丁之前。
  • updated: 组件 DOM 更新后调用,当这个钩子被调用时,组件 DOM 已经更新,但是可能子组件还没有更新。

3,销毁阶段

  • beforeDestroy: 实例销毁之前调用。在这一步,实例仍然完全可用。
  • destroyed: Vue 实例销毁后调用。在这一步,所有事件监听器会被移除,所有的子实例也会被销毁。

4,错误处理

  • errorCaptured: 错误捕获钩子,当捕获一个来自后代组件的错误时被调用。

5,如何定义和使用钩子函数

钩子函数可以在 Vue 的选项对象中定义,如下所示:

export default {
  // 创建阶段
  beforeCreate() {
    console.log('beforeCreate');
  },
  created() {
    console.log('created');
    // 这里可以访问 this 对象并进行数据的初始化
  },
  beforeMount() {
    console.log('beforeMount');
  },
  mounted() {
    console.log('mounted');
    // 这里可以访问真实的 DOM 元素,如 this.$el
  },

  // 运行阶段
  beforeUpdate() {
    console.log('beforeUpdate');
  },
  updated() {
    console.log('updated');
  },

  // 销毁阶段
  beforeDestroy() {
    console.log('beforeDestroy');
  },
  destroyed() {
    console.log('destroyed');
  },

  // 错误处理
  errorCaptured(err, instance, info) {
    console.error(`Error captured in component: ${err}`);
    return false; // 返回 false 表示不再向上冒泡错误
  }
}

6,注意事项

  • 不要在 beforeCreatecreated 钩子函数中访问 DOM,因为在这两个阶段 DOM 还没有生成。
  • mounted 钩子函数中可以安全地访问和操作 DOM。
  • 如果你在组件中使用了异步数据加载,那么最好在 created 或者 mounted 钩子中进行,以便确保数据在 DOM 渲染之前或之后加载。
  • beforeDestroy 可以用来清除定时器、事件监听器等资源,而 destroyed 可以确认这些资源已经被清理。

二,实战

1,实战案例

下面通过一个案例来说明Vue的生命周期。

创建一个Vue对象,并使用钩子函数。

      let app = new Vue({
            el: "#app",
            data: {
                name: "张三",
                num: 100
            },
            methods: {
                show() {
                    return this.name;
                },
                add() {
                    this.num++;
                }
            },
            beforeCreate() {
                console.log("=========beforeCreate=============");
                console.log("数据模型未加载:" + this.name, this.num);
                console.log("方法未加载:" + this.show());
                console.log("html模板未加载:" + document.getElementById("num"));
            },
            created: function () {
                console.log("=========created=============");
                console.log("数据模型已加载:" + this.name, this.num);
                console.log("方法已加载:" + this.show());
                console.log("html模板已加载:" + document.getElementById("num"));
                console.log("html模板未渲染:" + document.getElementById("num").innerText);
            },
            beforeMount() {
                console.log("=========beforeMount=============");
                console.log("html模板未渲染:" + document.getElementById("num").innerText);
            },
            mounted() {
                console.log("=========mounted=============");
                console.log("html模板已渲染:" + document.getElementById("num").innerText);
            },
            beforeUpdate() {
                console.log("=========beforeUpdate=============");
                console.log("数据模型已更新:" + this.num);
                console.log("html模板未更新:" + document.getElementById("num").innerText);
            },
            updated() {
                console.log("=========updated=============");
                console.log("数据模型已更新:" + this.num);
                console.log("html模板已更新:" + document.getElementById("num").innerText);
            }
        });

在这里插入图片描述

如上图,浏览器中运行这段代码时,看到以下的日志输出顺序:

  1. beforeCreate 被调用:

    • 因为 beforeCreate 被调用时,Vue 实例的数据和方法都尚未初始化,所以 this 上还无法访问 name, num, show 方法,尝试访问会得到 undefined
    • 由于此时 DOM 还未生成,document.getElementById("num") 也会返回 null
  2. created 被调用:

    • 此时,数据和方法已经初始化,因此可以访问 name, num, show 方法。
    • 但是,HTML 模板尚未被渲染,document.getElementById("num") 可能返回页面上的元素,但其 innerText 属性仍为空或显示初始值。
  3. beforeMount 被调用:

    • 这个钩子在挂载开始前被调用,此时 DOM 元素已经存在,但是模板还未被 Vue 替换和渲染,所以 document.getElementById("num").innerText 依然显示的是未替换的原始内容。
  4. mounted 被调用:

    • 这个钩子在挂载完成后被调用,此时 DOM 已经被 Vue 替换并渲染,所以 document.getElementById("num").innerText 显示的是经过 Vue 替换后的值。
  5. num 发生变化时(例如通过调用 add 方法),beforeUpdateupdated 分别在更新前和更新后被调用:

    • beforeUpdate 中,num 的值已经是更新后的值,但是 DOM 还没有更新。
    • updated 中,num 的值依然是更新后的值,且 DOM 也已经更新完毕。

请注意,在 beforeCreatecreated 钩子中,尝试调用 this.show() 或访问 this.namethis.num 可能不会像预期那样工作,因为在 beforeCreate 阶段,this 指向的 Vue 实例尚未完全初始化。然而在 created 阶段,所有的数据和方法都已可用。

如果在你的 HTML 模板中有一个元素的 ID 为 “num” 并且使用了 {{ num }} 插值表达式,那么在 mountedupdated 钩子中,document.getElementById("num").innerText 应该会返回正确的数值。如果没有这样的元素,那么在任何钩子中尝试获取这个元素都会返回 null

2,完整代码

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <span id="num">{{num}}</span>
        <button @click="num++">赞!</button>
        <h2>{{name}},有{{num}}个人点赞</h2>
    </div>

    <script src="../node_modules/vue/dist/vue.js"></script>
    
    <script>
        let app = new Vue({
            el: "#app",
            data: {
                name: "张三",
                num: 100
            },
            methods: {
                show() {
                    return this.name;
                },
                add() {
                    this.num++;
                }
            },
            beforeCreate() {
                console.log("=========beforeCreate=============");
                console.log("数据模型未加载:" + this.name, this.num);
                console.log("方法未加载:" + this.show());
                console.log("html模板未加载:" + document.getElementById("num"));
            },
            created: function () {
                console.log("=========created=============");
                console.log("数据模型已加载:" + this.name, this.num);
                console.log("方法已加载:" + this.show());
                console.log("html模板已加载:" + document.getElementById("num"));
                console.log("html模板未渲染:" + document.getElementById("num").innerText);
            },
            beforeMount() {
                console.log("=========beforeMount=============");
                console.log("html模板未渲染:" + document.getElementById("num").innerText);
            },
            mounted() {
                console.log("=========mounted=============");
                console.log("html模板已渲染:" + document.getElementById("num").innerText);
            },
            beforeUpdate() {
                console.log("=========beforeUpdate=============");
                console.log("数据模型已更新:" + this.num);
                console.log("html模板未更新:" + document.getElementById("num").innerText);
            },
            updated() {
                console.log("=========updated=============");
                console.log("数据模型已更新:" + this.num);
                console.log("html模板已更新:" + document.getElementById("num").innerText);
            }
        });
    </script>
</body>

</html>

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

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

相关文章

C语言实现二叉树以及二叉树的详细介绍

目录 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 3.二叉树顺序结构--特殊的二叉树--堆及其实现 3.1堆的概念及结构 3.2堆的实现 3.2.1堆的结构 3.2.2堆…

filebeat生产环境配置

配置文件属性 生产配置 filebeat.inputs: - type: logenabled: truepaths: - /tmp/logs/*.log- /var/log/system.log- /var/log/wifi.logsymlinks: truejson.keys_under_root: truejson.message_key: xxxjson.add_error_key: true# 如果想卡部分日志&#xff0c;比如用时间作…

Monaco 使用 HoverProvider

Monaco 中自定义 Hover&#xff0c;Hover 效果是指当鼠标移动文字上展示出提示效果&#xff0c;就像页面上的 Tooltip 效果。最终页面的显示效果如下&#xff1a; 通过 registerHoverProvider 注册 Hover 触发时的处理方法 接口中提供了 4 个参数&#xff0c;前两个参数比较重…

python学习之闭包与装饰器

一、闭包 闭包允许一个函数访问并操作函数外部的变量&#xff08;即父级作用域中的变量&#xff09;&#xff0c;即使在该函数外部执行。 特性&#xff1a; (1)外部函数嵌套内部函数。 (2)外部函数可以返回内部函数。 (3)内部函数可以访问外部函数的局部变量。 def out()…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途&#xff1a;边界提取器(Boundary Extractor)是放在Sample请求之后执行的&#xff0c;用于获取左右边界中间的所有字符&#xf…

Windows配置Qt+VLC

文章目录 前言下载库文件提取文件编写qmakeqtvlc测试代码 总结 前言 在Windows平台上配置Qt和VLC是开发多媒体应用程序的一个重要步骤。Qt作为一个强大的跨平台应用开发框架&#xff0c;为开发人员提供了丰富的GUI工具和库&#xff0c;而VLC则是一个开源的多媒体播放器&#x…

基于STM32的农业大棚温湿度采集控制系统的设计

目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 &#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…

451.根据字符出现频率排序(中等)

451.根据字符出现频率排序&#xff08;中等&#xff09; 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;451.根据字符出现频率排序&#xff08;中等&#xff09; 2.详细题解 题目&#xff1a; 347. 前 K 个高频元素&#xff08;中等&am…

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…

数学基础【俗说矩阵】:初等矩阵和矩阵的初等行变化关系推导

初等矩阵和矩阵的初等行变换 初等矩阵 矩阵的初等行变换 对单位阵E进行一次初等行变化得到的阵叫做初等阵。 这里只能进行一次初等行变换。 置换阵 给矩阵【左乘】一个【置换阵】&#xff0c;相当与对该矩阵进行了一次【置换阵】对应的【置换】初等行变换&#xff1b; 数…

爬取百度图片,想爬谁就爬谁

前言 既然是做爬虫&#xff0c;那么肯定就会有一些小心思&#xff0c;比如去获取一些自己喜欢的资料等。 去百度图片去抓取图片吧 打开百度图片网站&#xff0c;点击搜索xxx&#xff0c;打开后&#xff0c;滚动滚动条&#xff0c;发现滚动条越来越小&#xff0c;说明图片加载…

Wordpress文章分享到微信朋友圈不带图像问题的解决

目录 一、插件选择 二、插件安装 三、获取微信公众号管理信息 1、登录微信公众平台 2、配置“JS接口安全域名” 3、至安全中心设置“IP白名单” 4、获得“开发者ID(AppID)” 5、获得“开发者密码(AppSecret)” 四、配置插件 五、验证 WordPress装配好后&#xff0c;可…

10.11和10.8那个大(各种ai的回答)

问题&#xff1a;10.11和10.8两个数哪个大 腾讯混元 ✔️ chatGPT ❎ 通义千问 ❎ 文心一言 ✔️ 智谱清言 ❎ 讯飞星火 ✔️ C知道 ❎ 豆包 ✔️

matlab 声音信号希尔伯特黄变换

1、内容简介 略 91-可以交流、咨询、答疑 2、内容说明 略 Hilbert-Huang变换&#xff08;HHT&#xff09;是一种基于经验的数据分析方法 方法。它的扩展基础是自适应的&#xff0c;因此它可以从非线性和非平稳过程中产生具有物理意义的数据表示。这个 适应性的优势是有代价…

代码随想录第二天 | 数组 | 双指针法、滑动窗口、螺旋数组

来源 代码随想录数组第二天 有序数组的平方 数组其实是有序的&#xff0c; 只不过负数平方之后可能成为最大数了。 那么数组平方的最大值就在数组的两端&#xff0c;不是最左边就是最右边&#xff0c;不可能是中间。 此时可以考虑双指针法了&#xff0c;i指向起始位置&…

matlab永磁同步电机反馈试验装置的设计和永磁同步电机仿真

1、内容简介 略 85-可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;得益于电力电子器件及控制技术的高速发展&#xff0c;使得电机的应用越来越方便及精确&#xff0c;适应了实际应用对电机性能及质量提出的更高要求和标准。同时电机测试技术也因为电力电子技术的发…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…

Idea中git如何进行回退操作

当你的代码已经提交并且推送到远程仓库了如何进行回退 1.首先找到你需要回退到的提交记录 假设你要回退到当前大营销模板位置&#xff0c;右键当前分支然后选中rest 点击后&#xff0c;若需要保留之前提交记录到本地则可以选择max或者soft 选择后进行回退操作&#xff0c;最后将…

全代码 | 随机森林在回归分析中的经典应用

公众号后台记录了发表过文章的各项阅读指标包括&#xff1a;内容标题&#xff0c;总阅读人数&#xff0c;总阅读次数&#xff0c;总分享人数&#xff0c;总分享次数&#xff0c;阅读后关注人数&#xff0c;送达阅读率&#xff0c;分享产生阅读次数&#xff0c;首次分享率&#…

《低代码指南》——Oracle APEX : AI在低代码开发中的创新应用

在低代码开发领域,我们正在目睹人工智能(AI)集成所带来的显著进展。Oracle公司最新推出的APEX 24.1版本,便是这一趋势的明显体现,其集成的AI功能旨在极大提高开发者的生产力,同时简化应用程序的创建过程。 Contents 将变革性的AI整合到低代码平台 将AI技术引入低代码平台…