前端表格資料處理技巧

前端工程師的日常免不了要接 API 的資料回來列表,有條理地呈現資料,讓我來整理一下資料列表常用的技巧。

在這裡我們使用 random user API 的資料來做表格處理:

`https://randomuser.me/api/?results=10 `
`// ?results=10 就是傳10 筆資料回來 `

資料的格式如下:

{
    "results": [
        {
            "gender": "male",
            "name": {
                "title": "Mr",
                "first": "Väinö",
                "last": "Saksa"
            },
            "location": {
                "street": {
                    "number": 1575,
                    "name": "Tahmelantie"
                },
                "city": "Merijärvi",
                "state": "Ostrobothnia",
                "country": "Finland",
                "postcode": 86821,
                "coordinates": {
                    "latitude": "-29.2488",
                    "longitude": "-138.7519"
                },
                "timezone": {
                    "offset": "-4:00",
                    "description": "Atlantic Time (Canada), Caracas, La Paz"
                }
            },
            "email": "vaino.saksa@example.com",
            "login": {
                "uuid": "fd42d88d-123d-47fe-9a63-bcf6a1ee6f95",
                "username": "happyelephant720",
                "password": "oscar1",
                "salt": "hjmYC05f",
                "md5": "29f5d99c405a0587f056bcde36a3f3c3",
                "sha1": "e4fcde453c18d85c5a3d3204ff2bcef6bcd46160",
                "sha256": "df6dd20d96cbd5fd81a8cbebba75e573c620ec27af512e8d9c823a776fecf66e"
            },
            "dob": {
                "date": "1989-10-07T03:02:44.944Z",
                "age": 34
            },
            "registered": {
                "date": "2021-04-27T22:17:04.410Z",
                "age": 2
            },
            "phone": "07-099-396",
            "cell": "043-633-77-51",
            "id": {
                "name": "HETU",
                "value": "NaNNA909undefined"
            },
            "picture": {
                "large": "https://randomuser.me/api/portraits/men/41.jpg",
                "medium": "https://randomuser.me/api/portraits/med/men/41.jpg",
                "thumbnail": "https://randomuser.me/api/portraits/thumb/men/41.jpg"
            },
            "nat": "FI"
        }
    ],
    "info": {
        "seed": "116acbb60495949f",
        "results": 1,
        "page": 1,
        "version": "1.4"
    }
}

axios 接回來的資料我們先做一下處理,只取姓名、gender、age及email:

const userList = ref([])
axios.get('https://randomuser.me/api/')
  .then((res) => {
    userList.value = res.data.results.map((m)=>{
      const  tempUser={};
      tempUser.name=`${m.name.first} ${m.name.last}`;
      tempUser.gender=m.gender;
      tempUser.age=m.dob.age;
      tempUser.email=m.email;      
      return tempUser
    });
    console.log(userList.value);
  })

然後我們設計一下表頭的資料格式:

const fields = ref([
  { key: 'name', label: '姓名' },
  { key: 'gender', label: '性別' },
  { key: 'age', label: '年紀' },
  { key: 'email', label: '電子郵件' }
])

表頭利用 v-for 來跑 <th>:

<table>
    <thead>
      <tr>
        <th v-for="field in fields" :key="field.key" >{{ field.label }}
        </th>
      </tr>
    </thead>    
</table>

前端網頁上呈現的結果如下:

接著要v-for跑 <tbody> 裡面的資料:

  • 利用前面處理好的 userList 來跑<tr>
  • 然後用 fields 來跑 <td> 裡面的資料。
<tbody>
      <tr v-for="user in userList" :key="user.name">
        <td v-for="field in fields" :key="field.key">{{ user[field.key] }} </td>
      </tr>
</tbody>

field.key 分別為 name、gender、age及email,對應的 user[field.key] 就是 user.name、user.gender、user.age及user.email。

完整程式碼:

<script setup>
import axios from 'axios';
import { ref } from 'vue'
const userList = ref([])
axios.get('https://randomuser.me/api/?results=10')
  .then((res) => {
    console.log(res);
    userList.value = res.data.results.map((m)=>{
      const  tempUser={};
      tempUser.name=`${m.name.first} ${m.name.last}`;
      tempUser.gender=m.gender;
      tempUser.age=m.dob.age;
      tempUser.email=m.email;      
      return tempUser
    });
    console.log(userList.value);
  })

const fields = ref([
  { key: 'name', label: '姓名' },
  { key: 'gender', label: '性別' },
  { key: 'age', label: '年紀' },
  { key: 'email', label: '電子郵件' }
])
</script>

<template> 
  <table>
    <thead>
      <tr>
        <th v-for="field in fields" :key="field.key">{{ field.label }}
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="user in userList" :key="user.name">
        <td v-for="field in fields">{{ user[field.key] }} </td>
      </tr>
    </tbody>
  </table>
</template>

Leave a Reply

Your email address will not be published. Required fields are marked *