アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

vueでCSVダウンロードしてみました

ohataです

今のプロダクトで管理画面をもう少し充実させたいなと思っていて、 せっかくなのでチームの学びも兼ねてvueを導入していこうと思います。 ユーザー側の機能に導入する前に、利用者が制限されている管理画面から導入していくのはよくあると思います。 せっかくなので最終目標は、[運用で使う人が使いたくてたまらない!]と思うほどの快適なUIを目指していきます。

vueにする理由

Reactなども検討できたのですが、今回はvueにしました

  • ノウハウがある
    • 関係メンバーがサーバーサイドよりの人がほとんどなので、学んでいくために導入事例がある方が安心してチャレンジできる
  • 学習コストの低さ
    • 表示部分はデザイナーと一緒に開発していくので、JSXを学習してもらうコストをかけたくない

なんだかんだ言っても、一番のモチベーションは自分がちょっと使った事があり もう少し深く学んでいきたいなーというのが一番大きいです。

追加する機能

管理画面でよく使う機能でCSV(TSV)のダウンロード機能があります。

管理画面内で全て完結すれば良いのですが、別のサービスで統計分析したり 営業的な資料をまとめたりするには、データ自体を様々な用途で利用したいことは よくあるので、あると何かと便利な機能です。

また、運用初期段階では要件が明確になっていない事も多いので 運用しながら必要機能を検討することもできると思います。

導入

vue-json-to-csv

今回はこちらのnpmを導入しようと思います

https://www.npmjs.com/package/vue-json-to-csv

インストール

npm
npm i vue-json-to-csv
yarn
yarn add vue-json-to-csv

基本パターン

まずは簡単に動作確認してみましょう サンプルそのままですが動作確認していきます

<template>
  <div>
    <vue-json-to-csv :json-data="[
        { name: 'Joe', surname: 'Roe' },
        { name: 'John', surname: 'Doe' }
      ]"
      :labels="{ name: { title: 'First name' } }"
      >
      <button>
        <b>My custom button</b>
      </button>
    </vue-json-to-csv>
  </div>
</template>

<script>
import Vue from 'vue'
import VueJsonToCsv from 'vue-json-to-csv' // eslint-disable-line

Vue.use(VueJsonToCsv)

export default {
  name: 'CsvDownload'
  components: {
    VueJsonToCsv
  }
}
</script>

[My custom button]をクリックするとCSV形式でダウンロードできると思います。 ひさびさ使ったのでtemplate直下のルート要素を複数指定しまってエラーになってしまいました。 あとimport時に怒られたのですが、サンプルなので // eslint-disable-lineで回避しています

使いそうなパターン

上のサンプルですと、データがハードコーディングになってしまうので、実業務ではほぼ使えないと思います データはtemplateと別管理にしたいと思います。

<template>
  <div>
    <div>hoge1234</div>
    <vue-json-to-csv :json-data=json_data :labels=labels>
      <button @click=download>
        <b>My custom button</b>
      </button>
    </vue-json-to-csv>
  </div>
</template>

<script>
import Vue from 'vue'
import VueJsonToCsv from 'vue-json-to-csv' // eslint-disable-line

Vue.use(VueJsonToCsv)

export default {
  name: 'CsvDownload',
  data () {
    return {
      labels: { name: { title: 'First name' } },
      json_data: []
    }
  },
  components: {
    VueJsonToCsv
  },
  methods: {
    download () {
      console.log('OK')
      this.json_data = [
        { name: 'hige', surname: 'Roe' },
        { name: 'John', surname: 'Doe' }
      ]
      this.json_data.push({ name: 'hige', surname: 'Roe', email: 'hogehoge@example.com' })
    }
  }
}
</script>

dowloadというmethodを追加して、フックすることにより非同期でデータを取ってきたり、[labels]指定で出力項目を管理画面上で 選択できるようにする事もできます。

まとめ

今回はリハビリを兼ねてvueの動作確認をしてみました。 画面上でサクサク変わるのは開発をしていてもやはり楽しいですね! もう少し開発が進んでいったら、応用パターンをいろいろ紹介できればと思います。