Karşılaştırmaya girmeden bir önceki Grid ile Uyumlu(Responsive) Sayfalar Yapmak yazısının girişinde yazdığımız aşağıdaki paragrafları tekrar hatırlayalım.

CSS grid modülü çıkana kadar sayfa planlama biz geliştiricilere modül, özellik grubu veya tanım olarak bir çözüm sunmamıştı. Geliştiriciler mevcut şartları sağlayacak özellikleri sayfa planlaması için kullandı.

İlk olarak <table> etiketiyle ve position tanımlarıyla HTML yoğunluklu çözmeye çalıştık. Daha sonra <div> etiketi ve float, width tanımlarıyla CSS yoğun çözümlerle çözmeye çalıştık. Daha sonra flex ile çözmeye çalıştık ancak bunların hiçbiri W3C’nin sayfa planlama için çıkardığı özellikler değildi. Belli bir amaca hizmet ediyordu ve geliştiriciler tarafından sayfa planlama için kullanıldı.

İlk defa sayfa planlama için bir modül olarak grid modülünü biz geliştiricilere sundu. Tüm ihtiyaçları gidermesi zor olsa da birçok ihtiyacı karşılıyor. Yeni eklenen subgrid özelliği de sayfa planlamadaki ihtiyaçları karşılamaya yönelik. Ayrıca daha yeni eklenen grid masonry özelliği standart koyucuların ihtiyaçlara göre çözüm üretme eğiliminde olduğunu gösteriyor.

Yani kısaca sayfa planlama grid’in işi. Artık sayfa planında grid kullanacağız. Sadece planlama mı? Yazının devamında detaylarına bakalım.

CSS Grid ilk çıktığı günden beri flex ile karşılaştırılıyor. Flex önceki döneme(float ile sayfa planladığımız zamanlar) göre bize avantajlar sağladığı için bir çok geliştrici çabuk benimsedi ve kullanmaya başladı. CSS Grid öğrenilmesi biraz daha zor olan bir konu olduğu için geliştiriciler flex ile sayfa planlamaya devam ediyorlar. Sadece geliştiriciler değil React Native bile hala CSS Grid özelliklerini adapte edebilmiş değil. React Native geliştirmesi istenilen özellikler listesinde başlarda sırasını bekliyor.

Bu makalede ne paylaşacağımızı açıkladıktan sonra bilgilerimizi tazeleme zamanı.

Bu karşılaşmayı yapmadan önce flex

ve CSS grid ile olarakta;

Okumanızı öneririm. Şimdi aradaki önemli farkları inceleyelim.

Eksen farkı

Daha önceki grid yazılarımda da bahsetmiştim, flex tek eksende(dikey veya yatay) etki yaparken grid iki eksende etki eder.

iki eksenli planlama Daha önceleri tek eksenli sayfa kodlamaları yaptığımız için uyumlu web sayfalarındaki bazı yer değiştirmeleri zor oluyordu, bazı tasarımları gerçekleştirme imkanı olmadığı için bazı kod bloklarının iki kopyasını oluşturduğumuz oluyordu. Bu durum grid’in iki eksenli yapısıyla tarihe karıştı.

Zingat’ta ilan detay sayfasında breadcrumb’ın yeri sorun olmuştu. Mobilde resmin altında olan breadcrumb desktopta tüm içerik ve sağ kolonun üzerinde konumlandırılmak istenmişti. Tek eksenli bir düşünce ile bu işi halletmek çok zor bir iş olduğu için biz içeriği iki kere sayfaya ekleyip mobilde birini desktop’ta diğerini göstererek geçmiştik. Şimdi iki eksenli bir grid ile bu işi nasıl yaparım diye düşününce nispeten basit ve tek içerik ile bu durumu çözebiliyoruz.

Responsive zorluklarını bir anda kolaylaştıran bir özellik.

İçerik eksenli yaklaşım / sayfa planlama eksenli yaklaşım

Flexbox ve Grid arasındaki bir diğer önemli fark, Flexbox’ın içerik temelli bir yapısı varken Grid’in sayfa planını temelli bir yapısının olmasıdır.

