Vue.jsでJSON Serverを使う

2021年4月16日Vue.js

Vue.jsでJSON Serverを使う方法をまとめました。
JSON ServerはAPIモックサーバーです。
ローカル環境からAPIが使えない場合などに使います。

Vue.jsでJSON Serverを使う

ターミナル

まずターミナルで次のように操作します。

cd フォルダ名

でフォルダへ移動します。

npm install json-server

でそのフォルダのローカルにインストールします。
json-server のURLを取得することができます。
たとえば、http://localhost:3000というURLです。


json-server -watch data/db.json

もしくは


npx json-server --watch data/db.json

とすると、json-serverの変更を随時watchしてくれるようになります。

Jobs.vue

たとえば、Vue.jsのrouterの基本的な使い方で作ったJobs.vueのデータをjsonデータにして、それを非同期で受け取るとします。
次のように変更します。

<template>
  <h1>Jobs</h1>
  <div v-if="jobs.length">
    <div v-for="job in jobs" :key="job.id" class="job">
      <router-link :to="{ name: 'jobDetails', params: { id: job.id } }">
        <h2>{{ job.title }}</h2>
      </router-link>
    </div>
  </div>
  <div v-else>
    <p>ローディング中・・・</p>
  </div>
</template>
<script>
export default {
  data() {
    return {
      jobs: []
    }
  },
  mounted() {
    fetch('http://localhost:3000/jobs')
      .then(res => res.json())
      .then(data => (this.jobs = data)) // = dataのdataは上のdata()のこと
      .catch(err => console.log(err.message))
  }
}
</script>

dataには、空の配列でjobsを指定します。
そして、mounted()メソッドを作成します。
fetchでデータを取得して、.jsonでパースします。
then()メソッドでチェーンして、空配列で用意したjobsにjsonデータを代入します。
エラー時のときにメッセージが出るようにcatch()メソッドをつなげます。

fetchなどの使い方は、次の記事を参考にしてみてください。

JobDetails.vue

<template>
  <div v-if="job">
    <!-- v-ifでjobがnullならfalse,dataがあるならtrueで表示を条件分岐 -->
    <h1>{{ job.title }}</h1>
    <p>The job is is {{ id }}</p>
    <p>{{ job.details }}</p>
  </div>
  <div v-else>
    <p>ローディング中・・・</p>
  </div>
</template>

v-ifでjobがtrueなら表示、falseならローディング中を表示します。

<script>
export default {
  // index.jsでprops: trueにするとdata()ではpropsで受け取れるようになる
  props: ['id'],
  // fetchしたデータがきた後で上の情報を表示しないとnullなのでエラーになる
  data() {
    return {
      job: null
    }
  },
  // jsonデータを受け取る
  // idはthis.id
  mounted() {
    fetch('http://localhost:3000/jobs/' + this.id)
      .then(res => res.json())
      .then(data => (this.job = data)) // = jobsでなくjob
      .catch(err => console.log(err.message))
  }
}
</script>

Job.vueとほぼ同じですが、jobsの単体のページにあたるので、jobsでなくjobとなります。
dataではnullとします。
fetchでは、idをつなげたいので、上のように指定します。
jobをdataに代入します。

Vue.js

Posted by devsakaso