news 2026/4/16 16:16:01

【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/4/16 14:49:21

DeepSeek系列模型演进(截止2026年1月26日)

文章目录 一、核心型号演进时间线&#xff08;含论文/报告与关键信息&#xff09;二、关键技术演进逻辑&#xff08;学习重点&#xff09;三、学习路径建议四、快速定位核心论文的方法总结 图片来源&#xff1a;DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-E…

作者头像 李华
网站建设 2026/4/12 6:36:09

计算机Java毕设实战-基于Web的旅游社交分享系统设计与实现基于Web的社交媒体平台基于web的宠物社交系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/10 14:55:03

奥特曼被吓坏!Codex全家桶上线倒计时,恐将撕开全网漏洞

奥特曼发出预警&#xff1a;一周后Codex全家桶就要来了&#xff0c;但它们极其危险&#xff0c;以至于网络安全评级已经到达高级别&#xff01;这些模型极可能打破现有的网络攻防平衡&#xff0c;导致攻击数量激增&#xff0c;甚至能帮你抢银行。 今天&#xff0c;奥特曼预告&…

作者头像 李华
网站建设 2026/4/3 14:11:44

代码死了,死在Cursor生成3000000行浏览器的那个晚上!

这是硅谷近期最大的黑色幽默&#xff1a;Cursor CEO亲拆自家招牌。当「Vibe Coding」变成一场盲目的狂欢&#xff0c;技术次贷危机的引信已被悄悄点燃。 就在上周&#xff0c;科技圈围观了一场名为奇迹&#xff0c;实为葬礼的闹剧。 Cursor的CEO Michael Truell&#xff0c;这…

作者头像 李华
网站建设 2026/3/14 9:41:49

全域风控与反欺诈技术实践——直击刷单、黄牛、恶意下单及盗刷痛点

【精选优质专栏推荐】 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解《网安渗透工具使用教程(全)》 —— 一站式工具手册《CTF 新手入门实战教…

作者头像 李华