LoginSignup
0
0

More than 3 years have passed since last update.

Gridsome入門 SPAを作ってみよう 【7日目 GraphQL編3】

Last updated at Posted at 2020-08-14

スケジュール

前提条件

  • node.js v8.3以上
  • yarn or npmが入っている(Document見るとyarnの方が推奨とのこと)
  • Gridsomeのプロジェクトを作成している

新たにjsonファイルをデータソースとして指定

src/data/assettransition.json
[
  {
    "date": "202004",
    "asset_usd": "18723.52",
    "asset_yen": "2000000",
    "usd/jpy": "107.26"
  },
  {
    "date": "202005",
    "asset_usd": "19659.70",
    "asset_yen": "2100000",
    "usd/jpy": "108.36"
  },
  {
    "date": "202006",
    "asset_usd": "20595.88",
    "asset_yen": "2200000",
    "usd/jpy": "109.64"
  },
  {
    "date": "202007",
    "asset_usd": "21532.05",
    "asset_yen": "2300000",
    "usd/jpy": "106.58"
  }
]

今回は新たなデータソースとしてjson形式のファイルからインポートしてみようと思います。
csv-parseが要らない分jsonの方がシンプルでやりやすいですね。

gridsome.server.js
// Server API makes it possible to hook into various parts of Gridsome
// on server-side and add custom data to the GraphQL data layer.
// Learn more: https://gridsome.org/docs/server-api/

// Changes here require a server restart.
// To restart press CTRL + C in terminal and run `gridsome develop`

const {readFileSync} = require('fs');
const parse = require('csv-parse/lib/sync');
module.exports = function (api) {
  api.loadSource(async (actions) => {
    // CSVから資産データを取得
    const input = readFileSync('./src/data/assetbalance_202008.csv', 'utf8');
    const Assets = parse(input, {
      from_line: 2,
      skip_empty_lines: true,
    });
    const collection = actions.addCollection({
      typeName: 'Assets',
    });
    for (const asset of Assets) {
      collection.addNode(asset);
    }

    // jsonから資産推移データを取得
    const Transitions = require('./src/data/assettransition.json');
    const collection2 = actions.addCollection({
      typeName: 'Transitions',
    });
    for (const transition of Transitions) {
      collection2.addNode(transition);
    }
  })

  api.createPages(({ createPage }) => {
    // Use the Pages API here: https://gridsome.org/docs/pages-api/
  })
}

collection2 という新たなコレクションを作って、そこに同じようにaddNode することで追加していけます。
データソースを複数にしてもGraphQLが上手く吸収してくれるので、競合することなく使えて便利でいいですね。

あとは他と同じくフロントエンド側のページでクエリから取得する

src/pages/asset-transition/index.vue
<template>
  <Layout>
    <h1>Asset transition</h1>
    <bar :labels="formatLabels($page.allTransitions.edges)" :chartData="formatChartData($page.allTransitions.edges)"></bar>
  </Layout>
</template>
<page-query>
query {
  allTransitions(order:ASC) {
    edges {
      node {
        date
        asset_usd
      }
    }
  }
}
</page-query>
<script>
import Bar from "../../components/chart/Bar";
export default {
  components: {
    Bar
  },
  methods: {
    formatLabels: function (labels) {
      return labels.map(item => item['node']['date']);
    },
    formatChartData: function (chartData) {
      return chartData.map(item => item['node']['asset_usd']);
    }
  },
  metaInfo: {
    title: 'Hello, world!'
  }
}
</script>

<style>
.home-links a {
  margin-right: 1rem;
}
</style>

実際のグラフはこちら

demo.gif
jsonファイルからインポートしたデータで表示されています。

あとがき

だんだんと出来上がってきました。と思ったらお盆休みも残りわずか。。
あとは色々調整して、最終日にAWS S3にデプロイして終わりかなー。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0