๐Ÿ“• Language/Vue

[vuejs] ํŠน์ • ์กฐ๊ฑด์—์„œ ๋™์  rowspan์„ ํ†ตํ•œ ํ…Œ์ด๋ธ” ๋ณ‘ํ•ฉ

a n u e 2023. 1. 9. 15:00

ํ•œ๋™์•ˆ ๊ฑฐ์ง€๊ฐ™๋˜ wijmo ๊ทธ๋ฆฌ๋“œ๋ฅผ ์“ฐ๋”๋‹ˆ ๊ฑท์–ด๋‚ด๊ณ  DevExtreme์œผ๋กœ ๋ฐ”๊พผ๋‹จ๋‹ค. -_-

ํ•˜์—ฌ๊ฐ„, ๋‹น๋ถ„๊ฐ„์€ ๊ทธ๋ฆฌ๋“œ ์†”๋ฃจ์…˜์„ ์“ฐ์ง€ ๋ง๊ณ  ๊ธฐ๋ณธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ธธ๋ž˜ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋‹ค.

 

์š”๊ตฌ์‚ฌํ•ญ์€ ์ด๋ ‡๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ํ‰๋ฒ”ํ•œ ๊ทธ๋ฆฌ๋“œ๋ฅผ

COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8
A category 100 2023-01-09 ์ƒํ’ˆ1 30000 1 30000 ์™„๋ฃŒ
A category 100 2023-01-09 ์ƒํ’ˆ2 10000 3 30000 ์™„๋ฃŒ
B category 200 2023-01-09 ์ƒํ’ˆ3 15000 2 30000 ์™„๋ฃŒ
A category 300 2023-01-09 ์ƒํ’ˆ4 10000 1 10000 ์™„๋ฃŒ
B category 400 2023-01-09 ์ƒํ’ˆ5 2000 5 10000 ๋ฏธ์™„๋ฃŒ

ํ•˜๋‹จ๊ณผ ๊ฐ™์ด ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8
A category 100 2023-01-09 ์ƒํ’ˆ1 30000 1 30000 ์™„๋ฃŒ
์ƒํ’ˆ2 10000 3 30000 ์™„๋ฃŒ
B category 200 2023-01-09 ์ƒํ’ˆ3 15000 2 30000 ์™„๋ฃŒ
A category 300 2023-01-09 ์ƒํ’ˆ4 10000 1 10000 ์™„๋ฃŒ
B category 400 2023-01-09 ์ƒํ’ˆ5 2000 5 10000 ๋ฏธ์™„๋ฃŒ

 

COL1๊ณผ COL2 ๊ทธ๋ฆฌ๊ณ  COL3์ด ๋™์ผํ•  ๋•Œ, ํ•ด๋‹น ์ปฌ๋Ÿผ๋งŒ ๋ณ‘ํ•ฉ์„ ํ•˜๋Š” ๋ชจ์–‘์ด๋‹ค.

๋ฐ์ดํ„ฐ ํŒŒ์ผ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋ณด์ž. COL4~COL8๊นŒ์ง€์˜ ์ปฌ๋Ÿผ์„ 2 depth๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผํ–ˆ๋‹ค.

 

export const dataInfo = [
 {
  COL1 : 'A category',
  COL2 : '100',
  COL3 : '2023-01-09'
  subInfo : [
    {
        COL4 : '์ƒํ’ˆ1',
        COL5 : 30000,
        COL6 : 1,
        COL7 : 30000,
        COL8 : '์™„๋ฃŒ'
    },
    {
        COL4 : '์ƒํ’ˆ2',
        COL5 : 10000,
        COL6 : 3,
        COL7 : 30000,
        COL8 : '์™„๋ฃŒ'
    }
  ],
 },
 {
  COL1 : 'B category',
  COL2 : '200',
  COL3 : '2023-01-09'
  subInfo : [
    {
        COL4 : '์ƒํ’ˆ3',
        COL5 : 15000,
        COL6 : 2,
        COL7 : 30000,
        COL8 : '์™„๋ฃŒ'
    },
   ],  
 },
 {
  COL1 : 'A category',
  COL2 : '300',
  COL3 : '2023-01-09'
  subInfo : [
     {
        COL4 : '์ƒํ’ˆ4',
        COL5 : 10000,
        COL6 : 1,
        COL7 : 10000,
        COL8 : '์™„๋ฃŒ'
     },
   ],  
},
{
  COL1 : 'B category',
  COL2 : '400',
  COL3 : '2023-01-09'
  subInfo : [
    {
        COL4 : '์ƒํ’ˆ5',
        COL5 : 2000,
        COL6 : 5,
        COL7 : 10000,
        COL8 : '์™„๋ฃŒ'
    },
  ],  
 }
];

 

