前置き
ライフサイクルフックの1つcreated()
似ていると言われるmounted()
との違いや
使い方を解説していきます🍎🙋♀️
created()
created()とは
API通信を行うものです🔄
基本はcreated()
を使用し、
どうしてもDOM
を操作しないといけない時にmounted()
を使います💡
Vuex
でいうならactions
にあたる部分です❣️Vuex
を使用する際はactions
をcreated()
内でdispatch
を使って呼び出すこともできます。
実行タイミング
インスタンス作成後、
マウンティング前(DOMが作られる前)
https://jp.vuejs.org/v2/api/#created
つまり$el
プロパティやgetElementById
などのDOM操作は使えず、this
コンテキストは使えます🍒
比較
まずはAPIを使わず
簡単なコードで比較しましょう👀
テキストを表示させるだけ🌟
created()
DOM操作ができないので
エラーになります。
Error
TypeError: Cannot read property 'style' of null
at VueComponent.created
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<template> <div class="page"> <p id="text">Hello Nuxt.js!</p> </div> </template> <script> export default { created () { document.getElementById("text").style.color = "lightblue" }, } </script> |
mounted()
$el
が有効なので
問題なく表示されます。
※SSRの場合はmounted()
自体が使えません❗️
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<template> <div class="page"> <p id="text">Hello Nuxt.js!</p> </div> </template> <script> export default { mounted () { document.getElementById("text").style.color = "lightblue" }, } </script> |
API通信をしてみる
それではcreated()
でAPI通信をしましょう。
通信にはaxios
を
APIはJSONplaceholderを使用します。
JSONplaceholder
お試しAPIです。
ダミーデータですが本格的にAPIを使う前に
動作確認ができるのでオススメです🌟
まずはここから始めましょう📚✨
axiosについて、
JSONplaceholderの取得は
こちらで解説しています。
https://wp.me/pc9NHC-gr
JSONplaceholderのデータを取得をし、li
で表示させます。
Vuexなしver.
コード
) pages
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 |
<template> <div class="page"> <ul> <li v-for="post in posts" :key="post.id"> {{ post.title }} </li> </ul> </div> </template> <script> import axios from 'axios' export default { data () { return { posts: [], } }, created () { axios.get('https://jsonplaceholder.typicode.com/posts') .then ((res) => { this.posts = res.data }) } } </script> |
Vuexありver.
コード
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<template> <div class="page"> <ul> <li v-for="post in posts" :key="post.id"> {{ post.title }} </li> </ul> </div> </template> <script> export default { created () { this.$store.dispatch('getData') }, computed: { posts () { return this.$store.getters['posts'] }, }, } </script> |
) file
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 |
import axios from 'axios' export const state = () => ({ posts: [], }) export const getters = { posts(state) { return state.posts }, } export const actions = { getData({ commit }) { axios.get('https://jsonplaceholder.typicode.com/posts') .then((res) => { let resData = res.data commit('setData', resData) }) } } export const mutations = { setData(state, resData) { state.posts = resData }, } |
まとめ
- created()はAPI通信を行うもの
- Vuexのactionsにあたる部分
- monted()との使い分けは$el, DOM操作が必要かどうか