Membuat Reusable Component dengan Menggunakan TailwindCSS dan Classnames di ReactJS
Pranala
Sering kali, ketika kita mengerjakan sebuah website maka kita akan mendapati banyak sekali komponen komponen yang sering sekali untuk digunakan. Misalnya komponen button
, container
atau card
. Kalau pengalamanku, komponen tersebut tidak memiliki logic yang rumit atau malah tidak ada sama sekali.
Permasalahan
Beberapa hari belakangan ini, aku sendiri merasakan sering membuat komponen komponen yang sama ditambah lagi, kira-kira ada tidak sih cara membaut reusable komponen dengan menggunakan TailwindCSS? Apalagi TailwindCSS memiliki nama-nama class yang cukup memudahkan dalam membuat reusable component seperti component button berikut
<button className='relative bg-blue-500 text-white p-6 rounded text-2xl font-bold overflow-visible'>
Example button
</button>
Kalau kita lihat, komponen ini bisa di ubah untuk menjadi reusable component dengan memanfaatkan nama kelas dari TailwindCSS. Misalnya apabila kita ingin button primary kita menjadi seperti ini
<Button bgBlue="500" text="2xl">
Example button
</Button>
Sehingga kita bisa mengatur button
kita bisa reusable dan warna background serta text size bisa berganti sesuai keinginan kita.
Solusi
Menggunakan classnames npm module
untuk bisa merubah / mengatur supaya pengaturan class component
bisa disesuaikan.
Semula seperti ini
<button className='relative bg-blue-500 text-white p-6 rounded text-2xl font-bold overflow-visible'>
Example button
</button>
Menjadi seperti ini
<Button bgBlue="500" text="2xl">
Example button
</Button>
Lantas, bagaimana caranya?
Pertama, Install terlebih dahulu classname
npm install classnames --save
Kedua, membuat sebuah komponen button
import React from "react";
const Button = () => {
return (
<button
className= "py-3 lg:py-4 px-12 lg:px-16 text-white-500 font-semibold rounded-lg bg-orange-500 hover:shadow-orange-md transition-all outline-none text-base "
>
Button
</button>
);
};
export default Button;
Ketiga, kita akan merubah komponen tersebut menjadi lebih usable, bisa digunakan berulang ulang dengan template yang sama. Ini tergantung kebutuhan desain teman-teman. Misalnya, saya memiliki beberapa button dan yang berubah hanya dari segi warna background
, text
dan font size
.
Maka , saya harus import classnames
, menambahkannya ke classNames
. Lalu, membuat logic untuk font size
.
// Button.js
import React from 'react'
import classnames from 'classnames';
const Button = ({ size, bg, text, addClass, children })=> {
return (
<button className={classnames(`py-3 lg:py-4 px-12 lg:px-16 text-${text} font-semibold rounded-lg bg-${bg} hover:shadow-orange-md transition-all outline-none ${addClass}`, {
"text-sm": size === 'sm',
"text-lg": size === 'lg',
})}>
{children}
</button>
)
};
export default Button;
Penjelasannya :
size
merupakan logic bila nilaisize
sama dengansm
maka nanticlass
yang ditambahkan adalahtext-sm
, saatsize
sama denganlg
maka nanticlass
yang ditambahkan adalahtext-lg
. Namun, saat tidak ada makasize
akannull
dan secara defaultfont size
adalahtext-base
.bg
, dantext
adalahprops
yang nantinya menyesuaikan dengan nilai yang didapat. Karena seperti yang saya jelaskan diawal kalau saya hanya perlu mengganti warna dan text saja, sisanya sama semua dari desain.children
adalah props untuk mengirimkan semua data yang di "apit" oleh komponen.AddClass
kalau saya membutuhkan class tambahan. Misalnyamargin
atau kelas lain.
Nanti, kurang lebih saat kita memanggil button menjadi seperti ini
import React from "react";
import Button from "../misc/Button";
const DetailJob = () => {
return (
<>
<h2 className="text-3xl">Button</h2>
<Button size="sm" bg="blue-100" text="white">Submit</Button>
</>
);
};
export default DetailJob;
Selesai.
Kesimpulan
Kurang lebih seperti itu cara saya membuat reusable component di ReactJS/NextJS dengan TailwindCSS dan bantuan classnames. Kalau teman-teman ada cara lain, bisa sharing atau berbagi di Twitter / hubungi saya via Twitter.