Mengotomatiskan Gaya dengan data-slot

suhu di las vegas

best deposit bonus casino uk

real money online casino games

decentralized casino

Contoh Praktis: Komponen Tombol dengan data-slot

Misalkan kita memiliki komponen tombol yang hanya merender anak-anaknya. Kita menetapkan tinggi tetap 40 piksel pada tombol dan padding 12 piksel di kiri dan kanan.

export function Button({ children }) { return ( <button className='flex items-center justify-center gap-3 rounded bg-purple-500 text-white text-semibold px-3 h-[40px]'> {children} </button> ); }

Sekarang, berdasarkan komponen Button ini, kita dapat membuat tombol dengan teks dan ikon dengan meneruskannya sebagai anak:

export function App() { return ( <Button> Performance monitoring <Icon /> </Button> ); }

Namun, bagaimana jika kita ingin tombol hanya dengan ikon tanpa teks? Menghapus teks saja sudah cukup, tetapi dimensi tombol menjadi tidak konsisten. Lebar dan tingginya bervariasi karena padding, dan idealnya kita ingin tombol menjadi persegi ketika hanya ada ikon. Untuk memperbaikinya, kita dapat menggunakan kelas aspect-square, tetapi bagaimana komponen Button tahu kapan harus menerapkannya?

Pendekatan Lama: Menggunakan Prop

Sebelum menemukan data-slot, kami menangani skenario ini dengan menambahkan prop icon eksplisit ke komponen Button:

export function App() { return ( <Button icon> <Icon /> </Button> ); }

Ini berhasil, tetapi membosankan. Setiap kali kami menggunakan tombol ikon saja, kami harus ingat untuk melewatkan prop icon, hal yang mudah dilupakan dan menyebabkan inkonsistensi. Idealnya, tombol harus menyesuaikan secara otomatis berdasarkan anak-anaknya.

Solusi data-slot

Alih-alih menambahkan prop, kita dapat menandai komponen Icon dengan data-slot="icon":

export function Icon() { return ( <span data-slot="icon" /> ); }

Kemudian, kita modifikasi komponen Button untuk mendeteksi ketika hanya berisi ikon:

export function Button({ children }) { return ( <button className='flex items-center justify-center gap-3 rounded bg-purple-500 text-white text-semibold px-3 h-[40px] [&:has(>[data-slot=icon]:only-child)]:aspect-square'> {children} </button> ); }

Sekarang, kelas aspect-square secara otomatis diterapkan ketika tombol hanya berisi komponen Icon!

Menguraikan Pemilih Kelas

Mari kita analisis kelas yang baru ditambahkan ini: [&:has(>[data-slot=icon]:only-child)]:aspect-square. Artinya:

  • &: Memilih elemen saat ini (tombol).
  • :has(): Pemilih semu yang memeriksa apakah induk memiliki anak tertentu.
  • >[data-slot=icon]:only-child: Memilih anak langsung dengan atribut data-slot="icon" yang tidak memiliki saudara.

Memperluas Solusi: Menangani Padding

Kita dapat melangkah lebih jauh dan menghapus padding ketika tombol hanya memiliki ikon:

export function Button({ children }) { return ( <button className='flex items-center justify-center gap-3 rounded bg-purple-500 text-white text-semibold h-[40px] [&:has(>[data-slot=icon]:only-child)]:aspect-square [&:not(:has(>[data-slot=icon]:only-child))]:px-3'> {children} </button> ); }

Ini berarti:

  • Jika tombol hanya memiliki ikon, ia menjadi persegi dan kehilangan padding.
  • Jika tombol memiliki anak lain, ia mempertahankan px-3 (padding kiri dan kanan).

Mengapa Pendekatan Ini Hebat?

Pendekatan ini menghilangkan kebutuhan akan prop tambahan, memungkinkan tombol beradaptasi secara otomatis dan mengurangi API yang tidak perlu. JSX tetap lebih bersih karena tidak perlu secara manual menentukan jenis atau gaya tombol. Dengan CSS yang menangani logika, komponen menjadi lebih deklaratif dan mudah dirawat.

Potensi Kelemahan: Kompleksitas Kelas

Meskipun pendekatan ini kuat, ia dapat menghasilkan nama kelas yang panjang dan sulit dibaca. Untuk meningkatkan keterbacaan, kami menggunakan pustaka clsx untuk memisahkan aturan ke baris terpisah:

clsx( 'flex items-center justify-center gap-3 h-[40px]', 'rounded bg-purple-500 text-white text-semibold', '[&:not(:has(>[data-slot=icon]:only-child))]:px-3', '[&:has(>[data-slot=icon]:only-child)]:aspect-square', )

Ini membuat gaya lebih terkelola sambil menjaga logika tetap utuh. Meskipun, kami akui, hal ini masih bisa menjadi tidak terkendali.

Pemikiran Akhir

Kami telah menggunakan atribut data-slot di beberapa komponen untuk menyesuaikan jarak, tata letak, dan perilaku secara dinamis berdasarkan anak-anaknya. Pemilih :has() telah menjadi pengubah permainan. Tanpanya, fleksibilitas pada tingkat ini tidak akan mungkin terjadi. Ini adalah kasus penggunaan yang relatif sederhana, tetapi banyak pengembang telah membahasnya lebih dalam dalam presentasi mereka. Jika Anda tertarik untuk mempelajari lebih lanjut, sangat disarankan untuk menonton presentasi tersebut. Semoga ini menginspirasi Anda seperti halnya bagi kami!

demo slot the hand of midas

▲ Kembali ke atas

Platform Lainnya

qq526 bet

birds on a wire slot

casino thailand

HERO138

Berita Piala Dunia

kenapa indonesia disebut wakanda

coze bet

slot pulsa tanpa potongan gacor

nasgor bet

Jika Anda memiliki pertanyaan, silakan kirim email ke [email protected]

▲ Kembali ke atas