React Fragment Nedir

React Fragment Nedir?

React.Fragment bir komponentin çıktısını boş bir etiket olarak sarmak için geliştirilmiş bir özelliktir. Böylece bir bileşenin çıktısını div etiketi ile sarmadan kullanabiliriz.

Neden ve Ne Zaman React Fragment Kullanılmalıdır?

React ile uygulama geliştirirken bir komponentin çıktısının tek bir etiket içerisinde olması gerekir. Aksi halde sözdizimi (syntax) hatası alınacak ve uygulama çalışmayacaktır.

Bu nedenle örnek React bileşen çıktısı

return (
    <div>
        <h1>Başlık</h1>
        <p>Bir paragraf</p>
        <hr />
        <Uye />
    </div>
)

şeklinde olacaktır. Tüm komponent içeriği tek bir div etiketine sarılı olarak oluşturulacaktır.

Burada olan bir sorun fazladan bir div etiketi, DOM üzerinde fazladan bir düğüm demektir ve bu da fazladan bir yük demektir. Performansı olumsuz etkileyebiliriz. Bakınız React Performans Optimizasyonu.

Yine ayrıca farklı bir sorunda şu şekilde ortaya çıkacaktır. Mesela çıktımız bir kaç tane td tagı içeriyor olabilir.

return (
    <div>
        <td>Birinci sütun</td>
        <td>İkinci sütun</td>
        <td>Üçüncü sütun</td>
    </div>
);

Bu şekilde bir kullanımda tg tagları bir div içerisinde olacağı için bir hata söz konusu olacaktır. Son çıktı

    <table>
        <tr>
            <div>
                <td>..</td>
                <td>..</td>
                <td>..</td>
            </div>
        </tr>
    </table>

şeklinde olacağı için hatalı bir kullanım olacaktır. Bu ve benzeri sorunları engellemek için boş bir tag şeklinde kullanılan React.fragment geliştirilmiştir.

Yukarıdaki tablo örneğine döndersek

return (
    <React.Fragment>
        <td>Birinci sütun</td>
        <td>İkinci sütun</td>
        <td>Üçüncü sütun</td>
    </React.Fragment>
);

şeklinde bir kullanımda gereksiz div tagı kullanılmamış olacak ve son çıktı

    <table>
        <tr>
            <td>..</td>
            <td>..</td>
        </tr>
    </table>

şeklinde olacaktır. Bu da doğru bir kullanımdır.

React.Fragment Key Kullanımı

Eğer map içerisinde bir fragment kullanılacaksa, div veya liste elemanlarında kullanıdığımız gibi key bilgisini kullanmamız doğru ve etkin bir render açısından gereklidir. Mesela

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // `key` olmadan, React önemli bir uyarıyı tetikler
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

// Kaynak: https://tr.reactjs.org/

React.Fragment Shorthand / Kısa Yazılım

Kolay bir kullanım için React.Fragmenti kısaca <> şeklinde kullanılabilir.

return (
    <>
        <h1>Başlık</h1>
        <p>Paragraf</p>
        <hr />
    </>
);

React.Fragment vs Div Karşılaştırması

Bir komponentin çıktısını tek bir etiket içerisine almamız gerektiğini daha önce söylemiştik. Aksi halde bir sözdizimi hatası alıyoruz. Bunun için div veya React.Fragment kullanılabilir.

Eğer çıktıyı sarmaladığımız etiket bir stil alacaksa ve DOM üzerinde kullanılacaksa, mesela komponentin çıktısı sayfanın sağına yaslanacaksa div etiketi kullanılması uygun olacaktır.

Fakat bileşen çıktısını tek bir etiket altına toplamamı sadece, komponentin doğru çalışması açısından gerekli ise bu durumda React.Fragment kullanmak daha doğru olacaktır.

Bir de daha önce tablo örneğine verdiğimiz gibi durumlar bulunmakta, bu durumlarda eğer komponent çıktısı div etiketi içerisine alınırsa hata oluşmakta. Bu nedenle de bu tür komponentlerin çıktıları React.Fragment içerisine alınmalıdır.

React.Fragment Css

React.Fragment şuan için css desteği ile gelmemektedir. Bu nedenle stil bilgileri kullanılamaz. Bu nedenle de yine React.Fragment classname seçeneği de bulunmamaktadır.

Hata

Eğer bir komponent çıktısı tek bir etiket veya React.Fragment içerisine alınmazsa bu durumda aşağıdaki sözdizimi hatası oluşacaktır. Bu hatayı görüldüğünde, ilgili komponentin tüm içeriğinin tek bir etiket içerisinde olması gerektiğine dikkat etmek gereklidir.

Compiled with problems:

ERROR in ./src/App.js

Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: App.js: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>? (72:4)

...

ERROR


src/App.js
  Line 72:4:  Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>? (72:4)

Sonuç

Uygulama geliştirirken farklı durumlarda, farklı seçeneklerimiz bulunur. Bunları iyi bilirsek, daha etkin uygulamalar geliştirebiliriz. React ile çalışırken eğer bir komponentin çıktısını bir araya toplamak istersek React.Fragment kullanabiliriz.

Sormak istediklerinizi bizimle yorumlarda paylaşabilirsiniz.

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir