JSX, React ekibi tarafından kullanıcı arayüzlerini bildirimsel olarak tanımlamak için geliştirilen, JavaScript için XML benzeri bir sözdizimi uzantısıdır. Şablon motorlarının aksine JSX, sıradan JavaScript işlev çağrılarına derlenir ve işaretleme içinde dilin tüm gücünü verir. React, 2024’e göre JSX, tüm modern React çerçeveleri ve kütüphanelerinde desteklenmektedir.
Anahtar Noktalar
JSX (JavaScript XML), ilk olarak 2013 yılında React’te tanıtılan bir JavaScript sözdizimi uzantısıdır. Geliştiricilerin, kullanıcı arayüzünün yapısını bildirimsel bir tarzda tanımlamasına, işaretleme ve mantığı tek bir dosyada birleştirmesine olanak tanır.
JSX’ten önce, geliştiriciler dize şablonları (Mustache, Handlebars) kullanıyor veya document.createElement aracılığıyla manuel olarak DOM öğeleri oluşturuyordu. Her iki yaklaşımın da dezavantajları vardı: dize şablonları tür denetimine tabi değildi ve manuel DOM oluşturma hantal ve hataya açıktı.
React farklı bir yol seçti — işaretlemeyi doğrudan koda gömmek. Bu karar toplulukta tartışmalara yol açtı, ancak zamanla standart haline geldi. Bugün JSX yalnızca React’te değil, aynı zamanda SolidJS, Preact, Qwik ve hatta Vue’de eklentiler aracılığıyla kullanılmaktadır.
JSX öğesi bir HTML etiketi gibi görünür ancak doğrudan JavaScript’e gömülüdür. Her öğe, üç bağımsız değişkenle React.createElement çağrısına dönüştürülür: öğe türü, props nesnesi ve alt öğeler. Tek bir kök öğe zorunlu bir kuraldır: bir JSX ifadesi bir ana öğe veya parça döndürmelidir.
import React from 'react';
// Temel JSX - tek kök öğe
const element = (
<div className="app">
<h1>Hello, World!</h1>
<p>Welcome to React</p>
</div>
);
Ek DOM düğümü gerekmediğinde, React.Fragment veya kısa sözdizimi <></> kullanın. Parçalar gerçek bir DOM öğesi oluşturmaz, yalnızca alt düğümleri gruplandırır. Bu, özellikle fazladan bir sarmalayıcının HTML yapısını bozacağı tablolar ve listelerde kullanışlıdır.
function Columns() {
return (
<>
<td>First</td>
<td>Second</td>
</>
);
}
Herhangi bir JavaScript ifadesi, küme parantezleri { } aracılığıyla JSX’e gömülür. İçinde değişkenler, işlev çağrıları, üçlü operatörler ve dizi yöntemleri kullanabilirsiniz. Koşullu işleme, üçlü operatör veya mantıksal VE aracılığıyla yapılır.
function Greeting({ name, isLoggedIn }) {
const items = ['Red', 'Green', 'Blue'];
return (
<div>
{/* Expression with variable */}
<h1>Hello, {name}</h1>
{/* Conditional rendering */}
{isLoggedIn ?
<p>Welcome back!</p :
<button>Login</button>
}
{/* Render array */}
<ul>
{items.map(item =>
<li key={item}>{item}</li>
)}
</ul>
</div>
);
}
Temel bir sınırlama — küme parantezleri içinde yalnızca ifadeler kullanılabilir, deyimler kullanılamaz. if/else, for, switch kullanamazsınız — yalnızca üçlü operatör, mantıksal operatörler ve dizi yöntemleri. Ok işlevleri dahil olmak üzere işlev çağrılarına izin verilir.
JSX görsel olarak HTML’e benzer ancak temel farklılıkları vardır. Nitellikler camelCase ile yazılır — class yerine className, onclick yerine onClick, tabindex yerine tabIndex. Bunun nedeni JSX’in JavaScript’e dönüştürülmesi ve özellik adlarında tire kullanılamamasıdır.
| HTML | JSX | Neden |
|---|---|---|
class="wrapper" | className="wrapper" | class JS’de ayrılmış sözcük |
onclick="handle()" | onClick={handle} | JS özellikleri için camelCase |
style="color: red" | style={{ color: ‘red’ }} | Dize yerine stil nesnesi |
<input disabled> | <input disabled={true}> | Açık boolean nitelikler |
Bir diğer önemli fark — kendi kendine kapanan etiketler. HTML’de bazı etiketler (br, hr, input) kapatılmadan bırakılabilir. JSX’te tüm kendi kendine kapanan etiketlerde kapanış eğik çizgisi bulunmalıdır: <br />, <input />. SVG nitelik adları da camelCase’e dönüştürülür: strokeWidth, fillOpacity.
Tarayıcılar JSX’i doğrudan anlamaz. Çalıştırmadan önce JSX kodu bir dönüştürücüden — Babel, TypeScript veya esbuild — geçer. Her JSX öğesi bir createElement veya jsx/runtime çağrısına dönüştürülür.
// Orijinal JSX
const element = <h1 className="title">Hello</h1>;
// Dönüştürmeden sonra
const element = React.createElement(
'h1',
{ className: 'title' },
'Hello'
);
React 17 ile React’i içe aktarmayı gerektirmeyen yeni bir JSX dönüşümü ortaya çıktı. jsx-runtime’ın otomatik içe aktarımı, import React from ‘react’ olmadan bileşen yazmayı sağlar. Babel ve TypeScript, {"runtime": "automatic"} yapılandırması aracılığıyla bu dönüşümü destekler.
JSX React ile ilişkilendirilse de diğer çerçeveler de onu kullanır. SolidJS, Sanal DOM olmadan gerçek DOM düğümlerine derleme ile JSX kullanır. Preact, tam JSX desteği sunan React’e hafif bir alternatiftir. Vue, @vue/babel-plugin-jsx aracılığıyla JSX’i destekler, ancak ana şablonu template’dir.
Temel bir fark ifade anlambilimidir. React’te JSX ifadeleri her işlemede yürütülür. SolidJS’de JSX bir kez derlenir ve güncellemeler sinyaller aracılığıyla izlenir. Bu performansı etkiler: SolidJS Sanal DOM ve uzlaşma gerektirmez, bu da JSX işlemesini hızlandırır.
TypeScript’te JSX dil düzeyinde desteklenir. .tsx uzantılı dosyalar otomatik olarak JSX sözdizimini işler. Props yazımı, TypeScript + JSX’in ana avantajlarından biridir: IDE beklenen nitelikleri, geri çağırma türlerini ve props zorunluluğunu önerir.
Okuması ve bakımı kolay JSX kodu yazın. Karmaşık ifadeleri ayrı değişkenlere veya işlevlere çıkarın — bu okunabilirliği artırır ve mantığı işaretlemeden ayrı olarak test etmeyi sağlar. Gereksiz div sarmalayıcılar yerine parçalar kullanın.
Girinti kuralı — iç içe öğeler için girintiyi koruyun. Her iç içe geçme düzeyi bir girinti düzeyidir. Kapanış etiketi, açılış etiketiyle aynı düzeyde olmalıdır. Uzun nitelikler için satır sonları kullanın.
Her işlemede oluşturuluyorlarsa props’ta satır içi ok işlevlerinden kaçının. Bu gibi durumlarda, geri çağırmayı useCallback ile sarın veya işlevi bileşenin dışına taşıyın. Karmaşık bileşenleri daha küçük olanlara bölün — her bileşen arayüzün bir mantıksal birimini işlemelidir.
Sıkça Sorulan Sorular
Evet, Babel eklentisi @babel/plugin-transform-react-jsx aracılığıyla JSX herhangi bir kütüphane için yapılandırılabilir. SolidJS, Preact, Nerv ve diğer çerçeveler kendi çalışma zamanlarıyla JSX kullanır. Tam bağımsızlık için, pragma’ı kendi işlevinize ayarlayabilirsiniz.
class JavaScript’te ayrılmış bir sözcüktür. JSX, ikinci bağımsız değişkenin bir props nesnesi ilettiği createElement’e dönüştürülür. class özelliği ES6 sınıf sözdizimiyle çelişir, bu nedenle React className’i seçmiştir.
Şablon dizeleri veya classnames kütüphanesini kullanın: className={`btn ${isActive ? ‘active’ : ‘’}`}. Karmaşık mantık için, nesneleri ve dizileri kabul eden npm paketi clsx veya classnames’i yükleyin.
JSX yalnızca ifadeleri destekler, deyimleri değil. Koşullar için üçlü operatörü, mantıksal VE (&&) veya mantıksal VEYA (||) kullanın. Karmaşık mantık için, koşulu ayrı bir değişkene veya işleve çıkarın.
key niteliği, React’in yeniden işleme sırasında liste öğelerini tanımlamasına yardımcı olur. Anahtar olmadan React, değişiklikte tüm listeyi yeniden işler. Benzersiz bir anahtarla React, DOM düğümlerini yeniden kullanır ve öğeleri yeniden oluşturmak yerine yeniden sıralar.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun