<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>生命周期 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/</link><description>Recent content in 生命周期 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 15 Dec 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>生命周期</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/vue/lifecycle/</link><pubDate>Fri, 04 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/vue/lifecycle/</guid><description>&lt;h2 id="vue3生命周期"&gt;vue3生命周期&lt;/h2&gt;
&lt;p&gt;在Vue中，生命周期指的是Vue实例从创建到销毁的过程。在这个过程中，Vue实例会经历一系列的阶段，包括数据观测、模板编译、挂载DOM、更新DOM、卸载等等。在这些阶段，Vue提供了一些生命周期钩子函数，让我们可以在特定的时机执行某些代码。&lt;/p&gt;
&lt;h2 id="为什么需要生命周期"&gt;为什么需要生命周期&lt;/h2&gt;
&lt;p&gt;生命周期钩子函数为我们提供了在Vue实例生命周期不同阶段执行代码的能力。这对于非响应式的操作非常有用，例如直接操作DOM、添加事件监听器或者创建定时器等。这些操作如果在数据变化时执行可能会导致不必要的性能开销，而生命周期钩子函数让我们可以更合理地安排这些操作的执行时机。一些常用的库，例如&lt;code&gt;react&lt;/code&gt;，&lt;code&gt;webpack&lt;/code&gt;都提供了生命周期的钩子，方便开发者理解整个运行流程。&lt;/p&gt;
&lt;h2 id="vue3-有哪些生命周期分别在什么时候调用"&gt;Vue3 有哪些生命周期，分别在什么时候调用？&lt;/h2&gt;
&lt;p&gt;Vue3的生命周期钩子函数主要包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;beforeCreate&lt;/code&gt;: 创建实例之前调用，此时实例的数据观测、事件等还未初始化。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created&lt;/code&gt;: 创建实例后调用，此时实例的数据观测、事件等已经初始化完成。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beforeMount&lt;/code&gt;: 挂载实例之前调用，此时模板已经编译完成，但是还未挂载到DOM。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mounted&lt;/code&gt;: 挂载实例后调用，此时实例已经挂载到DOM，可以进行DOM操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beforeUpdate&lt;/code&gt;: 数据更新之前调用，此时可以进行状态的最后更改。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated&lt;/code&gt;: 数据更新后调用，此时DOM已经完成更新，可以进行DOM操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beforeUnmount&lt;/code&gt;: 卸载实例之前调用，此时实例仍然完全可用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unmounted&lt;/code&gt;: 卸载实例后调用，此时实例已经完全卸载。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生命周期类型的枚举位于&lt;code&gt;packages/runtime-core/src/enums.ts&lt;/code&gt;目录下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LifecycleHooks&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;BEFORE_CREATE&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bc&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 创建之前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;CREATED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 创建
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;BEFORE_MOUNT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bm&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 挂载之前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;MOUNTED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;m&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 挂载
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;BEFORE_UPDATE&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bu&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 更新之前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;UPDATED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;u&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 更新
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;BEFORE_UNMOUNT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bum&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 卸载之前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;UNMOUNTED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;um&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 卸载之后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;DEACTIVATED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;da&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 被 keep-alive 缓存的组件停用时调用。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;ACTIVATED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 被 keep-alive 缓存的组件激活时调用。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;RENDER_TRIGGERED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;rtg&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 依赖被收集时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;RENDER_TRACKED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;rtc&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 依赖被触发时调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;ERROR_CAPTURED&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ec&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 错误捕获
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  &lt;span style="color:#a6e22e"&gt;SERVER_PREFETCH&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sp&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面生命周期可以用一张图来表示：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/vue/lifecycle/image-01.webp"&gt;&lt;/p&gt;
&lt;h2 id="选项式和组合式生命周期的区别"&gt;选项式和组合式生命周期的区别&lt;/h2&gt;
&lt;p&gt;在Vue3中，我们可以使用选项式API和组合式API来定义组件。这两种API对应的生命周期钩子函数有一些区别。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选项式API的生命周期钩子函数定义在组件选项对象的methods中，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; default {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  methods: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;    created() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;      &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; something
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;   }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;组合式API的生命周期钩子函数定义在&lt;code&gt;setup&lt;/code&gt;函数中，需要使用&lt;code&gt;import&lt;/code&gt;从&lt;code&gt;vue&lt;/code&gt;中引入，例如：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import { onMounted } from &lt;span style="color:#e6db74"&gt;&amp;#39;vue&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;​&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; default {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;  setup() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;    onMounted(() &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;      &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; something
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;   });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要注意的是，在组合式API中没有&lt;code&gt;beforecate&lt;/code&gt;和&lt;code&gt;created&lt;/code&gt;钩子，因为他们本身被&lt;code&gt;setup&lt;/code&gt;这个函数替代了，直接把相关逻辑写在&lt;code&gt;setup&lt;/code&gt;中就行了&lt;/p&gt;</description></item></channel></rss>