了解 Vue.js 生命周期挂钩

2023-11-15

介绍

生命周期挂钩是了解您正在使用的库如何在幕后工作的窗口。生命周期钩子允许您知道组件何时被创建、添加到 DOM、更新或销毁。

本文将向您介绍 Vue.js 中的创建、安装、更新和销毁钩子。

先决条件

要完成本教程,您需要:

  • 熟悉 Vue.js。阅读如何使用 Vue.js 开发网站系列以了解更多信息。

了解创建挂钩(初始化)

创作挂钩是在组件中运行的第一个钩子。它们允许您在组件添加到 DOM 之前执行操作。与任何其他挂钩不同,创建挂钩也在服务器端渲染期间运行。

如果您需要在客户端渲染和服务器渲染期间在组件中进行设置,请使用创建挂钩。

您将无权访问 DOM 或目标安装元素(this.$el) 在创建挂钩内。

beforeCreate

The beforeCreate钩子在组件初始化时运行 -data尚未做出反应,并且events尚未设置:

示例组件.vue
<script>
export default {
  beforeCreate() {
    console.log('At this point, events and lifecycle have been initialized.')
  }
}
</script>

在此示例中,当beforeCreate挂钩运行后,此代码片段将记录消息:

Output
At this point, events and lifecycle have been initialized.

created

The created钩子在模板和虚拟 DOM 被安装或渲染之前运行 - 您可以访问响应式data and events活跃的:

示例组件.vue
<template>
  <div ref="example-element">{{ propertyComputed }}</div>
</template>

<script>
export default {
  data() {
    return {
      property: 'Example property.'
    }
  },

  computed: {
    propertyComputed() {
      return this.property
    }
  },

  created() {
    console.log('At this point, this.property is now reactive and propertyComputed will update.')
    this.property = 'Example property updated.'
  }
}
</script>

在此示例中,片段将存储property as Example property。当。。。的时候created钩子运行后,它会记录一条消息:

Output
At this point, this.property is now reactive and propertyComputed will update.

进而property更改为Example property updated.

在生命周期的后期,{{ propertyComputed }}将显示为Example property updated代替Example property.

在此步骤中,您查看了创建挂钩的一些示例,并准备好进入生命周期的下一部分:安装挂钩。

了解安装挂钩(DOM 插入)

安装挂钩通常是最常用的钩子。它们允许您在第一次渲染之前和之后立即访问您的组件。但是,它们不会在服务器端渲染期间运行。

如果您需要在初始渲染之前或之后立即访问或修改组件的 DOM,请使用安装挂钩。

如果您需要在初始化时为组件获取一些数据,请不要使用安装挂钩。

Note: Use created (or created and activated for keep-alive组件)为此。特别是当您在服务器端渲染期间需要该数据时。

beforeMount

The beforeMount钩子在初始渲染发生之前以及模板或渲染函数编译之后运行:

示例组件.vue
<script>
export default {
  beforeMount() {
    console.log(`At this point, vm.$el has not been created yet.`)
  }
}
</script>

在此示例中,当beforeMount挂钩运行后,此代码片段将记录消息:

Output
At this point, vm.$el has not been created yet.

mounted

In the mounted钩子后,您将可以完全访问反应式组件、模板和渲染的 DOM(通过this.$el).

Use mounted用于修改 DOM,特别是在集成非 Vue 库时:

示例组件.vue
<template>
  <div ref="example-element">Example component.</div>
</template>

<script>
export default {
  mounted() {
    console.log(`At this point, vm.$el has been created and el has been replaced.`);
    console.log(this.$el.textContent) // Example component.
  }
}
</script>

在此示例中,当mounted挂钩运行后,此代码片段将记录消息:

Output
At this point, vm.$el has been created and el has been replaced.

另外,还有一条消息Example content. (this.$el.textContent)将被记录。

在本节中,您探索了安装挂钩的用例。在下一步中,您将查看一些使用更新挂钩的示例。

