SolidStart adalah meta-framework untuk Solid: Solid ditambah server, pemuatan data, dan routing berbasis file (file-based routing). Routing berbasis file artinya tiap file di folder src/routes otomatis jadi satu alamat di situsmu, tanpa didaftarkan satu per satu. Bayangin daftar isi buku: tiap baris menunjuk ke satu halaman. Di SolidStart, daftar isinya adalah folder src/routes. Tambah file about.tsx, dan situs Toko Buku Kak Nadia langsung punya halaman /about.
🧪 Tebakan cepat: halaman detail buku menulis
const id = Number(params.id)di badan komponennya. Kamu membuka/buku/1(Laskar Pelangi), lalu mengklik tautan ke/buku/2. Judulnya berganti jadi Bumi Manusia, atau tetap Laskar Pelangi? Jawabannya ada di bagian "params dibaca di tempat dipakai".
File di src/routes jadi alamat
Situs Toko Buku Kak Nadia sebagai proyek SolidStart:
src/
├── app.tsx
└── routes/
├── index.tsx → /
├── about.tsx → /about
├── buku.tsx → layout untuk semua /buku/...
├── buku/
│ └── [id].tsx → /buku/1, /buku/2, /buku/3, ...
└── [...404].tsx → alamat lain yang gak cocok
- Nama file jadi bagian alamat:
about.tsxmelayani/about. Folder menambah satu bagian:buku/[id].tsxmelayani/buku/.... index.tsxmelayani alamat foldernya sendiri:routes/index.tsxadalah halaman utama/.- Tiap file halaman meng-
export defaultsatu komponen. Komponen itulah yang digambar saat alamatnya dibuka.
app.tsx: Router dan FileRoutes
src/app.tsx memasang router-nya. Bentuknya mengikuti template SolidStart:
// src/app.tsx
import { Router } from "@solidjs/router"
import { FileRoutes } from "@solidjs/start/router"
import { Suspense } from "solid-js"
import Nav from "./components/Nav"
export default function App() {
return (
<Router
root={(props) => (
<>
<Nav />
<Suspense>{props.children}</Suspense>
</>
)}
>
<FileRoutes />
</Router>
)
}
<FileRoutes />membaca isisrc/routesdan mengubahnya jadi daftar route. Kamu gak menulis<Route path=...>sendiri.rootadalah bingkai untuk semua halaman.props.childrenberisi halaman yang cocok dengan alamatnya, jadiNavtampil di atas setiap halaman.<Suspense>menampung halaman yang datanya masih dimuat. Pemuatan data dibahas di pelajaran berikutnya.
Nav: tautan dengan A
import { A } from "@solidjs/router"
function Nav() {
return (
<nav>
<A href="/">Home</A>
<A href="/about">About</A>
</nav>
)
}
Adiimpor dari"@solidjs/router". Dia menggambar<a>biasa denganhrefyang sama, jadi<A href="/">Home</A>jadi<a href="/">Home</a>plus beberapa atribut.- Ini latihannya: satu
<nav>, tautan pertama ke/berlabelHome, tautan kedua ke/aboutberlabelAbout, dengan urutan dan alamat persis seperti itu. - Klik tautannya ditangkap router: halamannya ditukar di browser tanpa memuat ulang seluruh halaman, dan
Navgak dibuat ulang. Amenambahkan classactiveke tautan yang cocok dengan alamat sekarang (yang lain dapatinactive), danaria-current="page"ke tautan yang alamatnya persis sama. Itu yang membuat menu bisa menebalkan halaman yang sedang dibuka.
Route dinamis: [id].tsx dan useParams
Satu file melayani semua buku. Bagian alamat yang ditulis dalam kurung siku di nama file jadi parameter:
// src/routes/buku/[id].tsx
import { useParams } from "@solidjs/router"
import { Show } from "solid-js"
const katalog = [
{ id: 1, judul: "Laskar Pelangi", harga: 89000, stok: 4 },
{ id: 2, judul: "Bumi Manusia", harga: 120000, stok: 2 },
{ id: 3, judul: "Cantik Itu Luka", harga: 95000, stok: 0 },
]
export default function DetailBuku() {
const params = useParams()
const buku = () => katalog.find((b) => b.id === Number(params.id))
return (
<Show when={buku()} fallback={<p>Buku gak ketemu</p>}>
<h2>{buku().judul}</h2>
<p>Rp{buku().harga} · stok {buku().stok}</p>
</Show>
)
}
| Alamat | params.id |
Halaman |
|---|---|---|
/buku/1 |
"1" |
Laskar Pelangi, Rp89000 · stok 4 |
/buku/2 |
"2" |
Bumi Manusia, Rp120000 · stok 2 |
/buku/99 |
"99" |
Buku gak ketemu |
[id].tsxcocok dengan bagian alamat apa pun, dan nilainya dibaca lewatuseParams()dengan nama di dalam kurung siku:params.id.- Nilainya selalu string.
Number(params.id)mengubahnya supaya bisa dibandingkan denganidangka di katalog.
params dibaca di tempat dipakai
params reaktif seperti store: dia berubah saat alamatnya berubah. Pindah dari /buku/1 ke /buku/2 memakai route yang sama, jadi komponennya gak jalan lagi. Diuji dengan @solidjs/router 1.0:
| Ditulis | Sesudah klik dari /buku/1 ke /buku/2 |
|---|---|
const id = Number(params.id) di badan komponen |
tetap Laskar Pelangi |
const buku = () => katalog.find((b) => b.id === Number(params.id)) |
Bumi Manusia |
Judulnya tetap Laskar Pelangi. Itu jawaban tebakannya. Badan komponen jalan sekali, jadi id cuma menyimpan 1. Bacaan params.id di dalam fungsi yang dipanggil JSX dibaca ulang tiap alamatnya berubah.
Layout: file bernama sama dengan foldernya
// src/routes/buku.tsx
import { A } from "@solidjs/router"
export default function RakBuku(props) {
return (
<section class="rak">
<A href="/">Kembali ke rak</A>
{props.children}
</section>
)
}
buku.tsxdi samping folderbuku/membungkus semua halaman di dalam folder itu.props.childrenadalah halamanbuku/[id].tsxyang cocok.- Pindah antarbuku,
RakBukutetap terpasang. Cuma isinya yang berganti.
Catch-all: [...404].tsx
Titik tiga di dalam kurung siku menangkap sisa alamat berapa pun panjangnya. [...404].tsx di src/routes melayani alamat yang gak cocok dengan file lain, misalnya /promo, dan dipakai sebagai halaman 404. Tanpa file itu, /promo cuma menampilkan Nav dengan isi kosong di bawahnya.
⚠️ Jebakan yang sering ketemu
<A href="/">aktif di semua halaman. Classactivedipasang kalau alamat sekarang diawali alamat tautannya, dan semua alamat diawali/. Diuji: di/about, Home dan About sama-samaactive. Tulis<A href="/" end>Home</A>supaya Home cuma aktif di/.- Parameter dibaca sekali.
const id = params.iddi badan komponen gak ikut berubah saat pindah ke buku lain. Baca di dalam fungsi atau langsung di JSX. - Layout tanpa
{props.children}. Halaman di dalam foldernya gak punya tempat, jadi gak pernah tampil. - Tautan di luar
<nav>atau urutannya terbalik. Latihannya mencarinav a[href="/"]sebagai tautan pertama dan/aboutsebagai tautan kedua, dengan teksHomedanAbout.
TL;DR: SolidStart memakai routing berbasis file: tiap file di src/routes jadi satu alamat (index.tsx jadi /, about.tsx jadi /about). Nama file dengan kurung siku, buku/[id].tsx, jadi route dinamis yang nilainya dibaca lewat useParams() sebagai string, dan harus dibaca di tempat dipakai, bukan disimpan sekali. File bernama sama dengan foldernya jadi layout dengan {props.children}, dan [...404].tsx menangkap alamat yang gak cocok. app.tsx memasang <Router root={...}><FileRoutes /></Router>. Tautan ditulis <A href="/about">About</A> dari "@solidjs/router": navigasi tanpa memuat ulang halaman, plus class active. Tambahkan end di tautan /.