news 2026/5/8 0:03:38

【Vue】组件生命周期 组件生命周期钩子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Vue】组件生命周期 组件生命周期钩子

文章目录

  • 一、生命周期介绍
  • 二、组件生命周期钩子
    • 选项式 API 的代码示例
  • 三、组合式API生命周期钩子
    • 1. 与 Vue2 钩子函数的对比
    • 2. 代码实例
  • 四、案例-生命周期钩子应用
    • 1. 在 setup 中发起网络请求并渲染数据
      • ① 安装axios
      • ② 完整代码
    • 2. 在 onMounted 中操作 DOM

一、生命周期介绍

一个 Vue 实例(组件)从创建到卸载的整个过程,称为其生命周期。从宏观角度来看,一共有四个阶段,如下所示:

  1. 创建:初始化propsdatamethods等响应式数据。
  2. 挂载:渲染模板template,把虚拟 DOM 渲染成真实 DOM,显示在页面上。
  3. 更新:当数据变化时,重新渲染视图。
  4. 卸载:组件销毁、释放资源。

二、组件生命周期钩子

每个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据监听,编译模板,挂载实例到真实DOM树上,以及在数据改变时更新DOM

在上述过程中,会自动运行一些函数,这些函数被称为【Vue生命周期钩子】

作用:钩子函数在特定时机会自动执行,这给了开发者在特定阶段添加自己代码的机会。

选项式 API 的代码示例

新建components/LifeCycle.vue文件:

