Tech Hotoke Blog

IT観音とは私のことです。

Vue×SpringでSPA作成13【MyBatisの導入、Read処理~フロントエンド偏~】

f:id:TechHotoke:20220218004406p:plain

まえがき

こちらの記事の続編です。

techhotoke.hatenablog.com

目的

VueとSpringで作成したプロジェクトの構築手順の備忘録。 備忘録のため、詳細な説明を省略している部分があります。

前提

  • 基本的なJavaの知識やSpringの知識があること
  • 基本的なJavaScriptの知識やVueの知識があること

環境

  • Java 11
  • Spring Boot2.5.6
  • Gradle 7.1.1
  • Vue2.6
  • IDE:InteliJ
  • AWS(EC2,RDS,ELBなど)

やること

  • 一覧画面の作成
  • DBの情報を一覧表示する

実装

  • まず最初に npm install axios --save コマンドなどでaxiosをインストールします

  • main.jsに依存関係を追加します

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store/'
import axios from 'axios'
import vuetify from '@/plugins/vuetify'

Vue.config.productionTip = false

axios.defaults.baseURL = '/api';

// Cookieを有効にする。
axios.defaults.withCredentials = true;
Vue.prototype.$axios = axios;

Vue.use(vuetify)

new Vue({
  router,
  store,
  axios,
  vuetify,
  render: h => h(App)
}).$mount('#app')
  • src/frontend/views配下にDankaList.vueを作成します。
<template>
  <div>
      <template>
        <v-data-table
          :headers="headers"
          :items="dankaList"
          :page.sync="page"
          :items-per-page="itemsPerPage"
          class="elevation-1"
          @page-count="pageCount = $event"
          hide-default-footer
        >
          <template v-slot:[`item.actions`]="{ item }">
            <v-icon  color="green" class="mr-6" @click="editItem(item)">
              mdi-pencil
            </v-icon>
            <v-icon color="red" @click="deleteItem(item)"> mdi-delete </v-icon>
          </template>
          <template v-slot:no-data>
            <v-btn color="primary" @click="getDanakList()"> Reset </v-btn>
          </template>
        </v-data-table>
        <div class="text-right pt-2">
          <v-pagination v-model="page" :length="pageCount"></v-pagination>
          <v-text-field
            :value="itemsPerPage"
            label="Items per page"
            type="number"
            min="-1"
            max="15"
            @input="itemsPerPage = parseInt($event, 10)"
          ></v-text-field>
        </div>
      </template>
  </div>
</template>

<script>
export default {
  name: "DankaList",
  data: () => ({
    dankaList: [],
    page: 1,
    pageCount: 0,
    itemsPerPage: 10,
    dialog: false,
    dialogDelete: false,
    headers: [
      {
        text: "施主名",
        align: "start",
        value: "dnkSeshuName",
      },
      { text: "戸主名", value: "dnkKoshuName" },
      { text: "戸主名2", value: "dnkKoshuName2" },
      { text: "住所", value: "dnkAddress1" },
      { text: "電話番号", value: "dnkPhonenumber1" },
      { text: "メールアドレス", value: "dnkEmail1" },
      { text: "備考", value: "dnkBikou1" },
      { text: "Actions", value: "actions", sortable: false },
    ],
    editedIndex: -1,
    editedItem: {
      seshuName: "",
      koshuName: "",
      koshuName2: "",
      address: "",
      phonenumber: "",
      mailAddress: "",
      remark: ""
    },
    defaultItem: {
      seshuName: "",
      koshuName: "",
      koshuName2: "",
      address: "",
      phonenumber: "",
      mailAddress: "",
      remark: ""
    },
  }),
  computed: {
    formTitle() {
      return this.editedIndex === -1 ? "新規登録" : "編集";
    },
  },
  created() {
    this.getDanakList();
  },
  methods: {
    getDanakList() {
      const _this = this;
      this.$axios.get("/danka").then(response => {
        _this.dankaList = response.data;
      });
    },
  • 細かい説明は省きますが、一覧表示・ページネーション、編集・削除ボタンの作成を行っています。上記の実装で下記のような画面が表示されればOKです。

f:id:TechHotoke:20220227000911p:plain

ポイントとなるのはこの部分で、

  created() {
    this.getDanakList();
  },
  methods: {
    getDanakList() {
      const _this = this;
      this.$axios.get("/danka").then(response => {
        _this.dankaList = response.data;
      });
    },
  1. createdメソッドがDOMの生成前に走る
  2. getDankaListメソッドが走る
  3. /dankaというパスでaxios経由でバックエンドから一覧データを取得しdankaList変数に格納する(前回のDankaControllerに作成したgetAllDankaメソッドが呼ばれています)
  4. dankaList変数の各プロパティをテーブル上に表示する

参考: vue.jsのcreatedとmountedの違いを目で見て理解 | アールエフェクト

今回はここまでとなります! お付き合い頂きありがとうございます!