๊ทธ๋ฆฌ๊ณ  <tbody> ์ชฝ์„ ์ด๋ ‡๊ฒŒ ๋งž์ถฐ์ฃผ๋ฉด ๋œ๋‹ค.

์šฐ์„  v-if๋ฅผ ๊ฑธ์–ด, 2 depth์˜ ๋ฐฐ์—ด์ด ํ•˜๋‚˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ(์ฆ‰, ๋ณ‘ํ•ฉ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ)

:rowspan์œผ๋กœ ์ปฌ๋Ÿผ ๋ณ‘ํ•ฉ์„ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ํ•˜๋‹จ์— ๋”ธ๋ฆฐ 2 depth์˜ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒํผ rowspan ๊ฐ’์„ ๊ฑธ์–ด์ฃผ์—ˆ๋‹ค. :rowspan="item.subInfo.length"

๊ทธ๋ฆฌ๊ณ , ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์„ COL4~COL8 ์ปฌ๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ slice๋กœ ์ชผ๊ฐœ์–ด ๋ฟŒ๋ ค์ฃผ์—ˆ๋‹ค.

 

๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ๊ทธ๋Œ€๋กœ ๋ฟŒ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

<tbody>
  <template v-for="(item, index) in table.data" :key="index">
    <template v-if="item.subInfo.length > 1"> <!--๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ-->
      <tr @click="selectRow('table', index)">
        <td class="ta-c" :rowspan="item.subInfo.length">{{ item.COL1 }}</td>
        <td class="ta-c" :rowspan="item.subInfo.length">
          <button type="button" @click="openPopup(item)" style="text-decoration: underline">{{ item.COL2 }}</button>
        </td>
        <td class="ta-c" :rowspan="item.subInfo.length">{{ item.COL3 }}</td>
        <td class="ta-l">{{ item.subInfo[0].COL4 }}</td>
        <td class="ta-r">{{ item.subInfo[0].COL5 }}</td>
        <td class="ta-c">{{ item.subInfo[0].COL6 }}</td>
        <td class="ta-r">{{ item.subInfo[0].COL7 }}</td>
        <td class="ta-c">{{ item.subInfo[0].COL8 }}</td>
      </tr>
      <template v-for="(itm, idx) in item.subInfo.slice(1, item.subInfo.length)" :key="idx">
        <tr>
          <td class="ta-l">{{ itm.COL4 }}</td>
          <td class="ta-r">{{ itm.COL5 }}</td>
          <td class="ta-c">{{ itm.COL6 }}</td>
          <td class="ta-r">{{ itm.COL7 }}</td>
          <td class="ta-c">{{ itm.COL8 }}</td>
        </tr>
      </template>
    </template>
    <template v-if="item.subInfo.length == 1"> <!--๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ-->
      <tr @click="selectRow('table', index)">
        <td class="ta-c">{{ item.COL1 }}</td>
        <td class="ta-c">
          <button>{{ item.COL2 }}</button>
        </td>
        <td class="ta-c">{{ item.COL3 }}</td>
        <td class="ta-l">{{ item.subInfo[0].COL4 }}</td>
        <td class="ta-r">{{ item.subInfo[0].COL5 }}</td>
        <td class="ta-c">{{ item.subInfo[0].COL6 }}</td>
        <td class="ta-r">{{ item.subInfo[0].COL7 }}</td>
        <td class="ta-c">{{ item.subInfo[0].COL8 }}</td>
      </tr>
    </template>
  </template>
</tbody>