了解更新挂钩(差异和重新渲染)

更新挂钩每当组件使用的反应性属性发生更改或其他原因导致其重新渲染时,就会调用。它们允许您连接到观察-计算-渲染为您的组件循环。

如果您需要知道组件何时重新渲染(可能是为了调试或分析),请使用更新挂钩。

如果您需要知道组件上的反应性属性何时发生变化,请不要使用更新挂钩。使用计算属性 or watchers为此。

beforeUpdate

The beforeUpdate钩子在组件上的数据更改之后运行,更新周期开始,就在 DOM 修补和重新渲染之前。

Use beforeUpdate如果您需要在渲染之前获取组件上任何反应数据的新状态:

示例组件.vue
<template>
  <div ref="example-element">{{counter}}</div>
</template>

<script>
export default {
  data() {
    return {
      counter: 0
    }
  },

  created() {
    setInterval(() => {
      this.counter++
    }, 1000)
  },

  beforeUpdate() {
    console.log(`At this point, Virtual DOM has not re-rendered or patched yet.`)
    // Logs the counter value every second, before the DOM updates.
    console.log(this.counter)
  }
}
</script>

首先,这个片段将存储counter as 0。当。。。的时候created钩子运行后,它会增加counter every 1000多发性硬化症。当。。。的时候beforeUpdate挂钩运行后,此代码片段将记录消息:

Output
At this point, Virtual DOM has not re-rendered or patched yet.

和一个数字counter也已记录。

updated

The updated钩子在组件上的数据更改和 DOM 重新渲染后运行。

Use updated如果您需要在属性更改后访问 DOM:

示例组件.vue
<template>
  <div ref="example-element">{{counter}}</div>
</template>

<script>
export default {
  data() {
    return {
      counter: 0
    }
  },

  created() {
    setInterval(() => {
      this.counter++
    }, 1000)
  },

  updated() {
    console.log(`At this point, Virtual DOM has re-rendered and patched.`)
    // Fired every second, should always be true
    console.log(+this.$refs['example-element'].textContent === this.counter)
  }
}
</script>

首先,这个片段将存储counter as 0。当。。。的时候created钩子运行后,它会增加counter every 1000多发性硬化症。当。。。的时候updated挂钩运行后,此代码片段将记录消息:

Output
At this point, Virtual DOM has re-rendered and patched.

和一个布尔值true被记录是因为渲染值和当前值相等。

现在您已经探索了更新钩子的使用,您准备好了解销毁钩子了。

了解破坏钩子(拆解)

破坏钩允许您在组件被破坏时执行操作,例如清理或发送分析。当您的组件被拆除并从 DOM 中删除时,它们会触发。

beforeDestroy

beforeDestroy在拆卸前被解雇。您的组件仍将完全存在并正常运行。

Use beforeDestroy如果您需要清理事件或反应式订阅:

示例组件.vue
<script>
export default {
  data() {
    return {
      exampleLeakyProperty: 'This represents a property that will leak memory if not cleaned up.'
    }
  },

  beforeDestroy() {
    console.log(`At this point, watchers, child components, and event listeners have not been teared down yet.`)
    // Perform the teardown procedure for exampleLeakyProperty.
    // (In this case, effectively nothing)
    this.exampleLeakyProperty = null
    delete this.exampleLeakyProperty
  }
}
</script>

该片段将首先存储exampleLeakyProperty。当。。。的时候beforeDestroy挂钩运行后,此代码片段将记录消息:

Output
At this point, watchers, child components, and event listeners have not been torn down yet.

进而exampleLeakyProperty被删除。

destroyed

当您到达destroyed钩子,你的组件上几乎没有剩下任何东西了。附着在它上面的一切都被摧毁了。

Use destroyed如果您需要进行最后一刻的清理或通知远程服务器该组件已被破坏:

示例组件.vue
<script>
import ExampleAnalyticsService from './example-analytics-service'

export default {
  destroyed() {
    console.log(`At this point, watchers, child components, and event listeners have been torn down.`)
    console.log(this)
    ExampleAnalyticsService.informService('Component destroyed.')
  }
}
</script>

首先,这个片段将导入ExampleAnalyticsService。当。。。的时候beforeDestroy挂钩运行后,此代码片段将记录消息:

Output
At this point, watchers, child components, and event listeners have been torn down.

组件的剩余部分将被记录到控制台,并且ExampleAnalyticsService将传递消息Component destroyed..

至此,您已经完成了对 Vue.js 生命周期挂钩的总体回顾。

其他挂钩

还有另外两个钩子,activated and deactivated。这些是为了keep-alive组件,这个主题超出了本文的范围。

只要说它们允许您检测包装在<keep-alive></keep-alive>标签已打开或关闭。您可以使用它们来获取组件的数据或处理状态更改,有效地表现为created and beforeDestroy无需进行完整的组件重建。

结论

在本文中,我们向您介绍了 Vue.js 实例生命周期中可用的不同生命周期挂钩。您探索了创建钩子、安装钩子、更新钩子和销毁钩子的不同用例。

如果您想了解有关 Vue.js 的更多信息,请查看我们的 Vue.js 主题页面用于练习和编程项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 Vue.js 生命周期挂钩 的相关文章

随机推荐

  • 如何在 CentOS 7 上安装和配置 Squid 代理

    Squid 是一个功能齐全的缓存代理 支持流行的网络协议 如 HTTP HTTPS FTP 等 将 Squid 放置在 Web 服务器前面可以通过缓存重复请求 过滤 Web 流量和访问地理限制内容来极大地提高服务器性能 本教程介绍如何在 C
  • 如何在 Ubuntu 18.04 上安装 Gitea

    Gitea 是一个用 Go 编写的自托管开源 git 服务器 它是一个叉子Gogs Gitea 包括存储库文件编辑器 项目问题跟踪 用户管理 通知 内置 wiki 等等 Gitea是一个轻量级应用程序 可以安装在低功耗系统上 如果您正在寻找
  • 如何在 Ubuntu 20.04 上添加和删除用户

    配置新 Ubuntu 系统时的首要任务之一是添加和删除用户 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 本文介绍如何在 Ubuntu 18 04 上添加和删除用户帐户 在你开始之前 仅 root 或具有 sud
  • 如何在 Raspberry Pi 上安装 Plex 媒体服务器

    Raspberry Pi 可用于许多不同的项目 Raspberry Pi 最受欢迎的用例之一是将 Raspberry Pi 变成家庭媒体中心 Plex 是一款流行的流媒体服务器 可让您组织视频 音乐和照片收藏 并将它们随时随地流式传输到您的
  • 如何在 Ubuntu 18.04 上安装 Node.js 和 npm

    Node js 是一个开源跨平台 JavaScript 运行时环境 允许服务器端执行 JavaScript 代码 这意味着您可以在计算机上将 JavaScript 代码作为独立应用程序运行 无需使用任何 Web 浏览器 Node js 主要
  • 如何在 CentOS 7 上部署 Mattermost

    Mattermost 是一个开源即时通讯平台 是一个自托管的 Slack 替代品 它是用 Golang 和 React 编写的 可以使用 MySQL 或 PostgreSQL 作为数据库后端 Mattermost 将您的所有团队沟通集中到一
  • 如何在 CentOS 7 上安装 Plex 媒体服务器

    Plex 是一款流媒体服务器 可将您所有的视频 音乐和照片收藏集中在一起 并随时随地将它们流式传输到您的设备 在本教程中 我们将向您展示如何安装和配置Plex 媒体服务器在 CentOS 7 上 先决条件 在继续本教程之前 请确保您以以下身
  • Linux 中的 df 命令(检查磁盘空间)

    我的硬盘还剩多少空间 是否有足够的可用磁盘空间来下载大文件或安装新应用程序 在 Linux 和 Unix 操作系统上 您可以使用df命令获取有关系统磁盘空间使用情况的详细报告 使用 df 命令 的一般语法为df命令如下 df OPTIONS
  • 如何在 CentOS 8 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome JavaScript 构建的跨平台 JavaScript 运行时环境 旨在在服务器端执行 JavaScript 代码 使用 Node js 您可以构建可扩展的网络应用程序 npm 是 Node Pa
  • 如何在 Debian 9 上安装 Webmin

    Webmin是一个用于管理 Linux 服务器的开源 Web 控制面板 使用 Webmin 您可以管理系统用户 组 磁盘配额以及配置最流行的服务 包括 Web ssh ftp 电子邮件和数据库服务器 本教程介绍如何在 Debian Linu
  • 如何在 Debian 11 上为专用连接设置 Squid 代理

    介绍 代理服务器是一种服务器应用程序 充当最终用户和互联网资源之间的网关 通过代理服务器 最终用户能够出于多种目的控制和监视其 Web 流量 包括隐私 安全和缓存 例如 您可以使用代理服务器从与您自己的 IP 地址不同的 IP 地址发出 W
  • 如何在 Ubuntu 16.04 上安装 MySQL

    介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来管理其数据 简短版本的安装很简单 更新您的
  • Java IO 教程

    Java提供了几个类java io用于处理文本 流数据和文件系统的包 我最近提供了几个有关 Java 文件和 Java IO 的示例 这篇文章是所有 Java IO 文章的索引 Java IO 如何在 Java 中创建新文件在这篇文章中 您
  • Java Stream Collect() 方法示例

    Java Streamcollect 对流的元素执行可变归约操作 这是终端操作 什么是可变约简操作 可变归约操作处理流元素 然后将其累积到可变结果容器中 处理元素后 组合函数将合并所有结果容器以创建结果 Java Stream Collec
  • 快速初始化()

    在本 Swift 教程中 我们将讨论一个重要的概念 即 Swift init 或 Swift 初始化 初始化是当我们创建某种类型的实例时发生的事情 快速初始化 初始化是准备类 结构或枚举的实例以供使用的过程 此过程涉及为该实例上的每个存储属
  • 如何在 Debian Wheezy 上使用 Postfix 安装和配置 DKIM

    介绍 对于大多数邮件服务器管理员来说 被错误地标记为垃圾邮件发送者所带来的挫败感并不奇怪 通过排除服务器受损的可能性 错误标记通常是由以下原因之一引起的 该服务器是一个开放的邮件中继 发件人或服务器的 IP 地址已列入黑名单 服务器没有完全
  • Linux/Unix 中的 AWK 命令

    AWK 适用于模式搜索和处理 该脚本运行以搜索一个或多个文件以识别匹配模式以及所述模式是否执行特定任务 在本指南中 我们将了解 AWK Linux 命令并了解它的功能 AWK 可以执行哪些操作 逐行扫描文件 将每个输入行拆分为字段 将输入行
  • 如何在 Python 中将字符串转换为日期时间或时间对象

    介绍 蟒蛇datetime and time模块均包括strptime 将字符串转换为对象的类方法 在本文中 您将使用strptime 将字符串转换为datetime and struct time 对象 将字符串转换为datetime对象
  • 如何在 Ubuntu 18.04 上使用 Python 3 设置 Jupyter Notebook

    介绍 Jupyter笔记本是一个开源 Web 应用程序 可让您创建和共享交互式代码 可视化等 该工具可与多种编程语言一起使用 包括 Python Julia R Haskell 和 Ruby 它通常用于处理数据 统计建模和机器学习 本教程将
  • 了解 Vue.js 生命周期挂钩

    介绍 生命周期挂钩是了解您正在使用的库如何在幕后工作的窗口 生命周期钩子允许您知道组件何时被创建 添加到 DOM 更新或销毁 本文将向您介绍 Vue js 中的创建 安装 更新和销毁钩子 先决条件 要完成本教程 您需要 熟悉 Vue js