Tutorial Vue 3 TypeScript #3: Menampilkan Data dari Rest API


Tutorial Vue 3 TypeScript #3: Menampilkan Data dari Rest API

Halo teman-teman semuanya, pada artikel sebelumnya kita semua telah belajar bagaimana cara installasi dan konfigurasi Vue Router di dalam project Vue 3 TypeScript. Dan pada artikel ini, kita semua akan belajar menampilkan data dari Rest API di Vue 3 TypeScript.

Dalam tutorial ini, kita akan belajar:

  • Installasi dan Konfigurasi Axios di Vue 3.
  • Cara mengambil data dari API menggunakan Axios dengan TypeScript.
  • Menggunakan onMounted dan ref dari Vue Composition API untuk mengelola data.
  • Menampilkan data dalam component Vue 3 menggunakan TypeScript.
  • Membuat Route untuk menampilkan halaman products menggunakan Vue Router.

Langkah 1 - Installasi Axios

Hal pertama yang mesti kita lakukan adalah melakukan installasi library tambahan seperti Axios. Axios kita gunakan untuk melakukan berbagai macam proses HTTP service ke dalam backend, seperti GET, POST, PATCH dan DELETE.

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Vue 3.

npm install axios@1.8.4

Silahkan tunggu proses installasinya sampai selesai dan pastikan teman-teman terhubung dengan internet.

Langkah 2 - Konfigurasi Endpoint API

Setelah menginstal Axios, langkah selanjutnya adalah membuat instance Axios agar lebih mudah mengelola perubahan domain API. Dengan ini, kita hanya perlu mengubah satu baris kode saat ada perubahan, tanpa harus mengganti alamat API di banyak tempat.

Silahkan teman-teman buat folder dengan nama api di dalam folder src, kemudian tambahkan file index.ts dan masukkan kode berikut ini di dalamnya.

src/api/index.ts

//import axios
import axios from 'axios';

const Api = axios.create({
    //set default endpoint API
    baseURL: 'http://localhost:8000'
})

export default Api

Coba teman-teman perhatikan dari penambahan kode di atas, pada bagian baseURL itu merupakan alamat domain dari project Laravel.

Langkah 3 - Menampilkan Data dari Rest API

Setelah Axios berhasil terinstall dan konfigurasi endpoint juga sudah dibuat, maka kita bisa lanjutkan melakukan proses menampilkan data dari Rest API di dalam project Vue 3 dan TypeScript.

Silahkan teman-teman buat folder baru dengan nama products di dalam folder src/views, kemudian di dalam folder products silahkan buat file baru dengan nama index.vue dan masukkan kode berikut ini di dalamnya.

src/views/products/index.vue

<script setup lang="ts">

//import ref dan onMounted dari Vue
import { ref, onMounted } from "vue";

//import service api
import Api from "../../api";

// Interface Product
interface Product {
    id: number;
    image: string;
    title: string;
    description: string;
    price: number;
    stock: number;
}

// State products
const products = ref<Product[]>([]);

// Fetch data products dari API
const fetchDataProducts = async () => {
    try {

        //fetch data products dari API
        const response = await Api.get("/api/products");

        //set data products
        products.value = response.data.data.data;

    } catch (error) {

        //log error
        console.error("Error fetching products:", error);
    }
};

//run hook "onMounted"
onMounted(() => {

    //call method "fetchDataPosts"
    fetchDataProducts();
});
</script>

<template>
    <div class="container mt-5 mb-5">
        <div class="row">
            <div class="col-md-12">
                <router-link to="/products/create" class="btn btn-md btn-success rounded-5 shadow border-0 mb-3">
                    ADD NEW PRODUCT
                </router-link>
                <div class="card border-0 rounded-3 shadow">
                    <div class="card-body">
                        <table class="table table-bordered">
                            <thead class="bg-dark text-white">
                                <tr>
                                    <th scope="col">Image</th>
                                    <th scope="col">Title</th>
                                    <th scope="col">Description</th>
                                    <th scope="col">Price</th>
                                    <th scope="col">Stock</th>
                                    <th scope="col" style="width: 15%">Actions</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr v-if="products.length === 0">
                                    <td colspan="6" class="text-center">
                                        <div class="alert alert-danger mb-0">No data available</div>
                                    </td>
                                </tr>
                                <tr v-for="product in products" :key="product.id">
                                    <td class="text-center">
                                        <img :src="product.image" :alt="product.title" width="200" class="rounded-3" />
                                    </td>
                                    <td>{{ product.title }}</td>
                                    <td>{{ product.description }}</td>
                                    <td>{{ product.price.toLocaleString('id-ID') }}</td>
                                    <td>{{ product.stock }}</td>
                                    <td class="text-center">
                                        <router-link :to="`/products/edit/${product.id}`"
                                            class="btn btn-sm btn-primary rounded-5 shadow border-0 me-2">
                                            EDIT
                                        </router-link>
                                        <button class="btn btn-sm btn-danger rounded-5 shadow border-0">
                                            DELETE
                                        </button>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

