iT邦幫忙

0

vue.js 多表頭表格資料架構

  • 分享至 

  • xImage

各位大大好
小弟目前在製作一個年份業績比較表的時候碰上了問題
目前設計如附圖
https://ithelp.ithome.com.tw/upload/images/20211007/20123565Aj81GYcScu.jpg
小弟對於資料架構的設計不是很滿意
但腦袋卡住 想不到有什麼更好的方法
有幾個問題想問大大們

  1. 是否有更好的比較表格呈現方式
    這問題比較關於 UI
    個人總覺得年份業績比較可能還有更好的呈現方式
    可是目前就只能做到這樣QQ

  2. 重複表頭利用
    因為是年份比較
    會看到大部分欄位都重複名稱
    就會想重複利用同樣的架構
    目前設計是依 tr 分成三個

    first_headers: {
        0: {
            field_name: "子部門/年",
            rowspan: 3
        },
        1: {
            field_name: "2021 (09-09)",
            colspan: 8
        },
        2: {
            field_name: "2020 (09-09)",
            colspan: 8
        }
    },
    second_headers: {
        0: {
            field_name: "掛訂",
            colspan: 3,
        },
        1: {
            field_name: "銷貨",
            colspan: 5
        }
    },
    third_headers: {
        0: {
            field_name: "數量"
        },
        1: {
            field_name: "金額"
        },
        2: {
            field_name: "平均單價"
        },
        3: {
            field_name: "數量"
        },
        4: {
            field_name: "金額"
        },
        5: {
            field_name: "毛額"
        },
        6: {
            field_name: "毛利率"
        },
        7: {
            field_name: "平均單價"
        }
    },

而看到 第二個第三個 header
我都想要重複再跑一次迴圈
可是沒辦法把雙迴圈寫在一個 tag
所以小弟目前是用
重複印兩次 tag (很笨QQ)
就像是

 <tr class="elife_table_header">
   <th v-for="(header, index) in second_headers" :colspan="checkIsset(header.colspan)?header.colspan:1" class="table_cell_border" nowrap>{{ header.field_name }}</th>
   <th v-for="(header, index) in second_headers" :colspan="checkIsset(header.colspan)?header.colspan:1" class="table_cell_border" nowrap> {{ header.field_name }}</th>
   </tr>

有試過用 template 來跑雙迴圈
但template IE 不支援
想問問還有沒有其他做法

感覺有可以再改進的地方 希望各位大大指教

Andy Tsou iT邦新手 5 級 ‧ 2021-10-14 15:20:36 檢舉
如果是要比較,顯示金額的表格裡改成顯示各年份的?
st474ddr iT邦新手 2 級 ‧ 2021-10-14 15:59:24 檢舉
@Andy Tsou 大大
感謝回覆
不好意思
不是很懂你的回答
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
水無痕
iT邦新手 3 級 ‧ 2021-10-08 08:43:09
最佳解答

考慮到 component 重用性

我會選擇把 table 直切,然後橫排

注意:直切就要考慮到瀏覽器版面不夠寬時,還怎麼處理 !

第一個 table 就是 子部門/年 這個 column

第二個以上的 table 就是 各年度 (N月~ N月)
這個 table 就是一個 component
只要傳入該年度的資料

資料結構就改成以傳入 component 的為主 !

其實就是該年度的所有 row 的資料

--

另外,thead 的資料結構
我會用下面的結構,來保有視覺上的結構,這樣在維護上,會相對直覺 !

{
    year : "2021 (09-09)",
    colspan : 8,
    columns : [
        { 
            name : "掛訂", 
            colspan: 3 ,
            columns : [
                "數量",
                "金額",
                "平均單價"
            ]
        },
        { 
            name : "銷貨", 
            colspan: 5 ,
            columns : [
                "數量",
                "金額",
                "毛額"
                .... (自行補)
            ]
        },
    ]
}

其中某年度下的 columns 可以直接宣告成變數
分別 assign 給各年度來重複利用
就不用一直重複宣告了 !


然後後端來的資料,大概就是

因為我沒看到 子部門/年 是否有 rowspan 的結構,所以先假想成沒有 !

{
    year : "2021 (09-09)",
    rows : [
        {
                "數量" : "",
                "金額" : "",
                "平均單價 : "",
                "數量" : "",
                "金額" : "",
                "毛額 : "",
                .... (自行補)
        },
        {
                "數量" : "",
                "金額" : "",
                "平均單價 : "",
                "數量" : "",
                "金額" : "",
                "毛額 : "",
                .... (自行補)
        },
        // ....
    ]
}

總之就是,子母關係的欄位對應,我都不會想要平拆 !

看更多先前的回應...收起先前的回應...
st474ddr iT邦新手 2 級 ‧ 2021-10-08 09:23:15 檢舉

感謝大大的回覆
這架構好太多了~

只是小弟有幾個不懂的地方想請教
想請問大大這樣是把 1個年度的所有資料(表頭+資料)當作一個 component 對嗎?

若是這樣規劃的話就想請問

第一個 table 就是 子部門/年 這個 column

可是他是跟著 2021(09-09)在同一個 tr 的
如果單純把年分包起來成一個 component 的話可能會遇到要加</tr>的問題?
還是小弟會錯意
所以 html 中的架構的話應該會像

<table>
  <tr>
      <th rowspan="3">子部門</th>
      <year-sale year="2021" month="09"></year-sale>
      <year-sale year="2020" month="09"></year-sale>
</table>

我猜是我會錯意拉

水無痕 iT邦新手 3 級 ‧ 2021-10-08 10:15:42 檢舉

我指的是這樣的結構,如果有二年的資料,就總共三張表

<table>
  <tr>
      <th rowspan="3">子部門</th>
  </tr>
</table>
<year-sale year="2021" month="09"></year-sale>
<year-sale year="2020" month="09"></year-sale>

每個 year-sale component 裡面就是完整的 table !
然後每個 table 就橫向並列 !

水無痕 iT邦新手 3 級 ‧ 2021-10-08 10:21:42 檢舉

突然想到一件事 ...

可以把子部門 column 也放到 year-sale 中
然後同樣把 table 並排,往右第二個以及更右邊的 year-sale 就不顯示 子部門 column !

st474ddr iT邦新手 2 級 ‧ 2021-10-08 13:38:58 檢舉

大致上了解您的意思
感謝大大

小弟沒想過 table 橫排
會再研究看看版面會不會出問題XD

0
ckp6250
iT邦好手 1 級 ‧ 2021-10-07 17:07:36

若站在使用者立場,這類【年份業績比較表】,大家最偏愛的,應該還是 Excel 表。

所以,事先建立好 Excel 範本,然後用 php-excel 把數值填入,寫的人輕鬆,用的人滿意,還能自行微調,皆大歡喜。

依我個人的習慣,所有報表一律以 Excel 呈現給客戶,不在螢幕介面上傷腦筋。

st474ddr iT邦新手 2 級 ‧ 2021-10-07 17:22:28 檢舉

大大好
問題這是公司主管要看的
主管比較喜歡上系統看
所以很多報表全都在系統上做觀看Q

ckp6250 iT邦好手 1 級 ‧ 2021-10-08 09:11:06 檢舉

在系統上看也行呀,

還是做成 Excle,然後嵌在系統頁面上,並不用下載再打開。(如下圖)

推薦 Excle 模式的主因是,版面彈性大,查看時可以鎖定標題寫格,不會往下捲時就欄標題不見了,或者往右捲時第一欄不見啦。列印時表頭表尾跳頁不必費心去管,又,還能分享出去或直接Email給別人,這些附加功能,都不是您目前table模式能簡單做好的。

https://ithelp.ithome.com.tw/upload/images/20211008/20119662Uewpo52YoY.png

若點開成全螢幕時,還有額外功能,這些都不用我們動手,我實在看不出來,自己寫的Table式報表,能達到它的便利性?
https://ithelp.ithome.com.tw/upload/images/20211008/20119662LBQ5U2zTcH.png

st474ddr iT邦新手 2 級 ‧ 2021-10-08 14:36:00 檢舉

大大我懂您的意思
可是我們主管就喜歡看自己網站架構的版型QQ
我找機會一點一點的改XD
看有沒有辦法讓主管覺得 excel比較好

我要發表回答

立即登入回答