Terakhir diperbarui: 2024-03-20

Pada codelab ini Anda akan mempelajari tentang penggunaan library Redux di ReactJS, apa itu Redux, kegunaannya, dan kapan waktu yang tepat untuk menggunakan Redux tersebut.
Sebelum memulai codelab ini, sebaiknya Anda memiliki pengetahuan dasar tentang:
Anda akan bingung tentang Redux jika membaca dari berbagai sumber di internet. Namun, dalam codelab ini akan disampaikan secara jelas kegunaan Redux dan kapan waktu yang tepat untuk memanfaatkan Redux dalam aplikasi kita.
Pertanyaan terbaik untuk memulai adalah dengan mengetahui alasannya mengapa kita harus menggunakan Redux ? dan jawabannya bukan karena semua orang atau developer menggunakan Redux juga.
Redux adalah alat manajemen state untuk aplikasi JavaScript. Redux menyediakan central store untuk application state dengan memberikan cara yang tepat untuk memperbarui nilai state yang disimpan dan mengambil nilai tersebut. Dengan adanya centralized store, menjadi lebih mudah untuk menulis aplikasi dan mengelola state.
Dalam Next.js terdapat beberapa library yang bisa digunakan untuk menerapkan redux, seperti redux-toolkit yang digunakan untuk mempermudah dan membantu untuk fast development, dan redux-persist yang digunakan untuk menyimpan redux store ke dalam localStorage, sehingga datanya tidak hilang saat browser di close dan ini cocok untuk proses user authorization.
Pada codelab sebelumnya Anda telah mempelajari props dan aliran data searah. Data dikirim ke komponen melalui props. Sebagai contoh, perhatikan komponen berikut:

Variabel count disimpan dalam state aplikasi, kemudian dikirim melalui props untuk melakukan update nilai variabel tersebut.

Agar data dapat mengalir dari bawah ke atas (maksudnya dari variabel props menjadi state aplikasi), maka diperlukan callback function sehingga data dapat di-update atau manipulasi oleh sebuah komponen button seperti pada ilustrasi berikut.

Anda dapat mengimajinasikan data seperti komponen elektronik yang saling terhubung dengan kabel yang memiliki warna-warna berbeda. Data mengalir melalui kabel-kabel tersebut antar komponen yang bisa saling bertukar data antar komponen tersebut.
Cepat atau lambat Anda akan dihadapkan pada situasi di mana saat membuat aplikasi React membutuhkan lapisan data yang sama pada beberapa letak di halaman web. Perhatikan ilustrasi halaman web Twitter berikut yang menampilkan avatar (foto profil) pada 3 posisi berbeda, namun sumber datanya tetap sama.

Kita anggap avatar user merupakan bagian dari data profil user, yang disimpan dalam komponen App sebagai variabel user. Untuk mengirimkan data user ke tiga komponen avatar tersebut, data user perlu melewati beberapa komponen yang sebenarnya komponen-komponen tersebut tidak membutuhkannya. Perhatikan ilustrasi berikut ini.

Dari ilustrasi di atas, kita perhatikan data user melakukan perjalanan yang cukup rumit antar komponen-komponen yang berada dibawahnya. Model perancangan komponen seperti ini tidak baik untuk software design. Untuk melakukan refactoring dan reusing komponen cukup sulit jika berdasarkan ilustrasi tersebut. Karena setiap komponen memiliki state dan props-nya masing-masing.
Nah, itu merupakan salah satu masalah yang diselesaikan oleh Redux. Mari kita lanjutkan materi berikut ini.
Redux menyelesaikan masalah ini. Redux memberikan kemudahan untuk memasang data yang dibutuhkan ke komponen apapun secara langsung (direct access).
Menggunakan fungsi connect yang ada dalam Redux, Anda dapat mengaitkan dengan komponen ke dalam data store milik Redux. Komponen dapat menggunakan data yang diperlukan saja. Perhatikan ilustrasi berikut ini.