<script>exportdefault{// 提供响应式数据data(){return{count:0}},// 提供方法/函数methods:{fn(){console.log('fn 函数执行了')}},setup(){console.log('0-setup')},// 创建阶段(第一阶段):Vue组件创建/出生阶段:// 创建前:此时无法访问 data 数据,也无法调用 methods 方法beforeCreate(){console.log('1-beforeCreate')console.log(this.count)// undefinedconsole.log(this.fn)// undefined},// 创建后:此时可以访问 data 数据,也可以调用 methods 方法created(){console.log('2-created')console.log(this.count)// 0console.log(this.fn)// 访问到函数this.fn()// 开启定时器// 给当前组件实例新增了一个 timerId 属性,保存了当前定时器的 id 值this.timerId=setInterval(()=>{console.log(this.count)},1000)},// 挂载阶段(第二阶段):模版渲染阶段// 挂载前:此时写在 template 下的标签还没有变成真实DOM,故而无法获取DOMbeforeMount(){console.log('3-beforeMount')console.log(document.querySelector('p'))// null},// 挂载后:此时写在 template 下的标签已经变成了真实DOM,故而可以获取DOM(是最早可以操作DOM的时机)mounted(){console.log('4-mounted')console.log(document.querySelector('p'))// <p>0</p>document.querySelector('p').style.color='red'},// 更新阶段(第三阶段):数据变了,组件重新渲染的过程// 更新前beforeUpdate(){console.log('5-beforeUpdate')// console.log(this.count)console.log(document.querySelector('p').innerText)// 旧内容(以前的内容)},// 更新后updated(){console.log('6-updated')// console.log(this.count)console.log(document.querySelector('p').innerText)// 新内容},// 卸载阶段(第四阶段):组件移除阶段beforeUnmount(){console.log('7-beforeUnmount')// 用于 依赖 DOM 或组件存在的清理逻辑,比如要解除某个挂在组件 DOM 上的事件监听。},unmounted(){console.log('8-mounted')// 这里尝试访问 this.$el 或 document.querySelector('#xxx')// 已经拿不到了,因为 DOM 被销毁了// 但是可以关闭定时器之类非 DOM 的资源clearInterval(this.timerId)}}</script><template><div><p>{{count}}</p><button @click="count++">+1</button></div></template>

App.vue文件:

<script setup>import{ref}from'vue'importLifeCyclefrom'./components/LifeCycle.vue'constisAlive=ref(true)</script><template><life-cycle v-if="isAlive"/></template>

三、组合式API生命周期钩子

1. 与 Vue2 钩子函数的对比

阶段Vue2(选项式)Vue3(组合式)
创建阶段beforeCreate、createdsetup(网络请求)
挂载阶段beforeMount、mountedonBeforeMount、onMounted(操作DOM)
更新阶段beforeUpdate、updatedonBeforeUpdate、onUpdated
销毁阶段beforeUnmount、unmountedonBeforeUnmount、onUnmounted(清理工作)

其中vue3<script setup>就直接包括了vue2中的setup()beforeCreate()created(),所以可以直接在<script setup>中进行网络请求

2. 代码实例

<script setup>import{onMounted,onUnmounted}from'vue'// 开启定时器consttimer=setInterval(()=>{console.log('Hello World')},1000)// 组件挂载后onMounted(()=>{// console.log(document.querySelector('p'))document.querySelector('p').style.color='green'})// 组件卸载后onUnmounted(()=>{// 关闭定时器clearInterval(timer)})</script>

四、案例-生命周期钩子应用

1. 在 setup 中发起网络请求并渲染数据

① 安装axios

npmi axios

② 完整代码

<script setup>// 安装 axios// 导入模块// 定义请求函数并调用importaxiosfrom'axios'import{ref}from'vue'consti=ref(0)// 图片列表constimages=ref([])getBannerData()asyncfunctiongetBannerData(){// 发请求,调接口constresp=awaitaxios({method:'GET',// 请求方式url:'http://localhost:4000/api/banner'// 请求路径})// 保存数据console.log(resp);images.value=resp.data.data}constprev=()=>{i.value--if(i.value<=-1){i.value=images.value.length-1}}constnext=()=>{i.value++if(i.value>=images.value.length){i.value=0}}lettimer=nullconstplay=()=>{timer=setInterval(()=>{next()},3000)}play()conststop=()=>{clearInterval(timer)}</script><template><divclass="banner"@mouseenter="stop"@mouseleave="play"><ul><li v-for="(url, index) in images":class="{ active: index === i }"><img:src="url"/></li></ul><divclass="indicator"><span v-for="(n, index) in images.length":key="n":class="{ active: index === i }"@click="i = index"></span></div><divclass="ctrl"><a href="javascript:;"class="btn prev"@click="prev">&lt;</a><a href="javascript:;"class="btn next"@click="next">&gt;</a></div></div></template><style>*{margin:0;padding:0;}a{text-decoration:none;color:#000;}.banner{position:relative;width:1200px;height:337px;margin:150px auto;}.banner ul{width:100%;height:100%;list-style:none;}.banner ul li{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;transition:opacity 1s;}.banner ul li.active{opacity:1;}.banner.indicator{display:flex;justify-content:center;position:absolute;left:0;bottom:20px;width:100%;}.banner.indicator span{width:30px;height:2px;margin:05px;cursor:pointer;background:rgba(255,2555,255,0.6);}.banner.indicator span.active{background:rgba(255,255,255,1);}.btn{position:absolute;top:50%;width:30px;height:30px;line-height:30px;margin-top:-15px;font-size:14px;text-align:center;background:rgba(0,0,0,0.3);color:#fff;border-radius:50%;}.btn.prev{left:15px;}.btn.next{right:15px;}</style>

2. 在 onMounted 中操作 DOM

目标:打开网页的时候,输入框自动聚焦

<script setup>import{onMounted}from'vue'// 组件挂载后onMounted(()=>{// 获取 input 元素constinput=document.querySelector('input')// 调用 focus 聚焦input.focus()})</script><template><divclass="container"><img width="150"src="https://th.bing.com/th/id/ODL.ce819d0be740fd3c6b5e42d538119fab?w=310&h=198&c=7&rs=1&bgcl=ffff14&r=0&o=6&dpr=1.3&pid=AlgoBlockDebug"alt="logo"/><divclass="search-box"><input type="text"/><button>搜 索</button></div></div></template><style>html,body{height:100vh;}.container{position:absolute;top:30%;left:50%;transform:translate(-50%,-50%);text-align:center;}.container.search-box{display:flex;}.container img{margin-bottom:30px;}.container.search-box input{width:512px;height:17px;padding:12px 16px;font-size:16px;margin:0;vertical-align:top;outline:0;box-shadow:none;border-radius:10px0010px;border:2px solid #c4c7ce;background:#fff;color:#222;overflow:hidden;-webkit-tap-highlight-color:transparent;}.container.search-box button{width:112px;height:44px;line-height:42px;background-color:#ad2a27;border-radius:05px 5px0;font-size:17px;box-shadow:none;font-weight:400;margin-left:-1px;border:0;outline:0;letter-spacing:normal;color:white;cursor:pointer;}body{background:#f1f2f3 no-repeat center/cover;}</style>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 10:32:54

谷歌用一堆不赚钱的AI小玩意,给科技圈上了一课

谷歌的这些艺术实验项目&#xff0c;若从商业角度看&#xff0c;实在说不上有什么直接价值。但正是这些看似没啥用的项目&#xff0c;却藏着谷歌最真诚的人文坚守。庄子・人间世》中有这样一则小故事&#xff1a;南伯子綦在商地的山丘游玩时&#xff0c;见到一棵异常高大的树&a…

作者头像 李华
网站建设 2026/5/6 10:33:14

没博士没论文,这些人靠什么「野路子」杀进OpenAI等顶级AI大厂?

最近&#xff0c;OpenAI 资深研究科学家 Noam Brown 在 X 上分享了几个真实故事&#xff0c;证明了通过个人努力和巧妙策略&#xff0c;即使没有传统学术履历&#xff0c;也能获得机会。许多人梦想进入像 OpenAI 这样的前沿实验室从事研究工作&#xff0c;然而对于那些缺乏传统…

作者头像 李华
网站建设 2026/5/6 2:42:06

Debian和Ubuntu哪个更适合项目的生产环境使用?

用 Debian 和 Ubuntu 都部署过生产项目。 有电商后台&#xff0c;有 API 服务&#xff0c;也有 WordPress 站。 很多人问&#xff1a;到底哪个更适合生产环境&#xff1f; 我的答案是&#xff1a;看你的团队、项目类型和维护习惯。 没有绝对优劣&#xff0c;只有适不适合。…

作者头像 李华
网站建设 2026/5/3 21:29:51

提升AI阅读理解能力的技术探究

如何让AI在阅读理解方面表现更佳 在自然语言处理领域&#xff0c;基于阅读理解的问答是一项流行任务。它类似于标准化考试&#xff1a;给定一段文章及相关问题&#xff0c;目标是让机器学习模型像人一样&#xff0c;通过阅读文章找到答案。 近年来&#xff0c;问答模型取得了显…

作者头像 李华
网站建设 2026/5/7 10:25:02

大学老师从讲师到正教授,平均需要12.5年!

能否评上高级职称&#xff0c;不在于你有多强&#xff0c;而取决于名额多少以及对手有多强。 在高校&#xff0c;没有哪位老师会不在意职称。 在高校里职称一般设置为&#xff1a;初级、中级、高级、正高级。他们对应的职称名称是&#xff1a;助教、讲师、副教授、教授。 不…

作者头像 李华