Skip to main content

Menggunakan Zustand untuk membuat state management

ยท 4 min read

Apa itu state managementโ€‹

State management adalah sebuah cara untuk mengelola state pada aplikasi kita, state management ini biasanya digunakan pada aplikasi yang memiliki state yang kompleks, seperti aplikasi yang memiliki banyak komponen yang saling berhubungan, atau aplikasi yang memiliki banyak state yang saling berhubungan.

biasanya state management ini digunakan pada aplikasi yang menggunakan framework seperti react, vue, angular, dll. karena pada framework tersebut, state management ini tidak disediakan secara default, sehingga kita harus menggunakan library pihak ketiga untuk mengelola state pada aplikasi kita.

Mengapa kita perlu menggunakan state managementโ€‹

Ketika kita membuat aplikasi yang memiliki state yang kompleks, maka kita akan kesulitan untuk mengelola state tersebut, karena kita harus memikirkan bagaimana cara mengupdate state tersebut, bagaimana cara mengambil state tersebut, bagaimana cara menghapus state tersebut, dan lain sebagainya. sehingga kita akan kesulitan untuk mengelola state tersebut.

Apa itu Zustandโ€‹

Zustand adalah sebuah library state management sederhana yang dapat di gunakan dengan cepat dan mudah, zustand ini memiliki fitur yang lengkap, sehingga kita dapat mengelola state dengan mudah. zustand ini juga memiliki performa yang sangat cepat, sehingga cocok untuk digunakan pada aplikasi yang memiliki state yang kompleks. zustand ini juga sangat mudah untuk di gunakan, sehingga cocok untuk digunakan oleh pemula.

Cara menggunakan Zustandโ€‹

Instalasiโ€‹

Untuk menggunakan zustand, kita harus menginstall library zustand terlebih dahulu, kita dapat menginstall library zustand dengan cara berikut:

npm install zustand

Membuat storeโ€‹

Setelah kita menginstall library zustand, kita dapat membuat store dengan cara berikut:

buatlah file dengan nama useLoginStore.ts pada folder src/stores, lalu tambahkan kode berikut:



import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'

interface LoginState {
userData: { [x: string]: any } | null,
dataFetched: boolean,
setUser: (userData: { [x: string]: any }) => void
fetchUser: (axiosInstance: any) => void
logout: () => void
}

export const useLoginStore = create<LoginState>()(
devtools(
persist(
(set) => ({
userData: {},
setUser: (userData) => set(() => ({ userData })),
fetchUser: async (axiosInstance: any) => {

const url = `/api/auth/info`;
const opsResponse = await axiosInstance.post(url);
try {


const data = opsResponse.data.data;
return set({ userData: await data, dataFetched: true })
} catch (error) {

return set({ userData:null, dataFetched: true })
}

},
logout: () => set(() => ({ userData: {}, dataFetched: true })),
dataFetched: false,
}),
{
name: 'user-storage',
}
)
)
)

pada contoh di atas, kita membuat store dengan nama useLoginStore, pada store tersebut kita membuat state userData yang berisi data user, lalu kita membuat action setUser yang berfungsi untuk mengupdate state userData, lalu kita membuat action fetchUser yang berfungsi untuk mengambil data user dari server, lalu kita membuat action logout yang berfungsi untuk menghapus data user, lalu kita membuat state dataFetched yang berfungsi untuk menandakan apakah data user sudah diambil atau belum.

pada contoh di atas, kita juga menggunakan middleware devtools dan persist, devtools berfungsi untuk menampilkan state pada devtools, dan persist berfungsi untuk menyimpan state pada localstorage.

Menggunakan storeโ€‹

Setelah kita membuat store, kita dapat menggunakan store tersebut dengan cara berikut:

import { useLoginStore } from 'src/stores/useLoginStore' // import store


const { userData, setUser, logout } = useLoginStore() // gunakan store

pada contoh di atas, kita mengimport store useLoginStore yang telah kita buat sebelumnya, lalu kita menggunakan store tersebut dengan cara memanggil store tersebut. pada contoh di atas, kita memanggil state userData, dan action setUser dan logout dari store tersebut.

Memangambil user dataโ€‹

pada fungsi fetchUser, kita dapat mengambil data user dengan cara berikut:

import { useLoginStore } from 'src/stores/useLoginStore' // import store


const { userData, setUser, logout, fetchUser } = useLoginStore() // gunakan store

fetchUser(axiosInstance) // ambil data user

pada contoh di atas, kita mengambil data user dengan cara memanggil action fetchUser dari store tersebut.

Mengupdate stateโ€‹

Setelah kita menggunakan store, kita dapat mengupdate state dari store tersebut dengan cara berikut:

import { useLoginStore } from 'src/stores/useLoginStore' // import store


const { userData, setUser, logout } = useLoginStore() // gunakan store

setUser({ name: 'John Doe' }) // update state

pada contoh di atas, kita mengupdate state userData dengan cara memanggil action setUser dari store tersebut.

Menghapus stateโ€‹

Setelah kita menggunakan store, kita dapat menghapus state dari store tersebut dengan cara berikut:

import { useLoginStore } from 'src/stores/useLoginStore' // import store


const { userData, setUser, logout } = useLoginStore() // gunakan store

logout() // hapus state

pada contoh di atas, kita menghapus state userData dengan cara memanggil action logout dari store tersebut.

Mengambil Data Userโ€‹

Setelah kita menggunakan store, kita dapat mengambil data user dari store tersebut dengan cara berikut:

import { useLoginStore } from 'src/stores/useLoginStore' // import store


const { userData, setUser, logout } = useLoginStore() // gunakan store

console.log(userData) // ambil data user