flex vs Grid

Flexbox tek yönlü olduğu için, flex tanımladığımız kapsayıcının içeriği kolon/sütun planın nasıl olacağını belirler.

Grid’de ise display:grid tanımladığımız kapsayıcının içindeki öğelerini satır ve sütun sayılarını belirleyerek ögelerin sayfa planını belirleriz. İçeriğin ne olduğundan bağımsız planı uygularız.

Yukarıdaki örnekteki gibi ızgara yapısına ters tasarımlar için flex daha mantıklı tercih olur.

Sonuç

CSS grid flex’in yerine gelen bir modül değil, birlikte kullanılacak iki özellik. İhtiyacımıza göre tercihimiz yapıp kodlayacağız. Her ikisinin kendine göre avantajlı olduğunu durumlar var. Kullandığımız sayfa, komponente hangisi uygunsa onunla kodlayacağız.

Kalın sağlıcakla.

Kaynaklar

React ile 1,5 sene geliştirme yaptıktan sonra yeni projede React Native (Netleşmemişti ama genel kanı bu yöndeydi) ile geliştireceğimizi öğrenince 1-2 ay kadar React Native kaynaklarına bakma fırsatım oldu. Şunu ifade etmeliyim ki kullanmadan önce tedirgindim ancak hiç tedirginliğe gerek yokmuş. Bir projeye dahil olunca hızlı ve kolay bir geçiş oluyor.

Bu yazıya yaklaşık olarak 8 ay önce başlamıştım. Düzenleyip yayına almak bugüne (6 Mayıs 2021) nasipmiş.

Yeni projeye expo ile başladık. Expo hakkında detay için https://expo.io/ buraya bakabilirsiniz. Expo ile react native projeleri geliştirmek gerçekten çok kolay. Projenizi gerçek cihazda test etmemiz çok kolaylaştırıyor. React Native’e hızlı giriş için süper bir platform.

Projeye başlayıp işleri aldıkça bazı problemlerle karşılaştım. Çözmek için stackoverflow, react native sitesi ve çalışma arkadaşlarımın yardımını kullandım. Bu sayede geçiş tahminimden daha kolay oldu. İlerleyen zamanlarda bazı ciddi sorunlar yaşasak da genel olarak beklediğimden daha sorunsuz bir geçiş oldu.

Geçiş sırasında karşılaştığım sorunlar ve çözümleri burada paylaşayım.

HTML elementleri yerine muadillerini kullanmak

Web kodlarken alıştığımız div, span, image, ul, ol ve button yerine React Native’de aşağıdaki karşılıkları kullanılıyor.

HTML React Native
<div> <View>
<span> ve <p> <Text>
<ul>, <ol> <FlatList>
<image> <Image>
<button> <TouchableHighlight> veya <TouchableOpacity>

Genel olarak sadece isimleri değişiyor. Kullanımda ufak değişikler olsa da dokümantasyondan kolaylıkla kavrayıp devam ediyoruz.

SVG eklemek

React Native ile kodlama yaparken ilk yaşadığım sorunlardan bir tanesi web’de ikonları svg olarak eklediğim için burada da ekleyeyim dedim ancak React Native’in SVG desteğinin olmaması şaşırttı. SVG ikon kullanmak için react-native-svg kütüphanesini genelde tercih ediliyor. Ben de bunu kullanarak ikonları ekledim. Zafer Ayan’ın makalesi imdadıma yetişti.

Kullanımı çok basit.

import NoBellIcon from  'assets/icons/no-bell.svg';

şeklinde sayfamıza kaynağını ekledikten sonra

<NoBellIcon  width={52}  height={52}  />

şeklinde jsx kısmını ekleyerek svg resimlerimizi kolayca projelerimize ekleyebiliyoruz.

Renk geçişi kullanımı

