Apa saja yang akan dibahas?
Masih ingat bagaimana cara menggunakan RTK?
Mari kita coba lihat kembali kode yang terakhir dituliskan di sini dan mengingat langkah apa saja yang sudah dilakukan:
Dan... selesai, kita sudah berhasil menggunakan Redux Toolkit dengan baik !
WARNING: ini hanyalah langkahnya saja, sebenarnya kode yang ditulis cukup banyak.
Bagaimanakah bila kita ingin melakukan penarikan data dari external (API) pada saat menggunakan RTK?
Salah satu solusi yang diberikan dari RTK, adalah dengan menggunakan RTK Query
Mari kita coba lihat kembali kode yang terakhir dituliskan di sini dan mengingat langkah apa saja yang sudah dilakukan:
Dan... selesai, kita sudah berhasil menggunakan RTK Query dengan baik !
WARNING: ini hanyalah langkahnya saja, sebenarnya kode yang ditulis cukup banyak.
Cukup menyulitkan bukan menggunakan Redux Toolkit dan RTK Query ini?
Jadi bagaimana apabila kita ingin membuat sebuah project yang menggunakan state management?
Apakah harus selalu menggunakan boilerplate dan template yang sebanyak ini?
Apakah ada solusi lainnya untuk State Management selain Redux Toolkit ini?
Please welcome ... Zustand
Dikutip dari halaman Github-nya Zustand
Zustand adalah solusi state management yang kecil, cepat, dan bisa di-scale yang menggunakan prinsip flux, berbasis hooks, tidak terlalu ber-boilerplate ataupun teropini !
Pssttttt..... cara penggunaan Zustand bisa jadi JAUH lebih mudah ketimbang menggunakan Redux Toolkit
(Apabila tidak memikirkan RTK Query-nya)
Cara menggunakan Zustand pun tidak terlalu sulit:
npm i zustand
import create from "zustand";
const useCounterStore = create((set) => ({
// state
counter: 0,
// "action"
increaseCounter: () => set((state) => ({ counter: state.counter + 1 })),
}));
// selector state & action
export const selectCounter = (state) => state.counter;
export const selectActionIncreaseCounter = (state) => state.increaseCounter;
export default useCounterStore;
import useCounterStore, {
selectCounter,
selectActionIncreaseCounter,
} from "./stores/counter";
function App() {
// gunakan layaknya hooks, cari state dengan cara selector
const counter = useCounterStore(selectCounter);
// gunakan layaknya hooks, cari action dengan cara selector juga
const increaseCounter = useCounterStore(selectActionIncreaseCounter);
return (
<div className="App">
<h1>Current Counter: {counter}</h1>
<button onClick={() => increaseCounter()}>Increase</button>
</div>
);
}
export default App;
Bagaimanakah kasusnya bila kita ingin memiliki suatu data yang didapatkan dari external seperti dari API?
Apakah harus menggunakan Middleware seperti kita menggunakan RTK Query?
Jawaban pendeknya adalah: TYDAQUE !
Zustand tidak peduli apakah suatu "action" yang dibuat adalah bersifat async ataupun tidak. Keduanya bisa digunakan bersamaan
a.k.a Tinggal declare saja !
Psssstttttt.... tapi kita jadi butuh axios lagi nih.
Misalkan kita ingin mengambil data dari JSONPlaceholder (Posts), maka yang dilakukan adalah:
import axios from "axios";
import create from "zustand";
const useJSONPlaceholderStore = create((set) => ({
// state awal berupa sebuah array kosong
posts: [],
// action yang bersifat async
getPosts: async () => {
// asumsi selalu berhasil, tidak ada try catch
const response = await axios.get(
"https://jsonplaceholder.typicode.com/posts"
);
// selesai fetch data akan menuliskan ulang state posts
set({ posts: response.data });
},
}));
// selector state dan action
export const selectPosts = (state) => state.posts;
export const selectActionGetPosts = (state) => state.getPosts;
export default useJSONPlaceholderStore;
import React, { useEffect } from "react";
import useJSONPlaceholderStore, {
selectPosts,
selectActionGetPosts,
} from "./stores/jsonplaceholder";
function App() {
// gunakan layaknya hooks, cari state dengan cara selector
const posts = useJSONPlaceholderStore(selectPosts);
// gunakan layaknya hooks, cari action dengan cara selector juga
const getPosts = useJSONPlaceholderStore(selectActionGetPosts);
// Karena ingin dipanggil saat pertama kali Component ada, gunakan useEffect
useEffect(() => {
getPosts();
}, []);
return (
<div className="App">
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
export default App;
Yuk sudah cukup kita lihat "Intro Zustand" tadi
Mari sekarang kita demo:
Mengkonversi aplikasi yang sebelumnya dibuat dengan Redux Toolkit menjadi versi Zustand !
Langkah-langkah pengerjaannya adalah sebagai berikut: (Simple Counter)
npm install
npm install zustand
Langkahnya sedikit namun kodenya lumayan loh yah !
Untuk melihat kodenya bisa diintip di sini yah
Mari sekarang kita mencoba untuk melakukan fetch data dari reqres.in API yah
Langkah-langkah pengerjaannya adalah sebagai berikut: (Fetch User)
Langkahnya sedikit namun kodenya lumayan loh yah !
Untuk melihat kodenya bisa diintip di sini yah
Sekarang mari kita coba untuk menyelesaikan fetch data colors dari reqres.in API yah
Tapi sekarang kita punya syarat: datanya ingin kita buat "seperti mutable"
Masih ingat dengan RTK yang bisa membuat perubahan statenya "seperti mutable" dengan apa?
Ya, dengan immer !
Langkah-langkah pengerjaannya adalah sebagai berikut: (With Immer)
npm i immer
Langkahnya sedikit namun kodenya lumayan loh yah !
Untuk melihat kodenya bisa diintip di sini yah
Dan selesai sudah untuk demo yang kita lakukan ini.
Dengan demikian kita sudah berhasil membuat aplikasi yang mirip dengan versi RTK dan RTK Query, namun dengan menggunakan Zustand
Bagaimana, apakah dengan menggunakan Zustand lebih baik? ataukan menggunakan RTK + RTK Query lebih enak?
Teman-teman sebagai developer yang pada akhirnya menentukan yah "enakan" yang mana?
Nah dari tadi kita menggunakan Zustand tanpa ada "Loading" nya sama sekali yah ...
Karena memang dalam Zustand, tidak ada "Loading" yang bisa digunakan secara langsung !
Lalu apabila seperti itu kita harus bagaimana bila ingin membuat semacam "Loading" dengan Zustand ini?
Jawabannya adalah: dengan menggunakan sedikit "logic"
Mari kita coba membuatnya untuk fetch data user yah !
Langkah-langkah pengerjaannya adalah sebagai berikut: (Simple Loaders)
Untuk melihat kodenya bisa diintip di sini yah