Itulah alasan menggunakan Redux.
Selain itu, Redux memiliki manfaat lain yaitu:
state yang terjadi.state sebelumnya) dan dapat dilihat data state sebelumnya seperti apa.Kemudahan memasang data ke berbagai komponen merupakan fungsi utama Redux, jika Anda tidak membutuhkan fitur tersebut, maka kemungkinan besar Anda tidak perlu untuk menggunakan Redux.
Beberapa kondisi yang perlu dipertimbangkan ketika akan menggunakan Redux adalah sebagai berikut.
props akan diteruskan ke berbagai komponen berbeda.state aplikasi, maka saat itu bisa menambahkan library Redux.Untuk memahami tentang konsep Redux, perhatikan diagram berikut:

Keterangan diagram:
reducer untuk memodifikasi data. Syaratnya, action harus memiliki properti type berupa String.state.reducer dan state aplikasi.Terdapat beberapa library atau toolkit yang disediakan untuk mengimplementasikan redux pada next.js diantaranya
redux-toolkit adalah sebuah toolkit resmi yang disediakan oleh tim pengembang Redux untuk memudahkan penggunaan Redux dalam pengembangan aplikasi JavaScript. Ini dirancang untuk mempercepat proses pengembangan aplikasi dengan Redux, menyediakan serangkaian utilitas dan fungsi yang memudahkan pengelolaan state, penanganan aksi, dan pembuatan reducer.
Beberapa fitur utama dari redux-toolkit meliputi:
Dengan menggunakan redux-toolkit, pengguna dapat mengurangi kompleksitas dan boilerplate code yang terkait dengan penggunaan Redux secara langsung. Ini membantu meningkatkan produktivitas pengembangan dan mempercepat proses pengembangan aplikasi JavaScript yang menggunakan Redux untuk manajemen state.
redux-persist adalah sebuah library yang memungkinkan penggunaan Redux dalam aplikasi JavaScript untuk menyimpan dan memulihkan state Redux ke dan dari penyimpanan persisten, seperti local storage atau AsyncStorage di lingkungan React Native.
Dengan redux-persist, pengguna dapat membuat konfigurasi sederhana untuk menyimpan state Redux secara otomatis setiap kali ada perubahan, dan memulihkannya saat aplikasi dimuat kembali. Ini membantu menjaga persistensi data antara sesi aplikasi, sehingga pengguna dapat melanjutkan penggunaan aplikasi dari titik terakhirnya bahkan setelah aplikasi ditutup dan dibuka kembali.
redux-persist memiliki fitur-fitur yang memungkinkan pengguna untuk mengatur penyimpanan persisten, menyesuaikan perilaku penyimpanan, serta menambahkan transformasi data untuk menyesuaikan format penyimpanan. Ini sangat berguna untuk aplikasi yang memerlukan pengelolaan state yang persisten dan dapat diakses secara konsisten oleh pengguna.
next-redux-wrapper adalah sebuah library atau perpustakaan untuk integrasi Redux dengan aplikasi Next.js. Library ini menyediakan alat dan utilitas yang memudahkan penggunaan Redux dalam aplikasi Next.js, termasuk pengaturan awal untuk menyediakan toko Redux ke dalam aplikasi, pengelolaan state global, dan koneksi dengan komponen React di dalam aplikasi Next.js.
Dengan next-redux-wrapper, pengguna dapat mengintegrasikan Redux ke dalam aplikasi Next.js dengan lebih mudah, memungkinkan pengelolaan state aplikasi secara efisien dan konsisten di seluruh komponen. Ini membantu meningkatkan pengembangan aplikasi dengan memisahkan logika bisnis dari tampilan, dan menyediakan alur kerja yang jelas untuk mengelola state global.

Kita buka open folder untuk project pertemuan-06 di VS Code, maka isi direktori yang ada di dalamnya sedikit berbeda dengan project yang sudah pernah kita buat sebelumnya. Yaitu terdapat folder pages dan styles.

Kali ini kita coba pakai CSS Library Bootstrap dengan menjalankan perintah
npm install bootstrap
Kemudian kita import bootstrap pada aplikasi next.js kita. Kita edit file pages/_app.tsx

Sekarang kita perlu mencoba implementasi bootstrap pada project next.js kita.
Contoh kita edit file pages/index.tsx menjadi seperti ini
export default function Home() {
return (
<div className="container">
<div className="row">
<div className="col-12">
<button type="button"
className="btn btn-primary"
data-bs-toggle="modal"
data-bs-target="#exampleModal">
Coba Model Bootstrap
</button>
</div>
</div>
<div className="modal fade"
id="exampleModal"
tabIndex="-1"
aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<h5 className="modal-title text-black" id="exampleModalLabel"> yay... </h5>
<button
type="button"
className="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div className="modal-body text-black">
<h2>Halo semua, kita sedang menggunakan bootstrap di Next.js</h2>
</div>
</div>
</div>
</div>
</div>
);
}
Komponen yang digunakan pada praktikum kali ini adalah redux-toolkit dan redux-persistent sehingga kita perlu menginstall-nya
npm i --save redux-persist react-redux @reduxjs/toolkit
Selanjutnya kita install wrapper untuk redux di next.js
npm i --save next-redux-wrapper
Selain itu, kita akan menggunakan html parser yang ada di react. Hal ini kita gunakan untuk memparsing html string menjadi sebuah html page
npm install html-react-parser
Setelah berhasil menginstal kita cek di file package.json apakah library sudah ada

Selanjutnya, kita buat folder dengan nama redux yang sejajar dengan folder public

Kemudian kita buat file redux/auth/authSlice.js seperti berikut

Selanjutnya kita buat file redux/store/store.js seperti berikut
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import authReducer from '../auth/authSlice';
import storage from 'redux-persist/lib/storage';
import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist';
const persistConfig = {
key: process.env.NEXT_PUBLIC_FINGERPRINT_NAME, // simpan config di file .env.local
storage,
whitelist: ['auth'],
};
const rootReducer = combineReducers({
auth: authReducer,
});
const persistedReducer = persistReducer(persistConfig, rootReducer);
const store = configureStore({
reducer: persistedReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: {
ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
},
}),
});
const persistor = persistStore(store);
export { store, persistor };
Key pada persistConfig kita simpan pada file .env.local dengan tujuan agar konfigurasi lebih mudah dan aman. Sehingga jika belum ada file .env.local, kita buat dahulu

Selanjutnya, kita buat file baru di pages/login.tsx, dan kita tulis kode berikut


Jalankan project kita di browser, dan amati apa yang terjadi?
Pada praktikum ini, kita akan membuat program counter sederhana seperti pada gambar berikut ini.

Tampilan mungkin tidak semenarik pada gambar di atas, karena saat ini kita tidak fokus pada CSS-nya. Untuk membuat aplikasi tersebut, silakan lakukan langkah-langkah praktikum berikut.
Kita buat file di redux/counter/naikTurunSlice.js

Setelah itu kita modifikasi redux/store/store.js untuk menambahkan Redux reducer pada store

Selanjutnya kita buat halaman untuk menampilkan counter.
Kita buat file baru di pages/counter.tsx


Kemudian kita jalankan di browser dengan url localhost:3000/counter, dan amati apa yang terjadi?
Berdasarkan pada praktikum sebelumnya yang telah dilakukan, beberapa pertanyaan terkait praktikum perlu diselesaikan yaitu sebagai berikut.
import { useEffect } from "react"; Pada file pages/_app.tsx? jelaskanpages/_app.tsx kita tidak menggunakan useEffect (menghapus baris 3, dan baris 9-11, apa yang akan terjadi?class, harus diganti menjadi className ?store.js!pages/login.tsx, apa maksud dari kode ini ?const { isLogin } = useSelector((state) => state.auth);const {totalCounter} = useSelector((state) => state.counter);Selamat, Anda telah berhasil menyelesaikan codelab ini. Semoga mendapatkan ilmu yang bermanfaat.
Silakan cek beberapa sumber belajar lainnya...