JSX ile İşaretleme (Markup) Yazma
JSX, bir JavaScript dosyası içinde HTML benzeri biçimlendirme (markup) yazmanıza olanak tanıyan bir JavaScript söz dizimi uzantısıdır. Bileşen yazmanın başka yolları olsa da çoğu React geliştiricisi, JSX’in sağladığı kolaylığı tercih eder ve çoğu kod tabanı (codebase) bunu kullanır.
Bunları öğreneceksiniz
- React neden biçimlendirmeyi, render ile birleştirir?
- JSX’in HTML’den farkı nedir?
- JSX ile veri nasıl gösterilir?
JSX: Biçimlendirmeyi JavaScript’e dönüştürme
Web; HTML, CSS ve JavaScript üzerine inşa edilmiştir. Uzun yıllar boyunca web geliştiricileri, içeriği HTML’de, tasarımı CSS’te ve mantığı JavaScript’te -genellikle ayrı dosyalarda- tuttular! İçerik, HTML içinde tanımlanırken sayfanın mantığı, JavaScript’te ayrı olarak saklanıyordu:
Ancak Web daha etkileşimli hale geldikçe mantık, içeriğin önüne geçti. HTML’den JavaScript sorumluydu! İşte bu nedenle React’te render mantığı ve biçimlendirme aynı yerde (bileşenlerde) birlikte bulunur.
Bir butonun render mantığını ve biçimlendirmesini bir arada tutmak, her değişiklikte birbirleriyle senkronize kalmalarını sağlar. Aksine, butonun biçimlendirmesi ve kenar çubuğunun biçimlendirmesi gibi birbiriyle ilgisi olmayan ayrıntılar, birbirinden izole edilir. Böylece herhangi birinin tek başına değiştirilmesi daha güvenli hale gelir.
Her React bileşeni; React’ın, tarayıcıda render ettiği bazı işaretlemeler içerebilen bir JavaScript fonksiyonudur. React bileşenleri, bu işaretlemeyi temsil etmek için JSX adı verilen bir söz dizimi uzantısı kullanır. JSX, HTML’e çok benzer ancak biraz daha katı kurallara sahiptir ve dinamik verileri gösterebilir. Bu konuyu anlamanın en etkili yolu, birkaç HTML’i JSX’e dönüştürerek uygulamalı olarak pratik yapmaktır.
HTML’i JSX’e Dönüştürme
Elinizde (tamamen geçerli) bir HTML olduğunu varsayalım:
<h1>Hedy Lamarr's Todos</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
>
<ul>
<li>Invent new traffic lights
<li>Rehearse a movie scene
<li>Improve the spectrum technology
</ul>
Ve bunu bileşeninize koymak istiyorsunuz:
export default function TodoList() {
return (
// ???
)
}
Olduğu gibi kopyalayıp yapıştırırsanız çalışmayacaktır:
export default function TodoList() { return ( // This doesn't quite work! <h1>Hedy Lamarr's Todos</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" class="photo" > <ul> <li>Invent new traffic lights <li>Rehearse a movie scene <li>Improve the spectrum technology </ul>
Bunun nedeni JSX’in HTML’den daha katı ve fazla kurala sahip olmasıdır! Yukarıdaki hata mesajları, biçimlendirmeyi düzeltmeniz için size yol gösterecektir. Hatayı çözmek için aşağıdaki kılavuzu da takip edebilirsiniz.
JSX Kuralları
1. Tek bir kök eleman döndürür
Bileşenden birden fazla öğe döndürmek için bunları, tek bir ana etiketle sarın
Örneğin, <div>
kullanabilirsiniz:
<div>
<h1>Hedy Lamarr's Todos</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
>
<ul>
...
</ul>
</div>
Eğer fazladan bir <div>
eklemek istemezseniz <>
and </>
kullanabilirsiniz:
<>
<h1>Hedy Lamarr's Todos</h1>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
>
<ul>
...
</ul>
</>
Bu boş etiket, Fragment olarak adlandırılır. Fragment’lar, tarayıcı HTML ağacında, herhangi bir iz bırakmadan, öğeleri gruplandırmanıza olanak tanır.
Derinlemesine İnceleme
JSX, HTML gibi görünür ancak arka planda JavaScript nesnelerine dönüştürülür. Bir fonksiyondan iki nesneyi, bir diziye sarmadan döndüremezsiniz. Bu, iki JSX etiketini başka bir etikete veya bir Fragment’e sarmadan neden döndüremediğinizi de açıklar.
2. Tüm etiketleri kapatın
JSX, etiketlerin bariz bir şekilde kapatılmasını gerektirir: <img>
gibi kendiliğinden kapanan etiketler, <img />
bu şekilde kapatılmalıdır.<li>oranges
gibi etiketler<li>oranges</li>
şeklinde sarmalanmalıdır.
Hedy Lamarr’ın fotoğraf ve liste öğeleri bu şekilde kapatılmıştır:
<>
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
class="photo"
/>
<ul>
<li>Invent new traffic lights</li>
<li>Rehearse a movie scene</li>
<li>Improve the spectrum technology</li>
</ul>
</>
3. camelCase her şey çoğu şey!
JSX, JavaScript’e dönüşür ve JSX’te yazılan özellikler JavaScript nesnelerinin anahtarları haline gelir. Kendi bileşenlerinizde, genellikle bu özellikleri, değişken olarak okumak isteyeceksiniz. Ancak JavaScript’in değişken adları konusunda sınırlamaları vardır. Örneğin, adları tire içeremez veya class
gibi rezerve edilmiş sözcükler olamaz.
Bu nedenle, React’te, birçok HTML ve SVG özellikleri camelCase ile yazılır. Örneğin, stroke-width
yerine strokeWidth
. class
rezerve edilmiş sözcük olduğu için React’te, bunun yerine ilgili DOM özelliğinden sonra className
yazarsınız:
<img
src="https://i.imgur.com/yXOvdOSs.jpg"
alt="Hedy Lamarr"
className="photo"
/>
Tüm bu nitelikleri DOM bileşeni prop’ları listesinde bulabilirsiniz. Eğer yanlış yaparsanız endişelenmeyin-React tarayıcı konsoluna, yanlışınızı düzeltmeniz için bir mesaj yazdıracaktır.
Uzman Tavsiyesi: JSX Dönüştürücü Kullanın
Mevcut biçimlendirmede, tüm bu özellikleri dönüştürmek can sıkıcı olabilir! Mevcut HTML ve SVG’nizi JSX’e çevirmek için bir dönüştürücü kullanmanızı öneririz. Dönüştürücüler pratikte çok kullanışlıdır. Yine de kendi başınıza rahatça JSX yazabilmeniz için neler olup bittiğini anlamakta fayda vardır.
İşte final sonucunuz:
export default function TodoList() { return ( <> <h1>Hedy Lamarr's Todos</h1> <img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" className="photo" /> <ul> <li>Invent new traffic lights</li> <li>Rehearse a movie scene</li> <li>Improve the spectrum technology</li> </ul> </> ); }
Özet
Artık JSX’in neden var olduğunu ve bileşenlerde nasıl kullanılacağını biliyorsunuz:
- React bileşenleri, birbirleriyle ilişkili oldukları için render mantığını biçimlendirme ile birlikte gruplandırır.
- JSX, birkaç farkla HTML’e benzer. Eğer ihtiyacınız olursa dönüştürücü kullanabilirsiniz.
- Hata mesajları, genellikle biçimlendirmenizi düzeltmeniz için size doğru yolu gösterecektir.
Problem 1 / 1: Aşağıdaki HTML’i JSX’e dönüştürün
Bu HTML bir bileşene eklenmiş ancak geçerli bir JSX değildir. Bunu düzeltiniz:
export default function Bio() { return ( <div class="intro"> <h1>Welcome to my website!</h1> </div> <p class="summary"> You can find my thoughts here. <br><br> <b>And <i>pictures</b></i> of scientists! </p> ); }
Elle mi yoksa dönüştürücü kullanarak mı yapacağınız size kalmış!