Tailwind Class'ları Değişkenlerle Kullanıldığı Zaman Çalışmıyorlar

Merhabalar.
React ve Tailwind kullanarak Türkçe’deki fiil çekimleriyle alakalı bir minigame yaptım. Amacı kullanıcının Türkçe’deki fiil çekimleriyle daha tanışık hale gelmesini sağlamak, fiilleri çekimleme ile ilgili yardımcı olmak. Buradan deneyimleyebilirsiniz ve elbette burada da GitHub reposu var.
Karşılaştığım problemi şöyle anlatayım… Öncelikle <Button> adında bir componentimiz var.

Bu component'te dikkatinizi çekmek istediğim nokta colorVariant'ı bir prop olarak alıyor olmam ve daha sonra bu değeri classList array'inde tailwind class'ları oluşturmak için kullanıyor olmam.

Ve App.js'te bu <Button> component'ini bu şekilde kullanıyorum. colorVariant olarak "green" değerini veriyorum. Aynı component'i hemen yukarıda bir kez daha kullanıyorum, ona da "yellow" vermişim.


Şimdi problem şöyle…
Beklediğim şey colorVariant'a verdiğim değere göre butonların renklerinin değişmesi. Mesela bir <Button>'un colorVariant prop'una "green" değerini geçtiğimde classList'in şöyle görünüyor olması lazım:

const classList = [
    props.className,
    `bg-green-500`,
    `hover:bg-green-400`,
    "text-white",
    "font-bold",
    "py-2",
    "px-4",
    "border-b-4",
    `border-green-700`,
    `hover:border-green-500`,
    "rounded",
  ];

Tabii daha sonra bu classList'in içerisindeki tailwind class'larını component'in return edeceği elemente props olarak geçiyorum:

classList içerisindeki bu Tailwind class'larının valid class'lar olduğunu da göz önünde bulundurduğumuz zaman yeşil bir buton elde etmemiz gerekiyor. Beklediğim şey bu. Aynı şekilde "yellow" değerini verdiğim butonun da sarı bir buton olmasını bekliyorum. Fakat sonuç beklediğim gibi olmuyor:


Bunun sebebini merak ediyorum ve en ilginç kısma daha gelmedim. Anlatıyorum: Eğer Tailwind class'larını bir değişken aracılığıyla formatlamadan, direkt olarak, önce green sonra yellow olarak yazdıktan sonra tekrar bir değişken ile formatlayarak yazdığım zaman renkler düzeliyor. Bu cümle biraz karmaşık oldu fakat bunu bir GIF ile anlatabilirim:
gif


Dolayısıyla beklediğim buradaki gibi butonlar iken:


Buradaki gibi butonlarla karşılaşıyorum:


Çözmek için bir süre bir şeyler kurcaladım (aslında çok da bir şey kurcalayamadım) fakat bir faydası olmadı. Daha sonra StackOverflow’da benzer bir konu gördüm. 1k görüntülenmesi var ama kimse cevap yazmamış.


Durum bu şekilde. Sizce bu sorun neyden kaynaklanıyor?

5 Beğeni

Öncelikle Merhaba
Attığınız GIF’te bg-${colorVariant}-500 yerine bg-green-500 ve ya bg-yellow-500 kullanmalısınız. Çünkü Tailwind dinamik olarak oluşturulmuş sınıf adlarını algılamaz.
Tailwind Dinamik Sınıflar
Tailwind Sınıf Tespiti

1 Beğeni


Attığım son committe de bahsettiğim gibi bu sorun çözüldü. Nasıl çözdüğüme /src/components/Button.jsx’ten bakabilirsiniz. Çözmekte çok bir şey yok zaten, olay sadece string formatlamadan Tailwind class’ları kullanmak: Asıl mesele bu problemin kaynağıydı. Pekala sorun çözülmüş oldu ancak bunun karşılığı olarak kod da bir tık kirlileşti.
Sorunun çözülmesine rağmen merak kapımın açık kalacağından korkuyordum fakat öğrendim ki Tailwind’in signature’u (signature denir herhalde xd) zaten böyleymiş. Ben Bootstrap’e alışık olduğum için kafamda string formatlayarak Tailwind class’ları kullanabileceğimi varsaymıştım ve bu durumu beklenmedik türden nitelendirmiştim.