Dari penambahan kode di atas, kita menginisialisasi component Vue 3 dengan TypeScript menggunakan attribute lang="ts" di dalam tag <script setup>.

<script setup lang="ts">

	//...
	
</script>

Dengan menambahkan lang="ts", kita memberi tahu Vue bahwa component ini menggunakan TypeScript, sehingga kita dapat memanfaatkan fitur type checking dan intellisense yang lebih baik saat mengembangkan aplikasi.

Di dalamnya, kita import ref dan onMounted dari Vue.

//import ref dan onMounted dari Vue
import { ref, onMounted } from "vue";

Kemudian kita import service API.

//import service api
import Api from "../../api";

Setelah itu, kita membuat interface yang bernama Product.

// Interface Product
interface Product {
    id: number;
    image: string;
    title: string;
    description: string;
    price: number;
    stock: number;
}

Interface di atas digunakan untuk mendefinisikan struktur data product yang diterima dari API dan memastikan bahwa setiap product memiliki tipe data yang sesuai.

Kemudan kita membuat state baru dengan nama products dan di dalamnya kita inisialisasi menggunakan ref dengan interface Product yang kita buat di atas.

// State products
const products = ref<Product[]>([]);

Pada deklarasi state di atas, kita menggunakan interface Product sebagai tipe data untuk memastikan bahwa data yang disimpan di dalam state harus sesuai dengan struktur yang telah didefinisikan dalam interface. Dengan cara ini, setiap item dalam array products akan mengikuti format yang sudah ditentukan, sehingga lebih aman dan terstruktur.

Kemudian kita membuat function baru dengan nama fetchDataProducts.

// Fetch data products dari API
const fetchDataProducts = async () => {

	//...
	
}

Di dalamnya, kita melakukan fetch ke backend melalui REST API dengan endpoint /api/products dan method yang digunakan adalah GET.

//fetch data products dari API
const response = await Api.get("/api/products");

Jika berhasil, maka kita akan assign response data ke dalam state products.

//set data products
products.value = response.data.data.data;

Agar function fetchDataProducts bisa dijalankan ketika halaman dibuka, mka akita perlu memanggilnya di dalam hook onMounted.

//run hook "onMounted"
onMounted(() => {

    //call method "fetchDataPosts"
    fetchDataProducts();
});

Dan untuk menampilkan data di dalam template, kita menggunakan sebuah kondisi untuk memastikan apakah ada datanya atau tidak.

Jika data products sama dengan 0, maka kita akan menampilkan pesan No data available.

<tr v-if="products.length === 0">
    <td colspan="6" class="text-center">
        <div class="alert alert-danger mb-0">No data available</div>
    </td>
</tr>

Tapi jika data products lebih dari 0, maka kita akan menampilkannya dengan cara dilooping (iterasi) menggunakan directive v-for.

<tr v-for="product in products" :key="product.id">

	//...
	
</tr>

Langkah 4 - Konfigurasi Route Products Index

Kita lanjutkan untuk membuat konfigurasi route-nya, sehingga nanti halaman products bisa ditamilkan di dalam aplikasi.

Silahkan buka file src/routes/index.ts, kemudian ubah kode-nya menjadi seperti berikut ini.

src/routes/index.ts

//import createRouter, createWebHistory and Type RouteRecordRaw from vue-router
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'

// Define route type with explicit type annotations
const routes: Array<RouteRecordRaw> = [
    {
        path: '/',
        name: 'home',
        component: () => import(/* webpackChunkName: "home" */ '../views/home.vue')
    },
    {
        path: '/products',
        name: 'products',
        component: () => import(/* webpackChunkName: "products" */ '../views/products/index.vue')
    }
]

// Create router with explicit type annotations
const router = createRouter({
    history: createWebHistory(),
    routes
})

export default router

Di atas, kita membuat konfigurasi route baru, dimana untuk path atau URL-nya kita arahkan ke /products dan component atau view yang dipanggil adalah views/products/index.vue.

Langkah 5 - Uji Coba Menampilkan Data

Setelah semua berhasil dibuat, sekarang kita akan lakukan uji coba di dalam browser untuk melihat hasilnya, silahkan teman-teman klik menu PRODUCTS yang ada di navbar.

Atau bisa juga ke URL berikut ini http://localhost:5173/products, jika berhasil maka akan menampilkan hasil seperti berikut.

Kesimpulan

Pada artikel ini, kita semua telah belajar banyak hal, seperti installasi dan konfigurasi Axios, kemudian menampilkan data dari Rest API menggunakan TypeScript di Vue 3, membuat konfigurasi route untuk menampilkan halaman products.

Pada artikel selanjutnya, kita semua akan belajar bagaimana cara melakukan proses insert dan upload gambar di Vue 3 TypeScript menggunakan Rest API.

Terima Kasih


Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami