Dalam web jika ingin berganti halaman satu dan halaman yang lainnya diperlukan suatu proses routing. Routing sendiri adalah proses pemetaan antara sebuah URL ke dalam sebuah halaman yang terdapat konten / UI (User Interface) sesuai dengan URL yang dituju.
Jika ingin membuat routing membutuhkan library tambahan karena tidak secara langsung tersedia. Ternyata ada beberapa library yang bisa digunakan, diantara library yang sangat familiar adalah react-router
dan reach/router
. Sebenernya yang dipakai untuk routing di React biasanya react-router-dom
anak dari react-router
, yang mana selain react-router-dom
juga terdapat react-router-native
yang bisa digunakan untuk development aplikasi Android dan iOS.
Library react-router-dom
dapat diinstall dengan menjalankan perintah
yarn add react-router-dom
atau
npm i react-router-dom
Mari kita Keceh
Pada contoh kali ini, kita akan belajar membuat routing sederhana menggunakan react-router-dom
. Halaman-halaman yang akan dibuat diantaranya Home, Profil, Detail Profil, Notfound.
Setelah membuat project baru react, buat file-file berikut untuk membuat halaman yang akan digunakan sebagai component dalam routes.
File yang akan kita jadikan sebagai routes
yaitu App.js
, karena component App
yang dijadikan entry point dan dirender pertama kali oleh ReactDOM
di index.js
.
Setelah itu buat routes untuk masing-masing halaman di component App
import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import Notfound from "./pages/NotFound";
import Home from "./pages/Home";
import Profil from "./pages/Profil";
import ProfilDetail from "./pages/ProfilDetail";
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/profil" exact component={Profil} />
<Route path="/profil/:name" exact component={ProfilDetail} />
<Route component={Notfound} />
</Switch>
</BrowserRouter>
);
}
export default App;
Disana kita mengimport BrowserRouter
, Route
, dan Switch
yang akan kita gunakan dari react-router-dom
, kemudian kita import component yang akan dijadikan halaman.
Karena component App
dijadikan router, maka component ini akan merender halaman yang path di browser sama dengan path yang ada di route. Jika tidak ada path yang sesuai, maka component yang akan dirender yaitu component Notfound
.
BrowserRouter
digunakan sebagai router yang menggunakanAPI history
dari HTML5, sehingga dapat menggunakanlocation
untuk mensingkronasi UI dengan url. Di dalam objectlocation
sendiri merepresentasikan dimana lokasi aplikasi sekarang.Switch
digunakan untuk membungkus nodeRoute
, yang mana hanya akan merender satuRoute
saatpath
nya cocok dengan URL.- Route digunakan untuk merender
UI
saat path cocok dengan URL saat ini. Di dalam Component Route ini kita menggunakanexact
, yang mana bertugas untuk memastikan Route hanya merender component yang memilikipath
danlocation.pathname
yang cocok. Jika tidak ada yang cocok, makaRoute
yang akan dirender yaituRoute
terakhir dengan componentNotfound
.
Setelah itu kita menuju ke halaman utama, yaitu halaman Home
. Di halaman Home ini, hanya ada tulisan informasi bahwa sekarang aplikasi berada di halaman Home. Lalu ada sebuah link untuk menuju ke halaman Profil
.
import React from "react";
import { Link } from "react-router-dom";
function Home(props) {
return (
<>
<h2>Home page</h2>
<Link to="/profil">Menuju profil</Link>
</>
);
}
export default Home;
-
Element kosong
<></>
tersebut adalah shorthand dari<React.Fragment></React.Fragment>
yang mana bisa untuk membungkus child element tanpa menambahkan node ke dalam DOM. -
<Link></Link>
digunakan untuk berpindah antar halaman, propertyto
tersebut merujuk pada path diRoute
yang akan dituju.
hasil tampilannya akan seperti ini.
Pada halaman profil, kita membuat list nama dengan Link
yang nantinya akan menuju ke halaman detail profil beserta dengan state
yang dibawanya melalui location.
import React from "react";
import { Link } from "react-router-dom";
function Profil() {
return (
<>
Profil Page
<ul>
<li>
<Link
to={{
pathname: "/profil/pevita",
state: {
name: "Pevita Cleo Eileen Pearce",
born: "1992-10-06",
},
}}
>
Pevita
</Link>
</li>
<li>
<Link
to={{
pathname: "/profil/raline",
state: {
name: "Raline Rahmat Shah",
born: "1985-03-04",
},
}}
>
Raline
</Link>
</li>
<li>
<Link
to={{
pathname: "/profil/maudy",
state: {
name: "Ayunda Faza Maudya",
born: "1994-12-19",
},
}}
>
Maudy
</Link>
</li>
</ul>
<hr />
<Link to="/">Home</Link>
</>
);
}
export default Profil;
Di dalam list Link
kita menyematkan property to
dalam bentuk object location yang akan dituju. Pada saat halaman yang tertuju sesuai pathname, router akan membawa state sesuai yang diberikan halaman sebelumnya. Juga karena halaman detail profil menggunakan parameter dinamis, maka parameter bisa didapet dari props.match.params
.
Halaman detail profil akan dinamis menggunakan data yang diberikan di halaman profil. Data tersebut bisa didapat dari props
karena halaman Profil
dan ProfilDetail
sama-sama dideklarasikan sebagai Route
di Router (component App
).
import React from "react";
function ProfilDetail(props) {
const name = props.match.params.name;
const fullName = props.location.state.name;
const bornDate = props.location.state.born;
return (
<>
<h2>Hi, {name.charAt(0).toUpperCase() + name.slice(1)}</h2>
<p>
{fullName} was born on{" "}
{new Date(bornDate).toLocaleDateString("en", {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
})}
</p>
<button onClick={() => props.history.goBack()}>back</button>
</>
);
}
export default ProfilDetail;
Sehingga pada salah satu list yang dituju akan terlihat seperti ini
Untuk halaman Notfound
jika path di component Route
tidak ada yang cocok akan memberikan informasi bahwa halaman yang dituju tidak sesuai.
import React from "react";
function NotFound() {
return <>Page not found</>;
}
export default NotFound;
Hasil akhir belajar kali ini bisa dilihat di bawah ini.