Tam bu şoku atlattım derken renk geçişi(gradient) kullanmam gereken bir buton için ben CSS ile kodumu yazdım. O da nesi çalışmadı :( Meğer React Native’in renk geçiş desteği de yokmuş. Bunu çözmek için de bir kütüphane kullanmamız gerekiyormuş. react-native-linear-gradient kütüpnesini kullanarak bu işe çözüm buldum.

import LinearGradient from  'react-native-linear-gradient';

ve

<LinearGradient
    colors={['#4c669f', '#3b5998']}
    start=
    end=
    style={styles.gradient}>
    <Text  style={styles.gradientText}>KAPAT</Text>
</LinearGradient>

Genel olarak beklemediğim sorunlar olsa da çözümlerinin kolay olması sevindirici oluyordu.

Sabit satır sayısı

Eklediğim metnin uzayıp stilin bozulmasını istemediğim yerlerde metni tek satırda sabitlemek için css ile white-space: no-wrap ve overflow: hidden hatta üç nokta koymak için de text-overflow: ellipsis kullanıyorum. Ancak React Native’de bu da farklı <Text numberOfLines={1}> kodu yetiyor. Daha az kod ile halletmek sevindirici.

Telefon arama

Web’de bu işi yapmak için <a href='tel:+9002125478833'>Ara beni</> şeklindeki bir kullanımda React native’de karşılık bulmuyor. Bunun yerine React native’de

import {Linking} from 'react-native' 

<Text onPress={()=>{Linking.openURL('tel:+9002125478833');}}>Ara beni</Text>

şeklinde çözülüyor.

Platforma özel kod

Eski İnternet Explorer 6 zamanı bu tip işler oluyordu. ie6’ya başka diğerlerine başka kod yazma ihtiyacının olduğu durumlar oluyordu. Mobilde iki büyük platform var. Android ve iOS. Bazen bir platforma özel kod yazmak gerekiyor.

import  { Platform, StyleSheet }  from  'react-native';

const styles = StyleSheet.create({
    height: Platform.OS  ===  'ios'  ?  200  :  100
});

Sonuç

Başta nereye baksam sorun olarak gelse de zamanla oturuyor ve hepsine alışıyorsunuz. Sorunların kısa sürede ve kolayca halledilmesi geçişi kolaylaştırıyor. Bu yazıda ilk başta yaşadığım sorunları ve çözümleri yazdım. Zamanım olursa başka sorun ve çözümleri de paylaşmaya çalışırım.

Beraber çalıştığım arkadaşlarım trendyol-tech’de bu proje boyunca yaşadıklarımız ve kullandığımız metodları paylaştılar. Okumanızı öneririm.

Beraber çalıştığım arkadaşlarımla bu proje boyunca çok fazla yardımlaştık. Hepsine teşekkürlerimi sunuyorum. Sercan Eraslan, İsmail Hakkı Tekin, İsmail Demirci, Tolga Cesur, Doğan Öztürk, Yusuf Zeren, Talha Turhan, Şeyda Taşkın Davut, Burak Yağdıran

Kalın sağlıcakla.

Kaynaklar

HTML kodu yazarken uzun zamamdır ihtiyacını duyduğum bir özellikti.

Özetle ihtiyacım, uzayan HTML dokümanlarında hangi div’in hangi sınıfın kapama etiketi olduğunu bulmak.

Eklenti HTML End Tag Labels. Böyle bir eklentinin olduğunu öğrenmek beni mutlu etti. Eskiden bunun için html’in yorum satırlarını kullanırdım. Bu konuda bir ipucu yazısı da yazmıştım. Bir bakıma eklenti benim elle yaptığım yorum satırı eklemesini kendi otomatik yapıyor.

enter image description here Yukarıdaki </div> kapama etiketleri anlamsız. Eklentiyi kurup aktifleştirdikten sonra her kapama etiketi sonuna sınıf veya id’sini ekledi.

enter image description here Şimdi daha anlamlı oldu. Eklenti React içindeki html(jsx) kodlarında çalışmadı. Bunun için eklentinin github hesabında bir istek açılmış ama henüz destek eklenmemiş.

Kalın sağlıcakla.