Vue.js vuetify Data Table - 2

Vue.js vuetify Data Table - 2

지난 포스팅에서 데이터를 성공적으로 가져왓다면 이제 Data Table에 해당하는 데이터를 넣어 줄 차례이다. Data table은 페이징, 검색, 분류기능이 다 제공되어 편리하게 프론트를 구성할 수 있다. 개인적으로 페이징 처리는 예비 개발자로써 중요하다고 생각이 들기 때문에 이 프로젝트가 끝난 후 개인 프로젝트에서 다시 적용해 볼 예정이다.

전체 코드

//테이블 코드
<div class="overflow">
    <!-- 테이블 -->
    <v-card>
      <v-card-title class="search-bar">
          <v-text-field
            v-model="search"
            append-icon="mdi-magnify"
            label="Search"
            single-line
            hide-details
          ></v-text-field>
       </v-card-title>

        <v-data-table
          class="row-pointer mt-4"
          //테이블의 헤더
          :headers="headers"
          //테이블 body의 데이터가 될 mapState 값을 넣어줍니다.
          :items="tableList"
          :search="search" >

        <-- template 파트는 필수 항목은 아니지만 테이블의 구성을 수정하고 싶을  사용하면 됩니다 -->
        <template v-slot:item="props">
        <-- props를 출력하면 tableList에 해당하는 데이터가 JSON형식으로 출력됩니다-->
          <tr class="job-info" @click="moveDtlPage(props.item.jobNo)">
            <td ></td>
            <td><p id="job-title"></p><p>

              <table>
                <tr >
              <td class="title-dtl"><span></span></td>
              <td class="title-dtl"><span></span></td>
              <td class="title-dtl"><span></span></td>
              </tr>
              </table>
              </p></td>
            <td></td>
            <td></td>
            <td v-if="props.item.deadline.includes('채용시까지')">
             채용시까지</td>
            <td v-else>
              <!-- d-day 7일이하  -->
              <b-btn class="d-day-btn argent-btn mr-2"
              v-if="($moment($moment(20+props.item.deadline).format('YYYY-MM-DD')).diff($moment(new Date()), 'days') + 1 ) <= 7">D-
              
              </b-btn>
              <!-- d-day 20일이하  -->
              <b-btn class="d-day-btn warn-btn mr-2"
              v-else-if="($moment($moment(20+props.item.deadline).format('YYYY-MM-DD')).diff($moment(new Date()), 'days') + 1 ) > 7 &&
              ($moment($moment(20+props.item.deadline).format('YYYY-MM-DD')).diff($moment(new Date()), 'days') + 1 ) <=20 ">D-
              
              </b-btn>

              <b-btn class="d-day-btn ok-btn mr-2" v-else>D-
              
              </b-btn>
              
            </td>
          </tr>
        </template>
        </v-data-table>
    </v-card>
      </div>


import { createNamespacedHelpers } from "vuex";
const { mapState } = createNamespacedHelpers("jobStore");

export default {
  data: () => ({
    search: "",

    //테이블의 헤더에 해당하는 내용을 작성해줍니다. class css 수정용으로 작성한 내용이므로 신경쓰지 않으셔도 됩니다.
    headers: [
      { text: "기업명", value: "company", class: "custom-header" },
      { text: "제목", value: "title", class: "custom-header" },
      { text: "지원자격", value: "ability", class: "custom-header" },
      { text: "근무조건", value: "Condition", class: "custom-header" },
      { text: "마감일", value: "deadline", class: "custom-header" },
    ],
  }),
  //store이름을 다르게 구성하엿으니 신경쓰지 않으셔도됩니다!
  mounted() {
    this.$store.dispatch("jobStore/loadJobTable");
  },

  methods: {
    //상세페이지로 이동하는 메소드
    moveDtlPage: function (e) {
      this.$router.push({ name: "jobInfoDtl", params: { wantedNo: e } });
    },
  },
  computed: {
    ...mapState([
      //매핑값
      "tableList",
      "jobInfo",
    ]),
  },
};

데이터만 잘 가지고 온다면 테이블에 데이터를 넣어주는 과정은 그렇게 어렵지 않은 것 같다. 물론 테이블의 데이터를 수정하고 싶을 때 v-slot:item=”props” 을 사용하는 것을 같은 팀원이 알려주었는데 사실 정확하게 어떻게 돌아가는 건지 아직 파악을 하지 못했다.

프로젝트에 필요한 부분 부분만 공부하다보니 공부에 공백이 생기는 것 같아서 아쉽지만, 처음부터 프로그래밍의 모든것을 공부하기란 쉽지않아서.. 프로젝트가 끝난후에 처음부터 개념 정리용으로 다시 공부를 시작해봐야겟다.