Lifecycle hooks: lets you know when component
is create
, add to the DOM
, updated
, destroyed
.
Here’s an image from the Vue.js documentation that shows the life cycle of a Vue Instance
.
I will divide 4 common pairs of Hooks for you to remember more easily:
beforeCreate
vscreated
beforeMount
vsmounted
beforeUpdate
vsupdated
beforeDestroy
vsdestroyed
Or let’s go through each pair of Hooks and examples to understand how it works.
1. beforeCreate
vs created
beforeCreate
:- run before
render
- is called
synchronously
right after theinstance
has been initialized data
andmethods
not instantiated so they cannot be obtained at this stage.
- run before
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> text <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> components <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">beforeCreate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Opion/LifeCycle -> beforeCreate"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">foo</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">"Lifecycle"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">foo</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"methods -> foo"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Result:
created
:- run before
render
- Run after the
beforeCreate
finishes running. data
createddata
andmethods
can be obtained at this stage.$el
(theroot DOM element
that theVue instance
is managing) does not yet exist because it is not mounted yet
- run before
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> text <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> components <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">beforeCreate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Opion/LifeCycle -> beforeCreate"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// this.foo();</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">"Lifecycle"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">foo</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"methods -> foo"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">created</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Opion/LifeCycle -> created"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"$el"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> $el <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> <span class="token function">foo</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Result:
2. beforeMount
vs mounted
beforeMount
- Run after
created
run - Prepare for
mounting
- Run after
mounted
- Run after the
mounting
has ended. $el
: This guy increated
cannot get it, but if he ismounted
, he has the same result as shown.- Note: At this stage, all components are not
mounted
. If you want to wait until everything isrender
then you can learn more about the guy vm. $ NextTick inmounted
.
- Run after the
For example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> components <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">"Lifecycle"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">beforeMount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle beforeMount"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token comment">/* Bạn có thể xóa phần tag template phía trên và thay vào phần render function ở dưới sẽ thấy được quá trình render giữa 2 Hook. */</span> <span class="token function-variable function">render</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">createElement</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"render"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">createElement</span> <span class="token punctuation">(</span> <span class="token string">"div"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">mounted</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle mounted"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"this.$el"</span> <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> $el <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Result:
3. beforeUpdate
vs updated
Returning to the image above, we can see that when there is the data change, this Hook pair will run:
beforeUpdate
- Call when the data changes and before the DOM is
patch
. - Get old DOM data before changing to new DOM
- Call when the data changes and before the DOM is
updated
- Called after data changes cause the DOM to be
re-render
andpatch
. - Limit change data on this Hook, instead use a
computed
orwatcher
instead. - Like
mounted
: in this stage all components will not bere-render
. If you want to wait for everything tore-render
then you can learn more about vm. $ NextTick inupdated
- Called after data changes cause the DOM to be
Example: Create a text and a button, after the first render, click on the button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> components <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">"Lifecycle"</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">updateText</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token operator">=</span> <span class="token string">"Lifecycle-Updated"</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">beforeUpdate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle beforeUpdate"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function-variable function">render</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">createElement</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"render"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">createElement</span> <span class="token punctuation">(</span> <span class="token string">"div"</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> text <span class="token punctuation">,</span> <span class="token function">createElement</span> <span class="token punctuation">(</span> <span class="token string">"button"</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> on <span class="token operator">:</span> <span class="token punctuation">{</span> click <span class="token operator">:</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> updateText <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token string">"Update Text"</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">updated</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle updated"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Result:
4. beforeDestroy
vs destroyed
beforeDestroy
: Called before the instance isdestroy
. At this stage, the instance is still fully functional.destroyed
: Called after the instance has beendestroy
. When this hooks are called, alldirectives
of the instance areunbound
, allevent listerner
areremoved
, and all children of the instance aredestroy
.
Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token comment">// index.vue</span> <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token operator">></span> <span class="token operator"><</span> ComponentText v <span class="token operator">-</span> <span class="token keyword">if</span> <span class="token operator">=</span> <span class="token string">"isShow"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> button @click <span class="token operator">=</span> <span class="token string">"toggleShow"</span> <span class="token operator">></span> isShow <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> isShow <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">import</span> ComponentText <span class="token keyword">from</span> <span class="token string">"./ComponentText"</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> components <span class="token operator">:</span> <span class="token punctuation">{</span> ComponentText <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">data</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> text <span class="token operator">:</span> <span class="token string">"Lifecycle"</span> <span class="token punctuation">,</span> isShow <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> methods <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">toggleShow</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> isShow <span class="token operator">=</span> <span class="token operator">!</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> isShow <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token comment">// ComponentText.vue</span> <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> p <span class="token operator">></span> Text <span class="token operator"><</span> <span class="token operator">/</span> p <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> <span class="token function">beforeDestroy</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle beforeDestroy"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token function">destroyed</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Option/Lifecycle destroyed"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> style <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> style <span class="token operator">></span> |
Result: when the button is clicked
Hopefully after reading this article, based on the basic concepts, you can be more creative and flexible on your own while doing your project.
If you do not understand or have suggestions for the article, please leave a comment [email protected] # $% ^ & *