diff --git a/Turkish/01_Gun_JavaScript_Tazeleyici/01_javascript_tazeleyici.md b/Turkish/01_Gun_JavaScript_Tazeleyici/01_javascript_tazeleyici.md new file mode 100644 index 0000000..86fb9bb --- /dev/null +++ b/Turkish/01_Gun_JavaScript_Tazeleyici/01_javascript_tazeleyici.md @@ -0,0 +1,2396 @@ +
+

30 Days Of React: JavaScript Tazeleyici

+ + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
+ Ekim, 2020 +
+ +
+ +[<< Gün 0](../readMe.md) | [Gün 2 >>](../02_Gun_Reacta_Giris/02_reacta_giris.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_1.jpg) + +- [JavaScript Tazeleyici](#javascript-tazeleyici) + - [0. Web Sayfasına JavaScript Ekleme](#0-web-sayfasına-javascript-ekleme) + - [Satır İçi Script (Inline Script)](#satır-içi-script-inline-script) + - [Dahili Script (Internal Script)](#dahili-script-internal-script) + - [Harici Script (External Script)](#harici-script-external-script) + - [Birden Fazla Harici Script](#birden-fazla-harici-script) + - [1. Değişkenler (Variables)](#1-değişkenler-variables) + - [2. Veri Tipleri (Data Types)](#2-veri-tipleri-data-types) + - [3. Diziler (Arrays)](#3-diziler-arrays) + - [Boş dizi oluşturma](#boş-dizi-oluşturma) + - [Değerli dizi oluşturma](#değerli-dizi-oluşturma) + - [split ile dizi oluşturma](#split-ile-dizi-oluşturma) + - [İndeks ile dizi elemanına erişme](#i̇ndeks-ile-dizi-elemanına-erişme) + - [Dizi elemanını değiştirme](#dizi-elemanını-değiştirme) + - [Dizi manipülasyon metotları](#dizi-manipülasyon-metotları) + - [Array Constructor (Dizi Yapıcısı)](#array-constructor-dizi-yapıcısı) + - [fill ile statik değer oluşturma](#fill-ile-statik-değer-oluşturma) + - [concat ile dizi birleştirme](#concat-ile-dizi-birleştirme) + - [Dizi uzunluğunu öğrenme](#dizi-uzunluğunu-öğrenme) + - [Dizide eleman indeksi bulma](#dizide-eleman-indeksi-bulma) + - [Dizide elemanın son indeksini bulma](#dizide-elemanın-son-indeksini-bulma) + - [Diziyi kontrol etme](#diziyi-kontrol-etme) + - [Diziyi stringe çevirme](#diziyi-stringe-çevirme) + - [Dizi elemanlarını birleştirme (join)](#dizi-elemanlarını-birleştirme-join) + - [Dizi elemanlarını dilimleme (slice)](#dizi-elemanlarını-dilimleme-slice) + - [Dizide splice metodu](#dizide-splice-metodu) + - [push ile diziye eleman ekleme](#push-ile-diziye-eleman-ekleme) + - [pop ile son elemanı çıkarma](#pop-ile-son-elemanı-çıkarma) + - [Baştan eleman çıkarma](#baştan-eleman-çıkarma) + - [Başa eleman ekleme](#başa-eleman-ekleme) + - [Dizi sırasını tersine çevirme](#dizi-sırasını-tersine-çevirme) + - [Dizide sıralama](#dizide-sıralama) + - [Dizi içinde dizi](#dizi-içinde-dizi) + - [💻 Egzersiz](#-egzersiz) + - [Egzersiz: Seviye 1](#egzersiz-seviye-1) + - [Egzersiz: Seviye 2](#egzersiz-seviye-2) + - [Egzersiz: Seviye 3](#egzersiz-seviye-3) + - [4. Koşullar (Conditionals)](#4-koşullar-conditionals) + - [If](#if) + - [If Else](#if-else) + - [If Else if Else](#if-else-if-else) + - [Switch](#switch) + - [Üçlü Operatörler (Ternary Operators)](#üçlü-operatörler-ternary-operators) + - [💻 Egzersizler](#-egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + - [5. Döngüler (Loops)](#5-döngüler-loops) + - [Döngü Türleri](#döngü-türleri) + - [1. for](#1-for) + - [2. while](#2-while) + - [3. do while](#3-do-while) + - [4. for of](#4-for-of) + - [5. forEach](#5-foreach) + - [6. for in](#6-for-in) + - [Döngüyü kesme ve eleman atlama](#döngüyü-kesme-ve-eleman-atlama) + - [break](#break) + - [continue](#continue) + - [Sonuçlar](#sonuçlar) + - [6. Kapsam (Scope)](#6-kapsam-scope) + - [Window Scope (Pencere Kapsamı)](#window-scope-pencere-kapsamı) + - [Global Scope (Global Kapsam)](#global-scope-global-kapsam) + - [Local Scope (Yerel Kapsam)](#local-scope-yerel-kapsam) + - [7. Nesne (Object)](#7-nesne-object) + - [Boş nesne oluşturma](#boş-nesne-oluşturma) + - [Değerli nesne oluşturma](#değerli-nesne-oluşturma) + - [Nesneden değer okuma](#nesneden-değer-okuma) + - [Nesne metotları oluşturma](#nesne-metotları-oluşturma) + - [Nesneye yeni anahtar ekleme](#nesneye-yeni-anahtar-ekleme) + - [Nesne Metotları (Object Methods)](#nesne-metotları-object-methods) + - [Object.keys() ile nesne anahtarlarını alma](#objectkeys-ile-nesne-anahtarlarını-alma) + - [Object.values() ile nesne değerlerini alma](#objectvalues-ile-nesne-değerlerini-alma) + - [Object.entries() ile anahtar-değer çiftlerini alma](#objectentries-ile-anahtar-değer-çiftlerini-alma) + - [hasOwnProperty() ile özellik kontrolü](#hasownproperty-ile-özellik-kontrolü) + - [💻 Egzersizler](#-egzersizler-1) + - [8. Fonksiyonlar (Functions)](#8-fonksiyonlar-functions) + - [Fonksiyon Tanımlama (Function Declaration)](#fonksiyon-tanımlama-function-declaration) + - [Parametresiz ve geri dönüşsüz fonksiyon](#parametresiz-ve-geri-dönüşsüz-fonksiyon) + - [Değer döndüren fonksiyon](#değer-döndüren-fonksiyon) + - [Parametreli fonksiyon](#parametreli-fonksiyon) + - [İki parametreli fonksiyon](#i̇ki-parametreli-fonksiyon) + - [Çok parametreli fonksiyon](#çok-parametreli-fonksiyon) + - [Sınırsız parametreli fonksiyon](#sınırsız-parametreli-fonksiyon) + - [Anonim Fonksiyon (Anonymous Function)](#anonim-fonksiyon-anonymous-function) + - [Expression Function (İfade Fonksiyonu)](#expression-function-i̇fade-fonksiyonu) + - [Kendi Kendini Çağıran Fonksiyonlar (Self Invoking Functions)](#kendi-kendini-çağıran-fonksiyonlar-self-invoking-functions) + - [Ok Fonksiyonu (Arrow Function)](#ok-fonksiyonu-arrow-function) + - [Varsayılan parametreli fonksiyon](#varsayılan-parametreli-fonksiyon) + - [💻 Egzersizler](#-egzersizler-2) + - [9. Higher Order Function (Yüksek Dereceli Fonksiyon)](#9-higher-order-function-yüksek-dereceli-fonksiyon) + - [Callback (Geri Çağrım Fonksiyonu)](#callback-geri-çağrım-fonksiyonu) + - [Fonksiyon döndürme](#fonksiyon-döndürme) + - [Zamanlama Fonksiyonları](#zamanlama-fonksiyonları) + - [setInterval](#setinterval) + - [setTimeout](#settimeout) + - [10. Destructuring (Parçalama) ve Spread (Yayma)](#10-destructuring-parçalama-ve-spread-yayma) + - [Destructuring (Parçalama) Nedir?](#destructuring-parçalama-nedir) + - [Ne parçalayabiliriz?](#ne-parçalayabiliriz) + - [1. Dizi Parçalama (Array Destructuring)](#1-dizi-parçalama-array-destructuring) + - [2. Nesne Parçalama (Object Destructuring)](#2-nesne-parçalama-object-destructuring) + - [Egzersizler](#egzersizler) + - [Spread veya Rest Operatörü](#spread-veya-rest-operatörü) + - [11. Fonksiyonel Programlama (Functional Programming)](#11-fonksiyonel-programlama-functional-programming) + - [1. forEach](#1-foreach) + - [2. map](#2-map) + - [3. filter](#3-filter) + - [4. reduce](#4-reduce) + - [5. find](#5-find) + - [6. findIndex](#6-findindex) + - [7. some](#7-some) + - [8. every](#8-every) + - [12. Class (Sınıf)](#12-class-sınıf) + - [Class Tanımlama](#class-tanımlama) + - [Class Örnekleme (Instantiation)](#class-örnekleme-instantiation) + - [Class Constructor (Kurucu)](#class-constructor-kurucu) + - [Constructor ile varsayılan değerler](#constructor-ile-varsayılan-değerler) + - [Class Metotları](#class-metotları) + - [Başlangıç değerli özellikler](#başlangıç-değerli-özellikler) + - [getter](#getter) + - [setter](#setter) + - [Static metot](#static-metot) + - [Inheritance (Kalıtım)](#inheritance-kalıtım) + - [Metot Override (Geçersiz Kılma)](#metot-override-geçersiz-kılma) + - [13. Document Object Model (DOM)](#13-document-object-model-dom) + +## JavaScript Tazeleyici + +### 0. Web Sayfasına JavaScript Ekleme + +JavaScript, bir web sayfasına üç farklı yolla eklenebilir: + +- **_Satır içi script (Inline script)_** +- **_Dahili script (Internal script)_** +- **_Harici script (External script)_** +- **_Birden fazla harici script_** + +Aşağıdaki bölümler, web sayfanıza JavaScript kodu eklemenin farklı yollarını göstermektedir. + +#### Satır İçi Script (Inline Script) + +Masaüstünüzde veya herhangi bir konumda 30DaysOfJS adında bir proje klasörü oluşturun ve proje klasörü içinde bir **_index.html_** dosyası oluşturun. Ardından aşağıdaki kodu yapıştırıp tarayıcıda, örneğin [Chrome](https://www.google.com/chrome/)'da açın. + +```html + + + + 30DaysOfScript:Inline Script + + + + + +``` + +Az önce ilk satır içi script'inizi yazdınız. _alert()_ yerleşik fonksiyonunu kullanarak bir açılır uyarı mesajı oluşturabiliriz. + +#### Dahili Script (Internal Script) + +Dahili script, _head_ veya _body_ içine yazılabilir; ancak HTML belgesinin body'sine koymak tercih edilir. Önce sayfanın head kısmına yazalım. + +```html + + + + 30DaysOfScript:Internal Script + + + + +``` + +Çoğu zaman dahili script'i bu şekilde yazarız. JavaScript kodunu body bölümüne yazmak en çok tercih edilen seçenektir. console.log() çıktısını görmek için tarayıcı konsolunu açın. + +```html + + + + 30DaysOfScript:Internal Script + + + + + + +``` + +console.log() çıktısını görmek için tarayıcı konsolunu açın. + +![js code from vscode](../../images/js_code_vscode.png) + +#### Harici Script (External Script) + +Dahili script'e benzer şekilde, harici script linki head veya body'de olabilir; ancak body'e koymak tercih edilir. Önce .js uzantılı harici bir JavaScript dosyası oluşturmalıyız. .js uzantısıyla biten tüm dosyalar JavaScript dosyasıdır. Proje dizininizde introduction.js adında bir dosya oluşturun, aşağıdaki kodu yazın ve bu .js dosyasını body'nin altına bağlayın. + +```js +console.log("30DaysOfJavaScript'e Hoş Geldiniz"); +``` + +_head_ içinde harici script: + +```html + + + + 30DaysOfJavaScript:External script + + + + +``` + +_body_ içinde harici script: + +```html + + + + 30DaysOfJavaScript:External script + + + + + + +``` + +console.log() çıktısını görmek için tarayıcı konsolunu açın. + +#### Birden Fazla Harici Script + +Bir web sayfasına birden fazla harici JavaScript dosyası bağlayabiliriz. 30DaysOfJS klasörü içinde helloworld.js adında bir dosya oluşturun ve aşağıdaki kodu yazın. + +```js +console.log("Merhaba, Dünya!"); +``` + +```html + + + + Multiple External Scripts + + + + + + +``` + +_main.js dosyanız diğer tüm script'lerin altında olmalıdır_. Bunu hatırlamak çok önemlidir. + +![Multiple Script](../../images/multiple_script.png) + +### 1. Değişkenler (Variables) + +Değişken tanımlamak için _var_, _let_ ve _const_ kullanırız. _var_ fonksiyon scope'una sahipken, _let_ ve _const_ blok scope'una sahiptir. Bu meydan okumada JavaScript'in ES6 ve üzeri özelliklerini kullanıyoruz. _var_ kullanmaktan kaçının. + +```js +let firstName = "Asabeneh"; +firstName = "Eyob"; + +const PI = 3.14; // PI'ye yeni değer atamak yasaktır +// PI = 3. +``` + +### 2. Veri Tipleri (Data Types) + +Veri tipleri konusunda kendinizi rahat hissetmiyorsanız şu [bağlantıyı](https://github.com/Asabeneh/30-Days-Of-JavaScript/blob/master/02_Day_Data_types/02_day_data_types.md) inceleyin. + +### 3. Diziler (Arrays) + +Değişkenlerin aksine, bir array (dizi) _birden fazla değer_ saklayabilir. Dizideki her değerin bir _indeksi_ vardır ve her indeks _bellekte bir referansa_ sahiptir. Her değere _indeksleri_ kullanılarak erişilebilir. Bir dizinin indeksi _sıfırdan_ başlar ve son elemanın indeksi dizinin uzunluğundan bir eksiktir. + +Dizi, sıralı ve değiştirilebilir (modifiye edilebilir) farklı veri tiplerinden oluşan bir koleksiyondur. Dizi, yinelenen elemanları ve farklı veri tiplerini saklayabilir. Dizi boş olabilir ya da farklı veri tipi değerleri içerebilir. + +#### Boş dizi oluşturma + +JavaScript'te bir diziyi farklı yollarla oluşturabiliriz. +Dizi değişkeni tanımlarken _let_ yerine _const_ kullanmak çok yaygındır. const kullanıyorsanız, o değişken adını tekrar kullanmayacaksınız demektir. + +- Array Constructor kullanarak + +```js +// sözdizimi +const arr = Array(); +// veya +// let arr = new Array() +console.log(arr); // [] +``` + +- Köşeli parantez ([]) kullanarak + +```js +// sözdizimi +// Boş dizi oluşturmanın en çok önerilen yolu budur +const arr = []; +console.log(arr); +``` + +#### Değerli dizi oluşturma + +Başlangıç değerleri olan dizi. Uzunluğu bulmak için _length_ özelliğini kullanırız. + +```js +const numbers = [0, 3.14, 9.81, 37, 98.6, 100]; // sayılardan oluşan dizi +const fruits = ["banana", "orange", "mango", "lemon"]; // string dizisi, meyveler +const vegetables = ["Tomato", "Potato", "Cabbage", "Onion", "Carrot"]; // string dizisi, sebzeler +const animalProducts = ["milk", "meat", "butter", "yoghurt"]; // string dizisi, ürünler +const webTechs = ["HTML", "CSS", "JS", "React", "Redux", "Node", "MongDB"]; // web teknolojileri dizisi +const countries = ["Finland", "Denmark", "Sweden", "Norway", "Iceland"]; // string dizisi, ülkeler + +// Diziyi ve uzunluğunu yazdır + +console.log("Numbers:", numbers); +console.log("Number of numbers:", numbers.length); + +console.log("Fruits:", fruits); +console.log("Number of fruits:", fruits.length); + +console.log("Vegetables:", vegetables); +console.log("Number of vegetables:", vegetables.length); + +console.log("Animal products:", animalProducts); +console.log("Number of animal products:", animalProducts.length); + +console.log("Web technologies:", webTechs); +console.log("Number of web technologies:", webTechs.length); + +console.log("Countries:", countries); +console.log("Number of countries:", countries.length); +``` + +- Dizi farklı veri tiplerinden eleman içerebilir + +```js +const arr = [ + "Asabeneh", + 250, + true, + { country: "Finland", city: "Helsinki" }, + { skills: ["HTML", "CSS", "JS", "React", "Python"] }, +]; // farklı veri tiplerini içeren dizi +console.log(arr); +``` + +#### split ile dizi oluşturma + +Önceki bölümde gördüğümüz gibi, bir string'i farklı konumlardan bölebilir ve diziye dönüştürebiliriz. Aşağıdaki örneklere bakalım. + +```js +let js = "JavaScript"; +const charsInJavaScript = js.split(""); + +console.log(charsInJavaScript); // ["J", "a", "v", "a", "S", "c", "r", "i", "p", "t"] + +let companiesString = "Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon"; +const companies = companiesString.split(","); + +console.log(companies); // ["Facebook", " Google", " Microsoft", " Apple", " IBM", " Oracle", " Amazon"] +let txt = + "I love teaching and empowering people. I teach HTML, CSS, JS, React, Python."; +const words = txt.split(" "); + +console.log(words); +// metnin özel karakterleri var; yalnızca kelimeleri nasıl alabileceğinizi düşünün +// ["I", "love", "teaching", "and", "empowering", "people.", "I", "teach", "HTML,", "CSS,", "JS,", "React,", "Python"] +``` + +#### İndeks ile dizi elemanına erişme + +Dizideki her elemana indeksini kullanarak erişiriz. Dizi indeksi 0'dan başlar. Aşağıdaki resim dizideki her elemanın indeksini açıkça göstermektedir. + +![arr index](../../images/array_index.png) + +```js +const fruits = ["banana", "orange", "mango", "lemon"]; +let firstFruit = fruits[0]; // indeksini kullanarak ilk elemana erişiyoruz + +console.log(firstFruit); // banana + +secondFruit = fruits[1]; +console.log(secondFruit); // orange + +let lastFruit = fruits[3]; +console.log(lastFruit); // lemon +// Son indeks şu şekilde hesaplanabilir + +let lastIndex = fruits.length - 1; +lastFruit = fruits[lastIndex]; + +console.log(lastFruit); // lemon +``` + +```js +const numbers = [0, 3.14, 9.81, 37, 98.6, 100]; // sayı kümesi + +console.log(numbers.length); // => dizinin büyüklüğünü bilmek için, yani 6 +console.log(numbers); // -> [0, 3.14, 9.81, 37, 98.6, 100] +console.log(numbers[0]); // -> 0 +console.log(numbers[5]); // -> 100 + +let lastIndex = numbers.length - 1; +console.log(numbers[lastIndex]); // -> 100 +``` + +```js +const webTechs = [ + "HTML", + "CSS", + "JavaScript", + "React", + "Redux", + "Node", + "MongoDB", +]; // Web teknolojileri listesi + +console.log(webTechs); // tüm dizi elemanları +console.log(webTechs.length); // => dizinin büyüklüğü, yani 7 +console.log(webTechs[0]); // -> HTML +console.log(webTechs[6]); // -> MongoDB + +let lastIndex = webTechs.length - 1; +console.log(webTechs[lastIndex]); // -> MongoDB +``` + +#### Dizi elemanını değiştirme + +Dizi değiştirilebilirdir (mutable). Bir dizi oluşturulduktan sonra dizi elemanlarının içeriğini değiştirebiliriz. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers[0] = 10; // 0. indeksteki 1'i 10 ile değiştirme +numbers[1] = 20; // 1. indeksteki 2'yi 20 ile değiştirme + +console.log(numbers); // [10, 20, 3, 4, 5] + +const countries = [ + "Albania", + "Bolivia", + "Canada", + "Denmark", + "Ethiopia", + "Finland", + "Germany", + "Hungary", + "Ireland", + "Japan", + "Kenya", +]; + +countries[0] = "Afghanistan"; // Albania'yı Afghanistan ile değiştirme +let lastIndex = countries.length - 1; +countries[lastIndex] = "Korea"; // Kenya'yı Korea ile değiştirme + +console.log(countries); +``` + +#### Dizi manipülasyon metotları + +Bir diziyi manipüle etmek için farklı metotlar vardır. Dizilerle ilgilenirken kullanabileceğimiz bazı metotlar şunlardır: _Array, length, concat, indexOf, slice, splice, join, toString, includes, lastIndexOf, isArray, fill, push, pop, shift, unshift_ + +##### Array Constructor (Dizi Yapıcısı) + +Array: Dizi oluşturmak için. + +```js +const arr = Array(); // boş bir dizi oluşturur +console.log(arr); + +const eightEmptyValues = Array(8); // sekiz boş değer oluşturur +console.log(eightEmptyValues); // [empty x 8] +``` + +##### fill ile statik değer oluşturma + +fill: Tüm dizi elemanlarını statik bir değerle doldurur. + +```js +const arr = Array(); // boş bir dizi oluşturur +console.log(arr); + +const eightXvalues = Array(8).fill("X"); // 'X' ile dolu sekiz elemanlı dizi oluşturur +console.log(eightXvalues); // ['X', 'X','X','X','X','X','X','X'] + +const eight0values = Array(8).fill(0); // '0' ile dolu sekiz elemanlı dizi oluşturur +console.log(eight0values); // [0, 0, 0, 0, 0, 0, 0, 0] + +const four4values = Array(4).fill(4); // '4' ile dolu dört elemanlı dizi oluşturur +console.log(four4values); // [4, 4, 4, 4] +``` + +##### concat ile dizi birleştirme + +concat: İki diziyi birleştirmek için. + +```js +const firstList = [1, 2, 3]; +const secondList = [4, 5, 6]; +const thirdList = firstList.concat(secondList); + +console.log(thirdList); // [1, 2, 3, 4, 5, 6] +``` + +```js +const fruits = ["banana", "orange", "mango", "lemon"]; // meyve dizisi +const vegetables = ["Tomato", "Potato", "Cabbage", "Onion", "Carrot"]; // sebze dizisi +const fruitsAndVegetables = fruits.concat(vegetables); // iki diziyi birleştir + +console.log(fruitsAndVegetables); +``` + +##### Dizi uzunluğunu öğrenme + +Length: Dizinin büyüklüğünü öğrenmek için. + +```js +const numbers = [1, 2, 3, 4, 5]; +console.log(numbers.length); // -> 5 dizinin büyüklüğüdür +``` + +##### Dizide eleman indeksi bulma + +indexOf: Bir elemanın dizide var olup olmadığını kontrol etmek için. Varsa indeksini, yoksa -1 döndürür. + +```js +const numbers = [1, 2, 3, 4, 5]; + +console.log(numbers.indexOf(5)); // -> 4 +console.log(numbers.indexOf(0)); // -> -1 +console.log(numbers.indexOf(1)); // -> 0 +console.log(numbers.indexOf(6)); // -> -1 +``` + +Bir elemanın dizide var olup olmadığını kontrol etmek için: + +```js +// banana'nın dizide olup olmadığını kontrol edelim + +const fruits = ["banana", "orange", "mango", "lemon"]; +let index = fruits.indexOf("banana"); // 0 + +if (index != -1) { + console.log("Bu meyve dizide mevcut"); +} else { + console.log("Bu meyve dizide mevcut değil"); +} +// Bu meyve dizide mevcut + +// üçlü operatör de kullanılabilir +index != -1 + ? console.log("Bu meyve dizide mevcut") + : console.log("Bu meyve dizide mevcut değil"); + +// avocado'nun dizide olup olmadığını kontrol edelim +let indexOfAvocado = fruits.indexOf("avocado"); // -1, eleman bulunamazsa indeks -1'dir +if (indexOfAvocado != -1) { + console.log("Bu meyve dizide mevcut"); +} else { + console.log("Bu meyve dizide mevcut değil"); +} +// Bu meyve dizide mevcut değil +``` + +##### Dizide elemanın son indeksini bulma + +lastIndexOf: Dizideki son elemanın konumunu verir. Varsa indeksi, yoksa -1 döndürür. + +```js +const numbers = [1, 2, 3, 4, 5, 3, 1, 2]; + +console.log(numbers.lastIndexOf(2)); // 7 +console.log(numbers.lastIndexOf(0)); // -1 +console.log(numbers.lastIndexOf(1)); // 6 +console.log(numbers.lastIndexOf(4)); // 3 +console.log(numbers.lastIndexOf(6)); // -1 +``` + +includes: Bir elemanın dizide var olup olmadığını kontrol eder. Varsa true, yoksa false döndürür. + +```js +const numbers = [1, 2, 3, 4, 5]; + +console.log(numbers.includes(5)); // true +console.log(numbers.includes(0)); // false +console.log(numbers.includes(1)); // true +console.log(numbers.includes(6)); // false + +const webTechs = [ + "HTML", + "CSS", + "JavaScript", + "React", + "Redux", + "Node", + "MongoDB", +]; // Web teknolojileri listesi + +console.log(webTechs.includes("Node")); // true +console.log(webTechs.includes("C")); // false +``` + +##### Diziyi kontrol etme + +Array.isArray: Veri tipinin dizi olup olmadığını kontrol etmek için. + +```js +const numbers = [1, 2, 3, 4, 5]; +console.log(Array.isArray(numbers)); // true + +const number = 100; +console.log(Array.isArray(number)); // false +``` + +##### Diziyi stringe çevirme + +toString: Diziyi stringe çevirir. + +```js +const numbers = [1, 2, 3, 4, 5]; +console.log(numbers.toString()); // 1,2,3,4,5 + +const names = ["Asabeneh", "Mathias", "Elias", "Brook"]; +console.log(names.toString()); // Asabeneh,Mathias,Elias,Brook +``` + +##### Dizi elemanlarını birleştirme (join) + +join: Dizi elemanlarını birleştirmek için kullanılır. join metoduna geçirilen argüman elemanlar arasına eklenerek string olarak döndürülür. Varsayılan olarak virgülle birleştirir; ancak elemanlar arasına farklı string parametre geçirebiliriz. + +```js +const numbers = [1, 2, 3, 4, 5]; +console.log(numbers.join()); // 1,2,3,4,5 + +const names = ["Asabeneh", "Mathias", "Elias", "Brook"]; + +console.log(names.join()); // Asabeneh,Mathias,Elias,Brook +console.log(names.join("")); //AsabenehMathiasEliasBrook +console.log(names.join(" ")); //Asabeneh Mathias Elias Brook +console.log(names.join(", ")); //Asabeneh, Mathias, Elias, Brook +console.log(names.join(" # ")); //Asabeneh # Mathias # Elias # Brook +``` + +##### Dizi elemanlarını dilimleme (slice) + +Slice: Belirli bir aralıktaki birden fazla elemanı kesmek için. Başlangıç ve bitiş konumu olmak üzere iki parametre alır. Bitiş konumundaki elemanı dahil etmez. + +```js +const numbers = [1, 2, 3, 4, 5]; + +console.log(numbers.slice()); // -> tüm elemanları kopyalar +console.log(numbers.slice(0)); // -> tüm elemanları kopyalar +console.log(numbers.slice(0, numbers.length)); // tüm elemanları kopyalar +console.log(numbers.slice(1, 4)); // -> [2,3,4] // bitiş konumunu dahil etmez +``` + +##### Dizide splice metodu + +Splice: Üç parametre alır: Başlangıç konumu, kaç eleman çıkarılacağı ve kaç eleman ekleneceği. + +```js +const numbers = [1, 2, 3, 4, 5]; + +console.log(numbers.splice()); // -> tüm elemanları çıkarır +``` + +```js +const numbers = [1, 2, 3, 4, 5]; +console.log(numbers.splice(0, 1)); // ilk elemanı çıkar +``` + +```js +const numbers = [1, 2, 3, 4, 5, 6]; +console.log(numbers.splice(3, 3, 7, 8, 9)); // -> [1, 2, 3, 7, 8, 9] // üç eleman çıkarır ve üç eleman ekler +``` + +##### push ile diziye eleman ekleme + +Push: Sona eleman ekleme. Mevcut bir dizinin sonuna eleman eklemek için push metodunu kullanırız. + +```js +// sözdizimi +const arr = ["item1", "item2", "item3"]; +arr.push("new item"); + +console.log(arr); +// ['item1', 'item2','item3','new item'] +``` + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.push(6); + +console.log(numbers); // -> [1,2,3,4,5,6] + +numbers.pop(); // -> sondan bir elemanı çıkar +console.log(numbers); // -> [1,2,3,4,5] +``` + +##### pop ile son elemanı çıkarma + +pop: Sondan eleman çıkarma. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.pop(); // -> sondan bir elemanı çıkarır + +console.log(numbers); // -> [1,2,3,4] +``` + +##### Baştan eleman çıkarma + +shift: Dizinin başından bir eleman çıkarır. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.shift(); // -> baştan bir elemanı çıkarır + +console.log(numbers); // -> [2,3,4,5] +``` + +##### Başa eleman ekleme + +unshift: Dizinin başına bir eleman ekler. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.unshift(0); // -> başa bir eleman ekler + +console.log(numbers); // -> [0,1,2,3,4,5] +``` + +##### Dizi sırasını tersine çevirme + +reverse: Dizinin sırasını tersine çevirir. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.reverse(); // -> dizi sırasını tersine çevirir + +console.log(numbers); // [5, 4, 3, 2, 1] + +numbers.reverse(); +console.log(numbers); // [1, 2, 3, 4, 5] +``` + +##### Dizide sıralama + +sort: Dizi elemanlarını artan sırayla düzenler. sort bir callback fonksiyonu alır; callback ile nasıl kullanıldığını ilerleyen bölümlerde göreceğiz. + +```js +const webTechs = [ + "HTML", + "CSS", + "JavaScript", + "React", + "Redux", + "Node", + "MongoDB", +]; + +webTechs.sort(); +console.log(webTechs); // ["CSS", "HTML", "JavaScript", "MongoDB", "Node", "React", "Redux"] + +webTechs.reverse(); // sıraladıktan sonra tersine çevirebiliriz +console.log(webTechs); // ["Redux", "React", "Node", "MongoDB", "JavaScript", "HTML", "CSS"] +``` + +#### Dizi içinde dizi + +Dizi, dizi dahil farklı veri tiplerini saklayabilir. Dizi içinde dizi oluşturalım. + +```js +const firstNums = [1, 2, 3]; +const secondNums = [1, 4, 9]; + +const arrayOfArray = [ + [1, 2, 3], + [1, 2, 3], +]; +console.log(arrayOfArray[0]); // [1, 2, 3] + +const frontEnd = ["HTML", "CSS", "JS", "React", "Redux"]; +const backEnd = ["Node", "Express", "MongoDB"]; +const fullStack = [frontEnd, backEnd]; +console.log(fullStack); // [["HTML", "CSS", "JS", "React", "Redux"], ["Node", "Express", "MongoDB"]] +console.log(fullStack.length); // 2 +console.log(fullStack[0]); // ["HTML", "CSS", "JS", "React", "Redux"] +console.log(fullStack[1]); // ["Node", "Express", "MongoDB"] +``` + +### 💻 Egzersiz + +##### Egzersiz: Seviye 1 + +```js +const countries = [ + "Albania", + "Bolivia", + "Canada", + "Denmark", + "Ethiopia", + "Finland", + "Germany", + "Hungary", + "Ireland", + "Japan", + "Kenya", +]; + +const webTechs = [ + "HTML", + "CSS", + "JavaScript", + "React", + "Redux", + "Node", + "MongoDB", +]; +``` + +1. _Boş_ bir dizi tanımlayın +2. 5'ten fazla elemanlı bir dizi tanımlayın +3. Dizinizin uzunluğunu bulun +4. Dizinin ilk, orta ve son elemanını alın +5. _mixedDataTypes_ adında bir dizi tanımlayın, farklı veri tiplerini ekleyin ve uzunluğunu bulun. Dizi boyutu 5'ten büyük olmalıdır +6. itCompanies adında bir değişken tanımlayın ve Facebook, Google, Microsoft, Apple, IBM, Oracle, Amazon başlangıç değerlerini atayın +7. _console.log()_ ile diziyi yazdırın +8. Dizideki şirket sayısını yazdırın +9. İlk, orta ve son şirketi yazdırın +10. Her şirketi ayrı ayrı yazdırın +11. Her şirket adını büyük harfe çevirip yazdırın +12. Diziyi cümle gibi yazdırın: Facebook, Google, Microsoft, Apple, IBM, Oracle ve Amazon büyük IT şirketleridir. +13. itCompanies dizisinde belirli bir şirketin olup olmadığını kontrol edin. Varsa şirketi, yoksa _bulunamadı_ mesajını döndürün +14. filter metodu kullanmadan birden fazla 'o' içeren şirketleri filtreleyin +15. _sort()_ metodu ile diziyi sıralayın +16. _reverse()_ metodu ile diziyi tersine çevirin +17. Diziden ilk 3 şirketi dilimleyin +18. Diziden son 3 şirketi dilimleyin +19. Dizinin ortasındaki IT şirketini/şirketlerini dilimleyin +20. İlk IT şirketini diziden çıkarın +21. Ortadaki IT şirketini/şirketlerini diziden çıkarın +22. Son IT şirketini diziden çıkarın +23. Tüm IT şirketlerini çıkarın + +##### Egzersiz: Seviye 2 + +1. Ayrı bir countries.js dosyası oluşturun ve ülkeler dizisini bu dosyaya, ayrı bir web_techs.js dosyası oluşturun ve webTechs dizisini bu dosyaya saklayın. Her iki dosyaya main.js dosyasından erişin. +2. Önce tüm noktalama işaretlerini kaldırıp stringi diziye çevirin ve dizideki kelime sayısını sayın. + + ```js + let text = + "I love teaching and empowering people. I teach HTML, CSS, JS, React, Python."; + console.log(words); + console.log(words.length); + ``` + +3. Aşağıdaki alışveriş sepetine eleman ekleyin, çıkarın, düzenleyin. + + ```js + const shoppingCart = ["Milk", "Coffee", "Tea", "Honey"]; + ``` + + - Daha önce eklenmemişse başa 'Meat' ekleyin + - Daha önce eklenmemişse sona Şeker ekleyin + - Bal alerjiniz varsa 'Honey' çıkarın + - Tea'yi 'Green Tea' olarak değiştirin + +4. countries dizisinde 'Ethiopia' varsa 'ETHIOPIA' yazdırın. Yoksa ülkeler listesine ekleyin. +5. webTechs dizisinde Sass varsa 'Sass bir CSS ön işlemcisidir' yazdırın. Yoksa diziye ekleyip yazdırın. +6. Aşağıdaki iki değişkeni birleştirip fullStack değişkenine saklayın. + +##### Egzersiz: Seviye 3 + +1. Aşağıda 10 öğrencinin yaşlarından oluşan bir dizi var: + `const ages = [19, 22, 19, 24, 20, 25, 26, 24, 25, 24]` + - Diziyi sıralayın, minimum ve maksimum yaşı bulun + - Medyan yaşı bulun (ortadaki bir eleman veya iki orta eleman toplamının yarısı) + - Ortalama yaşı bulun (tüm elemanların toplamı / eleman sayısı) + - Yaş aralığını bulun (max - min) + - (min - ortalama) ve (max - ortalama)'nın değerini karşılaştırın, _abs()_ metodunu kullanın + +### 4. Koşullar (Conditionals) + +Koşullu ifadeler, farklı koşullara göre kararlar almak için kullanılır. Varsayılan olarak JavaScript'teki ifadeler yukarıdan aşağıya sırayla çalışır. İşleme mantığı gerektiriyorsa, sıralı yürütme akışı iki şekilde değiştirilebilir: + +- Koşullu yürütme: Belirli bir ifade doğruysa bir veya daha fazla ifadeden oluşan bir blok çalışır. +- Tekrarlı yürütme: Belirli bir ifade doğru olduğu sürece bir veya daha fazla ifadeden oluşan bir blok tekrar tekrar çalışır. Bu bölümde _if_, _else_, _else if_ ifadelerini ele alacağız. + +Koşullar şu yollarla uygulanabilir: + +- if +- if else +- if else if else +- switch +- üçlü operatör (ternary operator) + +#### If + +JavaScript ve diğer programlama dillerinde _if_ anahtar kelimesi, bir koşulun doğru olup olmadığını kontrol etmek ve blok kodu çalıştırmak için kullanılır. + +```js +// sözdizimi +if (koşul) { + // bu bölüm doğru koşul için çalışır +} +``` + +**Örnek:** + +```js +let num = 3; +if (num > 0) { + console.log(`${num} pozitif bir sayıdır`); +} +// 3 pozitif bir sayıdır +``` + +#### If Else + +Koşul doğruysa ilk blok, değilse else bloğu çalışır. + +```js +// sözdizimi +if (koşul) { + // bu bölüm doğru koşul için çalışır +} else { + // bu bölüm yanlış koşul için çalışır +} +``` + +```js +let num = 3; +if (num > 0) { + console.log(`${num} pozitif bir sayıdır`); +} else { + console.log(`${num} negatif bir sayıdır`); +} +// 3 pozitif bir sayıdır + +num = -3; +if (num > 0) { + console.log(`${num} pozitif bir sayıdır`); +} else { + console.log(`${num} negatif bir sayıdır`); +} +// -3 negatif bir sayıdır +``` + +#### If Else if Else + +İkiden fazla koşulumuz olduğunda _else if_ kullanırız. + +```js +// sözdizimi +if (koşul) { + // kod +} else if (koşul) { + // kod +} else { + // kod +} +``` + +**Örnek:** + +```js +let a = 0; +if (a > 0) { + console.log(`${a} pozitif bir sayıdır`); +} else if (a < 0) { + console.log(`${a} negatif bir sayıdır`); +} else if (a == 0) { + console.log(`${a} sıfırdır`); +} else { + console.log(`${a} bir sayı değildir`); +} +``` + +#### Switch + +Switch, **if else if else**'e bir alternatiftir. switch ifadesi bir _switch_ anahtar kelimesiyle başlar, ardından parantez ve kod bloğu gelir. Kod bloğunun içinde farklı case'ler olacaktır. switch parantezindeki değer, case değeriyle eşleşirse case bloğu çalışır. break ifadesi, koşul sağlandıktan sonra kodun aşağıya devam etmemesi için çalışmayı durdurur. Hiçbir case koşulu sağlamazsa default bloğu çalışır. + +```js +switch (caseValue) { + case 1: + // kod + break; + case 2: + // kod + break; + case 3: + // kod + default: + // kod +} +``` + +#### Üçlü Operatörler (Ternary Operators) + +Üçlü operatör _React_'ta çok yaygındır. If else ifadesini kısa yazmak için kullanılır. React'ta pek çok durumda üçlü operatörü kullanırız. + +```js +let isRaining = true; +isRaining + ? console.log("Yağmurluk almanız gerekiyor.") + : console.log("Yağmurluk gerekmez."); +``` + +### 💻 Egzersizler + +##### Egzersizler: Seviye 1 + +1. prompt("Yaşınızı girin:") kullanarak kullanıcıdan yaş alın. 18 veya daha büyükse 'Araba kullanabilecek yaştasınız' geri bildirimi verin; değilse kaç yıl beklemesi gerektiğini söyleyin. +2. myAge ve yourAge'yi if...else kullanarak karşılaştırın ve sonucu konsola yazdırın. +3. a, b'den büyükse 'a, b'den büyük' değilse 'a, b'den küçük' döndürün. İki yolla uygulayın: if else ve üçlü operatör. +4. Çift sayılar 2'ye bölünebilir ve kalanı sıfırdır. JavaScript ile bir sayının çift mi tek mi olduğunu nasıl kontrol edersiniz? + +##### Egzersizler: Seviye 2 + +1. Öğrenci notlarına göre harf notu veren bir kod yazın: 80-100 A, 70-89 B, 60-69 C, 50-59 D, 0-49 F. +2. Mevsimi kontrol edin: Sonbahar, Kış, İlkbahar veya Yaz. +3. Bir günün hafta sonu mu yoksa iş günü mü olduğunu kontrol edin. + +##### Egzersizler: Seviye 3 + +1. Bir ayın kaç gün olduğunu söyleyen bir program yazın. +2. Artık yılı da dikkate alan bir program yazın. + +### 5. Döngüler (Loops) + +Programlamada tekrarlayan görevleri yerine getirmek için farklı döngüler kullanırız. Döngüler, sıkıcı ve tekrar eden görevleri otomatikleştirmemize yardımcı olabilir. + +Döngüler: + +- for +- while +- do while +- for of +- forEach +- for in + +Bir döngü genellikle koşul false olana kadar devam eder. Ancak bazen döngüyü kesmek veya iterasyon sırasında bir elemanı atlamak isteyebiliriz. Döngüyü kesmek için _break_, iterasyon sırasında bir elemanı atlamak için _continue_ kullanırız. + +#### Döngü Türleri + +##### 1. for + +Kaç iterasyon yapacağımızı bildiğimizde for döngüsü kullanırız. + +```js +// for döngüsü sözdizimi + +for (başlangıç, koşul, artış/azalış) { + kod buraya gelir +} +``` + +Bu kod 0'dan 5'e kadar yazdırır: + +```js +for (let i = 0; i < 6; i++) { + console.log(i); +} +``` + +0'dan 100'e kadar tüm sayıları toplamak için: + +```js +let sum = 0; +for (let i = 0; i < 101; i++) { + sum += i; +} + +console.log(sum); +``` + +Sadece çift sayıları toplamak için: + +```js +let sum = 0; +for (let i = 0; i < 101; i += 2) { + sum += i; +} + +console.log(sum); +``` + +Ters sırada döngü: + +```js +for (let i = 5; i >= 0; i--) { + console.log(i); +} +``` + +##### 2. while + +Kaç iterasyon yapacağımızı önceden bilmediğimizde while döngüsü kullanırız. + +```js +let count = prompt("Pozitif bir sayı girin: "); +while (count > 0) { + console.log(count); + count--; +} +``` + +##### 3. do while + +do while döngüsü, koşul doğru veya yanlış olsa bile en az bir kez çalışır. + +```js +let count = 0; +do { + console.log(count); + count++; +} while (count < 11); +``` + +##### 4. for of + +for of döngüsü dizilerle kullanmak için çok kullanışlıdır. Dizi indeksiyle ilgilenmiyorsak for of döngüsü, normal for veya forEach döngüsüne tercih edilir. + +```js +const numbers = [1, 2, 3, 4, 5]; +for (const number of numbers) { + console.log(number); +} + +const countries = ["Finland", "Sweden", "Norway", "Denmark", "Iceland"]; +for (const country of countries) { + console.log(country.toUpperCase()); +} +``` + +##### 5. forEach + +Dizi indeksiyle ilgileniyorsak forEach, for of döngüsüne tercih edilir. forEach dizi metodu bir callback fonksiyonu alır; callback üç argüman alır: eleman, indeks ve dizinin kendisi. + +```js +const numbers = [1, 2, 3, 4, 5]; +numbers.forEach((number, i) => { + console.log(number, i); +}); + +const countries = ["Finland", "Sweden", "Norway", "Denmark", "Iceland"]; +countries.forEach((country, i, arr) => { + console.log(i, country.toUpperCase()); +}); +``` + +##### 6. for in + +for in döngüsü, nesne literalleriyle nesnenin anahtarlarını almak için kullanılabilir. + +```js +const user = { + firstName: "Asabeneh", + lastName: "Yetayeh", + age: 250, + country: "Finland", + skills: ["HTML", "CSS", "JS", "React", "Node", "Python", "D3.js"], +}; + +for (const key in user) { + console.log(key, user[key]); +} +``` + +#### Döngüyü kesme ve eleman atlama + +##### break + +break, bir döngüyü kesmek için kullanılır. + +```js +for (let i = 0; i <= 5; i++) { + if (i == 3) { + break; + } + console.log(i); +} + +// 0 1 2 +``` + +##### continue + +Belirli iterasyonları atlamak için continue anahtar kelimesini kullanırız. + +```js +for (let i = 0; i <= 5; i++) { + if (i == 3) { + continue; + } + console.log(i); +} +// 0 1 2 4 5 +``` + +#### Sonuçlar + +- Normal for döngüsü, iterasyon sayısı bilindiğinde her yerde kullanılabilir. +- while döngüsü, iterasyon sayısı bilinmediğinde kullanılır. +- do while ve while neredeyse aynıdır; ancak do while koşul yanlış olsa bile en az bir kez çalışır. +- for of yalnızca dizi için kullanılır. +- forEach dizi için kullanılır. +- for in nesne için kullanılır. + +### 6. Kapsam (Scope) + +Değişken, programlamanın temel parçasıdır. Farklı veri tiplerini saklamak için değişken tanımlarız. Değişken tanımlamak için _var_, _let_ ve _const_ anahtar kelimelerini kullanırız. Bir değişken farklı scope'larda tanımlanabilir. Bu bölümde scope'u ve _var_ veya _let_ kullandığımızda değişken scope'larını göreceğiz. + +Değişken scope'ları: + +- Window (Pencere) +- Global (Küresel) +- Local (Yerel) + +#### Window Scope (Pencere Kapsamı) + +console.log() kullanmadan tarayıcınızı açın ve a veya b yazarsanız değerini görürsünüz. Bu, a ve b'nin zaten window'da mevcut olduğu anlamına gelir. + +```js +//scope.js +a = "JavaScript"; // window scope'unda bulunur, her yerden erişilebilir +b = 10; // bu bir window scope değişkenidir +function letsLearnScope() { + console.log(a, b); + if (true) { + console.log(a, b); + } +} +console.log(a, b); // erişilebilir +``` + +#### Global Scope (Global Kapsam) + +Global olarak tanımlanan bir değişkene aynı dosyanın her yerinden erişilebilir. + +```js +//scope.js +let a = "JavaScript"; // global scope'ta, bu dosyanın her yerinde bulunacak +let b = 10; // global scope'ta, bu dosyanın her yerinde bulunacak +function letsLearnScope() { + console.log(a, b); // JavaScript 10, erişilebilir + if (true) { + let a = "Python"; + let b = 100; + console.log(a, b); // Python 100 + } + console.log(a, b); +} +letsLearnScope(); +console.log(a, b); // JavaScript 10, erişilebilir +``` + +#### Local Scope (Yerel Kapsam) + +Yerel olarak tanımlanan bir değişkene yalnızca belirli kod bloğu içinden erişilebilir. + +```js +//scope.js +let a = "JavaScript"; // global scope'ta +let b = 10; // global scope'ta +function letsLearnScope() { + console.log(a, b); // JavaScript 10, erişilebilir + let c = 30; + if (true) { + // fonksiyon içinden ve dışından erişebiliriz; ancak + // if içinde tanımlanan değişkenlere if dışından erişilemez + let a = "Python"; + let b = 20; + let d = 40; + console.log(a, b, c); // Python 20 30 + } + // c'ye erişemeyiz çünkü c'nin scope'u yalnızca if bloğudur + console.log(a, b); // JavaScript 10 +} +letsLearnScope(); +console.log(a, b); // JavaScript 10, erişilebilir +``` + +_var_ ile tanımlanan değişken yalnızca fonksiyon scope'una sahipken, _let_ veya _const_ ile tanımlanan değişken blok scope'una sahiptir (fonksiyon bloğu, if bloğu, döngü vb.). + +```js +//scope.js +function letsLearnScope() { + var gravity = 9.81; + console.log(gravity); +} +// console.log(gravity), Hata: gravity tanımlı değil + +if (true) { + var gravity = 9.81; + console.log(gravity); // 9.81 +} +console.log(gravity); // 9.81 + +for (var i = 0; i < 3; i++) { + console.log(i); // 1, 2, 3 +} +console.log(i); +``` + +ES6 ve üzerinde _let_ ve _const_ var olduğundan _var_'ın sorunlarıyla uğraşmak zorunda kalmazsınız. + +```js +//scope.js +function letsLearnScope() { + const gravity = 9.81; + console.log(gravity); +} +// console.log(gravity), Hata: gravity tanımlı değil + +if (true) { + const gravity = 9.81; + console.log(gravity); // 9.81 +} +// console.log(gravity), Hata: gravity tanımlı değil + +for (let i = 0; i < 3; i++) { + console.log(i); // 1, 2, 3 +} +// console.log(i), Hata: i tanımlı değil +``` + +_let_ ve _const_'un scope'u aynıdır. Fark yalnızca yeniden atamadadır. const değişkeninin değerini değiştiremez veya yeniden atayamayız. Değişen her değer için _let_, sabit her değer için _const_ kullanmanız önerilir. Diziler, nesneler, ok fonksiyonları ve fonksiyon ifadeleri için de _const_ kullanın. + +### 7. Nesne (Object) + +Her şey nesne olabilir ve nesnelerin özellikleri, özelliklerin de değerleri vardır; bu nedenle nesne bir anahtar-değer çiftidir. + +#### Boş nesne oluşturma + +```js +const person = {}; +``` + +#### Değerli nesne oluşturma + +```js +const rectangle = { + length: 20, + width: 20, +}; +console.log(rectangle); // {length: 20, width: 20} + +const person = { + firstName: "Asabeneh", + lastName: "Yetayeh", + age: 250, + country: "Finland", + city: "Helsinki", + skills: [ + "HTML", + "CSS", + "JavaScript", + "React", + "Node", + "MongoDB", + "Python", + "D3.js", + ], + isMarried: true, +}; +console.log(person); +``` + +#### Nesneden değer okuma + +Nesne değerlerine iki yöntemle erişebiliriz: + +- Anahtar adını takiben nokta (.) kullanarak (tek kelimelik anahtar adı için) +- Köşeli parantez ve tırnak işareti kullanarak + +```js +const person = { + firstName: "Asabeneh", + lastName: "Yetayeh", + age: 250, + country: "Finland", + city: "Helsinki", + skills: [ + "HTML", + "CSS", + "JavaScript", + "React", + "Node", + "MongoDB", + "Python", + "D3.js", + ], + getFullName: function () { + return `${this.firstName}${this.lastName}`; + }, + "phone number": "+3584545454545", +}; + +// nokta ile değere erişme +console.log(person.firstName); +console.log(person.lastName); +console.log(person.age); +console.log(person.location); + +// köşeli parantez ve anahtar adıyla değere erişme +console.log(person["firstName"]); +console.log(person["lastName"]); +console.log(person["age"]); +console.log(person["location"]); + +// telefon numarasına yalnızca köşeli parantez yöntemiyle erişebiliriz +console.log(person["phone number"]); +``` + +#### Nesne metotları oluşturma + +person nesnesi artık getFullName özelliğine sahiptir. getFullName, person nesnesi içindeki bir fonksiyondur ve buna nesne metotu deriz. _this_ anahtar kelimesi nesnenin kendisine atıfta bulunur. Nesne metodunda ok fonksiyonu kullanmamalıyız çünkü ok fonksiyonu içinde _this_ nesnenin kendisi yerine window'a atıfta bulunur. + +```js +const person = { + firstName: "Asabeneh", + lastName: "Yetayeh", + age: 250, + country: "Finland", + city: "Helsinki", + skills: [ + "HTML", + "CSS", + "JavaScript", + "React", + "Node", + "MongoDB", + "Python", + "D3.js", + ], + getFullName: function () { + return `${this.firstName} ${this.lastName}`; + }, +}; + +console.log(person.getFullName()); +// Asabeneh Yetayeh +``` + +#### Nesneye yeni anahtar ekleme + +Nesne değiştirilebilir bir veri yapısıdır ve oluşturulduktan sonra içeriğini değiştirebiliriz. + +```js +person.nationality = "Ethiopian"; +person.country = "Finland"; +person.title = "teacher"; +person.skills.push("Meteor"); +person.skills.push("SasS"); +person.isMarried = true; +``` + +#### Nesne Metotları (Object Methods) + +##### Object.keys() ile nesne anahtarlarını alma + +_Object.keys_: Bir nesnenin anahtarlarını veya özelliklerini dizi olarak almak için. + +```js +const keys = Object.keys(copyPerson); +console.log(keys); //['name', 'age', 'country', 'skills', 'address', 'getPersonInfo'] +``` + +##### Object.values() ile nesne değerlerini alma + +_Object.values_: Bir nesnenin değerlerini dizi olarak almak için. + +```js +const values = Object.values(copyPerson); +console.log(values); +``` + +##### Object.entries() ile anahtar-değer çiftlerini alma + +_Object.entries_: Anahtarları ve değerleri dizi olarak almak için. + +```js +const entries = Object.entries(copyPerson); +console.log(entries); +``` + +##### hasOwnProperty() ile özellik kontrolü + +_hasOwnProperty_: Belirli bir anahtar veya özelliğin nesnede olup olmadığını kontrol etmek için. + +```js +console.log(copyPerson.hasOwnProperty("name")); +console.log(copyPerson.hasOwnProperty("score")); +``` + +### 💻 Egzersizler + +##### Egzersizler: Seviye 1 + +1. dog adında boş bir nesne oluşturun +2. Nesneye name, legs, color, age ve bark özellikleri ekleyin. bark özelliği _woof woof_ döndüren bir metot olsun +3. dog nesnesinden değerleri alın +4. dog nesnesine breed ve getDogInfo özelliklerini ayarlayın + +##### Egzersizler: Seviye 2 + +1. users nesnesinde en fazla beceriye sahip kişiyi bulun. +2. Giriş yapmış kullanıcıları sayın, 50 veya daha fazla puanı olan kullanıcıları sayın. +3. MERN stack geliştiricisi olan kişileri bulun. + +##### Egzersizler: Seviye 3 + +1. Merkezi eğilim ölçüsünü (ortalama, medyan, mod) ve değişkenlik ölçüsünü (aralık, varyans, standart sapma) hesaplayan bir Statistics sınıfı oluşturun. + +### 8. Fonksiyonlar (Functions) + +Fonksiyon, belirli bir görevi gerçekleştirmek için tasarlanmış yeniden kullanılabilir kod bloğu veya programlama ifadeleridir. + +Fonksiyon şu yollarla tanımlanabilir veya oluşturulabilir: + +- _Declaration function (Tanımlama fonksiyonu)_ +- _Expression function (İfade fonksiyonu)_ +- _Anonymous function (Anonim fonksiyon)_ +- _Arrow function (Ok fonksiyonu)_ + +#### Fonksiyon Tanımlama (Function Declaration) + +```js +// parametresiz fonksiyon tanımlama +function functionName() { + // kod buraya gelir +} +functionName(); // fonksiyonu adı ve parantezle çağırma +``` + +#### Parametresiz ve geri dönüşsüz fonksiyon + +```js +// parametresiz fonksiyon, kareyi hesaplayan fonksiyon +function square() { + let num = 2; + let sq = num * num; + console.log(sq); +} + +square(); // 4 + +// parametresiz fonksiyon +function addTwoNumbers() { + let numOne = 10; + let numTwo = 20; + let sum = numOne + numTwo; + + console.log(sum); +} + +addTwoNumbers(); // çalıştırmak için ismiyle çağrılmalıdır +``` + +#### Değer döndüren fonksiyon + +Fonksiyon değer döndürmüyorsa döndürülen değer undefined'dır. + +```js +function printFullName() { + let firstName = "Asabeneh"; + let lastName = "Yetayeh"; + let space = " "; + let fullName = firstName + space + lastName; + return fullName; +} +console.log(printFullName()); +``` + +#### Parametreli fonksiyon + +```js +// bir parametreli fonksiyon +function functionName(parm1) { + // kod buraya gelir +} +functionName(parm1); // çağırırken bir argüman gerekir + +function areaOfCircle(r) { + let area = Math.PI * r * r; + return area; +} + +console.log(areaOfCircle(10)); // bir argümanla çağrılmalıdır +``` + +#### İki parametreli fonksiyon + +```js +// iki parametreli fonksiyon +function functionName(parm1, parm2) { + // kod buraya gelir +} +functionName(parm1, parm2); // çağırırken iki argüman gerekir + +function sumTwoNumbers(numOne, numTwo) { + let sum = numOne + numTwo; + return sum; +} + +console.log(sumTwoNumbers(10, 20)); +``` + +#### Çok parametreli fonksiyon + +```js +// çok parametreli fonksiyon +function functionName(parm1, parm2, parm3,...){ + // kod buraya gelir +} +``` + +#### Sınırsız parametreli fonksiyon + +Bazen kullanıcının kaç argüman geçireceğini bilmeyiz. Sınırsız sayıda argüman alabilecek fonksiyon yazmayı bilmeliyiz. + +Normal fonksiyonda: + +```js +// arguments nesnesine erişim +function sumAllNums() { + let sum = 0; + for (let i = 0; i < arguments.length; i++) { + sum += arguments[i]; + } + return sum; +} + +console.log(sumAllNums(1, 2, 3, 4)); // 10 +console.log(sumAllNums(10, 20, 13, 40, 10)); // 93 +``` + +Ok fonksiyonunda spread operatörü kullanarak: + +```js +const sumAllNums = (...args) => { + let sum = 0; + for (const element of args) { + sum += element; + } + return sum; +}; + +console.log(sumAllNums(1, 2, 3, 4)); // 10 +console.log(sumAllNums(10, 20, 13, 40, 10)); // 93 +``` + +#### Anonim Fonksiyon (Anonymous Function) + +İsimsiz fonksiyon: + +```js +const anonymousFun = function () { + console.log( + "Ben anonim bir fonksiyonum ve değerim anonymousFun içinde saklanıyor", + ); +}; +``` + +#### Expression Function (İfade Fonksiyonu) + +Expression function'lar anonim fonksiyonlardır. İsimsiz bir fonksiyon oluşturup değişkene atarız. + +```js +// Fonksiyon ifadesi +const square = function (n) { + return n * n; +}; + +console.log(square(2)); // -> 4 +``` + +#### Kendi Kendini Çağıran Fonksiyonlar (Self Invoking Functions) + +Kendi kendini çağıran fonksiyonlar, değer döndürmek için çağrılmaya gerek duyulmayan anonim fonksiyonlardır. + +```js +(function (n) { + console.log(n * n); +})(2); // 4 + +let squaredNum = (function (n) { + return n * n; +})(10); + +console.log(squaredNum); +``` + +#### Ok Fonksiyonu (Arrow Function) + +Ok fonksiyonu, fonksiyon yazmak için bir alternatiftir. + +```js +// normal fonksiyon tanımlama +function square(n) { + return n * n; +} + +console.log(square(2)); // 4 + +// ok fonksiyonu olarak +const square = (n) => { + return n * n; +}; + +console.log(square(2)); // -> 4 + +// yalnızca bir satır varsa açık return ile şöyle yazılabilir +const square = (n) => n * n; // -> 4 +``` + +#### Varsayılan parametreli fonksiyon + +Bazen parametrelere varsayılan değerler geçiririz; fonksiyon çağrıldığında argüman geçirilmezse varsayılan değer kullanılır. + +```js +function greetings(name = "Peter") { + let message = `${name}, 30 Days Of JavaScript'e hoş geldiniz!`; + return message; +} + +console.log(greetings()); +console.log(greetings("Asabeneh")); +``` + +### 💻 Egzersizler + +##### Egzersizler: Seviye 1 + +1. firstName ve lastName parametresi alan ve tam adı döndüren _fullName_ fonksiyonunu tanımlayın. +2. İki parametre alan ve toplamı döndüren _addNumbers_ fonksiyonunu tanımlayın. +3. Çember alanını hesaplayan _areaOfCircle_ fonksiyonunu yazın. +4. Celsius'u Fahrenheit'a çeviren _convertCelciusToFahrenheit_ fonksiyonunu yazın. +5. BMI hesaplayan ve kişinin durumunu belirleyen _bmi_ fonksiyonunu yazın. + +##### Egzersizler: Seviye 2 + +1. İkinci dereceden denklem çözen _solveQuadEquation_ fonksiyonunu yazın. +2. _printArray_ fonksiyonunu tanımlayın. +3. Tarih/saati belirli formatta gösteren _showDateTime_ fonksiyonunu yazın. + +##### Egzersizler: Seviye 3 + +1. Herhangi sayıda argüman alıp hex veya rgb renk üretebilen _generateColors_ fonksiyonunu yazın. +2. Bir dizinin ortalamasını hesaplayan _average_ fonksiyonunu yazın. + +### 9. Higher Order Function (Yüksek Dereceli Fonksiyon) + +Higher order function (Yüksek dereceli fonksiyon), başka bir fonksiyonu parametre olarak alan veya değer olarak fonksiyon döndüren fonksiyondur. Parametre olarak geçirilen fonksiyona callback (geri çağrım fonksiyonu) denir. + +#### Callback (Geri Çağrım Fonksiyonu) + +Callback, başka bir fonksiyona parametre olarak geçirilebilen bir fonksiyondur. + +```js +// callback fonksiyonu, fonksiyon herhangi bir isimde olabilir +const callback = (n) => { + return n ** 2; +}; + +// başka bir fonksiyonu callback olarak alan fonksiyon +function cube(callback, n) { + return callback(n) * n; +} + +console.log(cube(callback, 3)); +``` + +#### Fonksiyon döndürme + +Higher order function (Yüksek dereceli fonksiyon), değer olarak fonksiyon döndürür. + +```js +// başka bir fonksiyon döndüren higher order function (yüksek dereceli fonksiyon) +const higherOrder = (n) => { + const doSomething = (m) => { + const doWhatEver = (t) => { + return 2 * n + 3 * m + t; + }; + return doWhatEver; + }; + return doSomething; +}; +console.log(higherOrder(2)(3)(10)); +``` + +Callback fonksiyonlarını nerede kullandığımıza bakalım. Örneğin _forEach_ metodu callback kullanır: + +```js +const numbers = [1, 2, 3, 4]; +const sumArray = (arr) => { + let sum = 0; + const callback = function (element) { + sum += element; + }; + arr.forEach(callback); + return sum; +}; +console.log(sumArray(numbers)); +``` + +#### Zamanlama Fonksiyonları + +JavaScript'te belirli zaman aralıklarında bir aktivite çalıştırabilir veya bir süre sonra çalıştırmak üzere zamanlayabiliriz. + +- setInterval +- setTimeout + +##### setInterval + +setInterval, belirli bir zaman aralığında sürekli olarak bir aktivite yapmak için kullanılır. setInterval global metodu bir callback fonksiyonu ve süre (ms cinsinden) alır. + +```js +// sözdizimi +function callback() { + // kod buraya gelir +} +setInterval(callback, sure); +``` + +```js +function sayHello() { + console.log("Merhaba"); +} +setInterval(sayHello, 2000); // her 2 saniyede bir Merhaba yazdırır +``` + +##### setTimeout + +setTimeout, gelecekte bir anda bir işlemi yürütmek için kullanılır. + +```js +function sayHello() { + console.log("Merhaba"); +} +setTimeout(sayHello, 2000); // 2 saniye bekledikten sonra Merhaba yazdırır +``` + +### 10. Destructuring (Parçalama) ve Spread (Yayma) + +#### Destructuring (Parçalama) Nedir? + +Destructuring (Parçalama), dizileri ve nesneleri paketinden çıkarıp ayrı değişkenlere atama yöntemidir. Destructuring temiz ve okunabilir kod yazmamıza olanak tanır. + +#### Ne parçalayabiliriz? + +1. Diziler +2. Nesneler + +##### 1. Dizi Parçalama (Array Destructuring) + +```js +const numbers = [1, 2, 3]; +const [num1, num2, num3] = numbers; +console.log(num1, num2, num3); // 1, 2, 3 + +const countries = ["Finland", "Sweden", "Norway"]; +const [fin, swe, nor] = countries; +console.log(fin, swe, nor); // Finland, Sweden, Norway +``` + +Destructuring sırasında bir elemanı atlama: + +```js +const countries = ["Finland", "Sweden", "Iceland", "Norway", "Denmark"]; +const [fin, , ice, , den] = countries; +console.log(fin, ice, den); // Finland, Iceland, Denmark +``` + +Spread operatörü ile dizinin geri kalanını alma: + +```js +const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const [num1, num2, num3, ...rest] = nums; +console.log(num1, num2, num3, rest); //1, 2, 3, [4, 5, 6, 7, 8, 9, 10] +``` + +React Hook'larını kullanıyorsanız bunu zaten biliyorsunuzdur. useState hook'u ile kullanım: + +```js +const [count, setCount] = useState(0); +``` + +##### 2. Nesne Parçalama (Object Destructuring) + +Bir nesneyi parçaladığımızda değişken adı, nesnenin anahtarıyla ya da özelliğiyle birebir aynı olmalıdır. + +```js +const rectangle = { + width: 20, + height: 10, +}; + +let { width, height } = rectangle; +console.log(width, height); // 20, 10 +``` + +Yeniden adlandırma: + +```js +const rectangle = { + width: 20, + height: 10, +}; + +let { width: w, height: h } = rectangle; +``` + +#### Egzersizler + +getPersonInfo adında bir fonksiyon oluşturun. Bu fonksiyon bir nesne parametresi alır. + +#### Spread veya Rest Operatörü + +##### Spread operatörü ile dizi elemanlarını kopyalama + +```js +const evens = [0, 2, 4, 6, 8, 10]; +const evenNumbers = [...evens]; + +const odds = [1, 3, 5, 7, 9]; +const oddNumbers = [...odds]; + +const wholeNumbers = [...evens, ...odds]; + +console.log(evenNumbers); +console.log(oddNumbers); +console.log(wholeNumbers); +``` + +##### Spread operatörü ile nesne kopyalama + +```js +const user = { + name: "Asabeneh", + title: "Programmer", + country: "Finland", + city: "Helsinki", +}; + +const copiedUser = { ...user }; +console.log(copiedUser); +``` + +##### Ok fonksiyonuyla spread operatörü + +```js +const sumAllNums = (...args) => { + let sum = 0; + for (const num of args) { + sum += num; + } + return sum; +}; + +console.log(sumAllNums(1, 2, 3, 4, 5)); +``` + +### 11. Fonksiyonel Programlama (Functional Programming) + +_Fonksiyonel programlama_ (Functional programming), daha kısa ve temiz kod yazmanıza ve geleneksel yöntemlerle çözülmesi zor olabilecek karmaşık sorunları çözmenize olanak tanır. + +Ele alacağımız JS fonksiyonel programlama metotları: + +- forEach +- map +- filter +- reduce +- find +- findIndex +- some +- every + +#### 1. forEach + +Bir dizi elemanları üzerinde iterasyon yapmak istediğimizde forEach kullanırız. forEach bir higher order function (yüksek dereceli fonksiyon) olup callback alır. + +```js +const countries = ["Finland", "Estonia", "Sweden", "Norway"]; +countries.forEach((country, i) => console.log(i, country.toUpperCase())); +``` + +#### 2. map + +Bir diziyi değiştirmek istediğimizde map metodunu kullanırız. map her zaman bir dizi döndürür. + +```js +const countries = ["Finland", "Estonia", "Sweden", "Norway"]; +const newCountries = countries.map((country) => country.toUpperCase()); + +console.log(newCountries); // ["FINLAND", "ESTONIA", "SWEDEN", "NORWAY"] +``` + +#### 3. filter + +filter, bazı kriterlere göre elemanları filtreler ve filtrelenmiş elemanlardan oluşan bir dizi döndürür. + +```js +const countries = ["Finland", "Estonia", "Sweden", "Norway", "Iceland"]; +const countriesWithLand = countries.filter((country) => + country.includes("land"), +); +console.log(countriesWithLand); // ["Finland", "Iceland"] +``` + +#### 4. reduce + +reduce, bir dizi üzerinde kullanılır ve tek bir değer döndürür. Farklı meyveler blenderdan geçirilip meyve suyu elde edilmesi gibi düşünülebilir. + +```js +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const sum = numbers.reduce((acc, cur) => acc + cur); +console.log(sum); // 55 +``` + +#### 5. find + +Bir dizideki belirli bir elemanın ilk oluşumunu istiyorsak find metodunu kullanırız. find, dizi yerine yalnızca ilk oluşumu döndürür. + +```js +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const firstEvenNum = numbers.find((n) => n % 2 === 0); +const firstOddNum = numbers.find((n) => n % 2 !== 0); +console.log(firstEvenNum); // 0 +console.log(firstOddNum); // 1 +``` + +#### 6. findIndex + +findIndex, find gibi çalışır ama elemanın indeksini döndürür. + +```js +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const firstEvenIndex = numbers.findIndex((n) => n % 2 === 0); +const firstOddIndex = numbers.findIndex((n) => n % 2 !== 0); +console.log(firstEvenIndex); // 0 +console.log(firstOddIndex); // 1 +``` + +#### 7. some + +some metodu, dizi ile kullanılır ve boolean döndürür. Bir veya daha fazla eleman kriteri karşılıyorsa true, aksi takdirde false döndürür. + +```js +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const someAreEvens = numbers.some((n) => n % 2 === 0); +const someAreOdds = numbers.some((n) => n % 2 !== 0); +console.log(someAreEvens); // true +console.log(someAreOdds); // true +``` + +#### 8. every + +every metodu some'a benzer; ancak tüm elemanların kriteri karşılaması gerekir. + +```js +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const allAreEvens = numbers.every((n) => n % 2 === 0); +const allAreOdds = numbers.every((n) => n % 2 !== 0); + +console.log(allAreEvens); // false +console.log(allAreOdds); // false +``` + +#### Egzersizler + +```js +const products = [ + { product: "banana", price: 3 }, + { product: "mango", price: 6 }, + { product: "potato", price: " " }, + { product: "avocado", price: 8 }, + { product: "coffee", price: 10 }, + { product: "tea", price: "" }, +]; +``` + +1. Her ürünün fiyatını forEach kullanarak yazdırın +2. Aşağıdaki formatta ürün kalemlerini yazdırın (forEach ile) +3. Tüm fiyatların toplamını forEach kullanarak hesaplayın +4. map kullanarak fiyatlardan oluşan bir dizi oluşturun +5. Fiyatı olan ürünleri filtreleyin +6. Fiyatların toplamını almak için metot zincirleme kullanın (map, filter, reduce) +7. forEach, map, filter ve reduce arasındaki farkı açıklayın + +### 12. Class (Sınıf) + +JavaScript nesne yönelimli bir programlama dilidir. JavaScript'teki her şey özellikleri ve metotları olan bir nesnedir. Class, nesne oluşturmak için bir constructor (kurucu) veya nesne için bir "şablon"dur. + +#### Class Tanımlama + +JavaScript'te class tanımlamak için _class_ anahtar kelimesi, **CamelCase** olarak class adı ve blok kod (iki süslü parantez) gerekir. + +```js +class Person { + // kod buraya gelir +} +``` + +#### Class Örnekleme (Instantiation) + +Bir class'tan nesne oluşturmak için _new_ anahtar kelimesini kullanır ve ardından class adını yazarız. + +```js +class Person { + // kod buraya gelir +} +const person = new Person(); +console.log(person); +``` + +#### Class Constructor (Kurucu) + +Constructor, nesnemiz için bir şablon oluşturmamıza olanak tanıyan yerleşik bir fonksiyondur. _this_ anahtar kelimesini, constructor parametrelerini class'a bağlamak için kullanırız. + +```js +class Person { + constructor(firstName, lastName) { + this.firstName = firstName; + this.lastName = lastName; + } +} + +const person1 = new Person("Asabeneh", "Yetayeh"); +console.log(person1); +``` + +#### Constructor ile varsayılan değerler + +Constructor fonksiyonu özellikleri, diğer normal fonksiyonlar gibi varsayılan değere sahip olabilir. + +```js +class Person { + constructor( + firstName = "Asabeneh", + lastName = "Yetayeh", + age = 250, + country = "Finland", + city = "Helsinki", + ) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.country = country; + this.city = city; + } +} +``` + +#### Class Metotları + +```js +class Person { + constructor(firstName, lastName, age, country, city) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.country = country; + this.city = city; + } + getFullName() { + const fullName = this.firstName + " " + this.lastName; + return fullName; + } +} + +const person1 = new Person("Asabeneh", "Yetayeh", 250, "Finland", "Helsinki"); +console.log(person1.getFullName()); +``` + +#### Başlangıç değerli özellikler + +Bir class oluştururken bazı özelliklerin başlangıç değeri olabilir. + +```js +class Person { + constructor(firstName, lastName, age, country, city) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.country = country; + this.city = city; + this.score = 0; + this.skills = []; + } +} +``` + +#### getter + +get metodu, nesneden değer okumamıza olanak tanır. Özelliklere doğrudan erişmek yerine getter kullanırız. + +```js +class Person { + constructor(firstName, lastName, age, country, city) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.country = country; + this.city = city; + this.score = 0; + this.skills = []; + } + get getScore() { + return this.score; + } + get getSkills() { + return this.skills; + } +} + +const person1 = new Person("Asabeneh", "Yetayeh", 250, "Finland", "Helsinki"); +console.log(person1.getScore); // getter metodunu çağırmak için parantez gerekmez +console.log(person1.getSkills); +``` + +#### setter + +setter metodu, belirli özelliklerin değerini değiştirmemize olanak tanır. + +```js +class Person { + // ... constructor ve diğer metotlar ... + set setScore(score) { + this.score += score; + } + set setSkill(skill) { + this.skills.push(skill); + } +} + +person1.setScore = 1; +person1.setSkill = "HTML"; +``` + +#### Static metot + +static anahtar kelimesi, bir class için statik metot tanımlar. Statik metotlar class örnekleri üzerinde çağrılmaz; class'ın kendisi üzerinde çağrılır. + +```js +class Person { + // ... + static favoriteSkill() { + const skills = ["HTML", "CSS", "JS", "React", "Python", "Node"]; + const index = Math.floor(Math.random() * skills.length); + return skills[index]; + } + static showDateTime() { + let now = new Date(); + let year = now.getFullYear(); + let month = now.getMonth() + 1; + let date = now.getDate(); + let hours = now.getHours(); + let minutes = now.getMinutes(); + if (hours < 10) { + hours = "0" + hours; + } + if (minutes < 10) { + minutes = "0" + minutes; + } + let dateMonthYear = date + "." + month + "." + year; + let time = hours + ":" + minutes; + let fullTime = dateMonthYear + " " + time; + return fullTime; + } +} + +console.log(Person.favoriteSkill()); +console.log(Person.showDateTime()); +``` + +#### Inheritance (Kalıtım) + +Inheritance (Kalıtım) kullanarak üst class'ın tüm özelliklerine ve metotlarına erişebiliriz. Bu, kod tekrarını azaltır. + +```js +class Student extends Person { + saySomething() { + console.log("Ben Person class'ının bir çocuğuyum"); + } +} + +const s1 = new Student("Asabeneh", "Yetayeh", "Finland", 250, "Helsinki"); +console.log(s1); +console.log(s1.saySomething()); +console.log(s1.getFullName()); +``` + +#### Metot Override (Geçersiz Kılma) + +Üst class'tan tüm metotlara erişebildiğimizi gördük. Üst metotları özelleştirebilir, child class'a ek özellikler ekleyebiliriz. super() fonksiyonu, üst class'ın tüm özelliklerine erişmek için kullanılır. + +```js +class Student extends Person { + constructor(firstName, lastName, age, country, city, gender) { + super(firstName, lastName, age, country, city); + this.gender = gender; + } + + saySomething() { + console.log("Ben Person class'ının bir çocuğuyum"); + } + getPersonInfo() { + let fullName = this.getFullName(); + let pronoun = this.gender == "Male" ? "O" : "O"; + let info = `${fullName} ${this.age} yaşında. ${pronoun} ${this.city}'de yaşıyor, ${this.country}.`; + return info; + } +} +``` + +#### Egzersizler + +##### Egzersizler Seviye 1 + +1. name, age, color, legs özelliklerine sahip ve farklı metotlar içeren Animal (Hayvan) class'ı oluşturun. +2. Animal class'ından Dog (Köpek) ve Cat (Kedi) child class'ları oluşturun. + +##### Egzersizler Seviye 2 + +1. Animal class'ında oluşturduğunuz metodu override edin. + +##### Egzersizler Seviye 3 + +1. Merkezi eğilim ölçüsünü (ortalama, medyan, mod) hesaplayan Statistics class'ı oluşturun. + +### 13. Document Object Model (DOM) + +HTML belgesi bir JavaScript Object (Nesne) olarak yapılandırılmıştır. Her HTML elementinin onu manipüle etmemize yardımcı olabilecek farklı özellikleri vardır. + +React söz konusu olduğunda DOM'u doğrudan manipüle etmeyiz; bunun yerine React Virtual DOM (Sanal DOM) gerekli tüm değişiklikleri yapar. + +Bu nedenle React kullanıyorsanız DOM'u doğrudan manipüle etmeyin. DOM'a doğrudan dokunduğumuz tek yer index.html'dir. React tek sayfalı bir uygulamadır çünkü tüm component'ler (bileşenler) index.html sayfasında render edilir ve React Uygulamasının tamamında başka bir HTML olmayacaktır. + +```html + + + + + + React App + + + +
+ + + + +``` + +Sonucu [codepen](https://codepen.io/Asabeneh/full/vYGqQxP)'de inceleyin. + +🌕 Harikasınız! Gün 1 meydan okumasını tamamladınız ve büyüklüğe giden yoldasınız. Artık bir JavaScript Ninja'sınız ve React'a dalmaya hazırsınız. + +🎉 TEBRİKLER! 🎉 + +[<< Gün 0](../readMe.md) | [Gün 2 >>](../02_Gun_Reacta_Giris/02_reacta_giris.md) diff --git a/Turkish/03_Gun_Kurulum/03_kurulum.md b/Turkish/03_Gun_Kurulum/03_kurulum.md index 057ad99..33a81e2 100644 --- a/Turkish/03_Gun_Kurulum/03_kurulum.md +++ b/Turkish/03_Gun_Kurulum/03_kurulum.md @@ -7,9 +7,9 @@ Twitter Follow -Author: +Yazar: Asabeneh Yetayeh
- October, 2020 + Ekim, 2020
@@ -68,17 +68,17 @@ React'ta modüllere veya paketlere erişmek için link kullanmayız; bunun yerin ```js // math.js -export const addTwo = (a, b) => a + b -export const multiply = (a, b) => a * b -export const subtract = (a, b) => a - b +export const addTwo = (a, b) => a + b; +export const multiply = (a, b) => a * b; +export const subtract = (a, b) => a - b; export default (function doSomeMath() { return { addTwo, multiply, subtract, - } -})() + }; +})(); ``` Şimdi _math.js_ modüllerini farklı bir dosyaya içe aktaralım: @@ -86,16 +86,16 @@ export default (function doSomeMath() { ```js // index.js // doSomeMath'i math.js dosyasından uzantıyla veya uzantısız içe aktarmak için -import doSomeMath from './math.js' +import doSomeMath from "./math.js"; // diğer modülleri içe aktarmak için // bu modüller varsayılan olarak dışa aktarılmadığından destructuring kullanmamız gerekiyor -import { addTwo, multiply, subtract } from './math.js' +import { addTwo, multiply, subtract } from "./math.js"; -import * as everything from './math.js' // geri kalan her şeyi içe aktarmak için -console.log(addTwo(5, 5)) -console.log(doSomeMath.addTwo(5, 5)) -console.log(everything) +import * as everything from "./math.js"; // geri kalan her şeyi içe aktarmak için +console.log(addTwo(5, 5)); +console.log(doSomeMath.addTwo(5, 5)); +console.log(everything); ``` Bundan sonra _import React from 'react'_ veya _import ReactDOM from 'react-dom'_ gördüğünüzde şaşırmayacaksınız. @@ -188,7 +188,6 @@ Bu klasörleri ve dosyaları bilmek faydalıdır. - node_modules - React uygulamasının tüm gerekli node paketlerini saklar. - Public - - index.html - uygulamanın tamamında sahip olduğumuz tek HTML dosyası - favicon.ico - bir simge dosyası @@ -197,7 +196,6 @@ Bu klasörleri ve dosyaları bilmek faydalıdır. - robots.txt - web sitesinin web kazımasına izin verip vermediğine dair bilgi - src - - App.css, index.css - farklı CSS dosyaları - index.js - tüm bileşenleri index.html ile bağlamaya yarayan dosya - App.js - genellikle sunum bileşenlerinin çoğunu içe aktardığımız dosya @@ -223,13 +221,13 @@ Dosyaların büyük bölümünü kaldırdıktan sonra şablonun yapısı şöyle //index.js // react ve react-dom paketlerini içe aktarma -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; -const jsxElement =

This is a JSX element

-const rootElement = document.getElementById('root') +const jsxElement =

This is a JSX element

; +const rootElement = document.getElementById("root"); -ReactDOM.render(jsxElement, rootElement) +ReactDOM.render(jsxElement, rootElement); ``` ```html @@ -270,7 +268,7 @@ Herhangi bir hata yoksa React uygulamanız tarayıcıda başlatılacaktır. Daha fazla JSX elemanı yazalım ve bunları tarayıcıda render edelim. Bu ifade, h2 HTML elemanından oluşan bir JSX elemanıdır. ```js -const title =

Getting Started React

+const title =

Getting Started React

; ``` Önceki JSX'e daha fazla içerik ekleyelim ve adını header olarak değiştirelim. @@ -282,7 +280,7 @@ const header = (

Getting Started React

JavaScript Library

-) +); ``` Bunu tarayıcıda render etmek için ReactDOM'a ihtiyacımız var. @@ -291,8 +289,8 @@ Bunu tarayıcıda render etmek için ReactDOM'a ihtiyacımız var. //index.js // react ve react-dom paketlerini içe aktarma -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const header = (
@@ -302,10 +300,10 @@ const header = (

Asabeneh Yetayeh

Oct 2, 2020
-) -const rootElement = document.getElementById('root') +); +const rootElement = document.getElementById("root"); -ReactDOM.render(header, rootElement) +ReactDOM.render(header, rootElement); ``` ![JSX using create react app](../../images/rendering_more_jsx_content_create_react_app.png) @@ -315,8 +313,8 @@ ReactDOM.render(header, rootElement) ```js //index.js // react ve react-dom paketlerini içe aktarma -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // JSX element, header const header = ( @@ -327,7 +325,7 @@ const header = (

Asabeneh Yetayeh

Oct 2, 2020 -) +); // JSX element, main const main = ( @@ -339,14 +337,14 @@ const main = (
  • JavaScript
  • -) +); // JSX element, footer const footer = ( -) +); // JSX element, app, a container or a parent const app = ( @@ -355,12 +353,12 @@ const app = ( {main} {footer} -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz // ReactDOM'un render metodu iki argüman alır -ReactDOM.render(app, rootElement) +ReactDOM.render(app, rootElement); // ya da // ReactDOM.render([header, main, footer], rootElement) ``` @@ -373,20 +371,20 @@ JSX elemanlarına stil uygulayalım. JSX'i satır içi, dahili veya harici CSS s ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const headerStyles = { - backgroundColor: '#61DBFB', - fontFamily: 'Helvetica Neue', + backgroundColor: "#61DBFB", + fontFamily: "Helvetica Neue", padding: 25, lineHeight: 1.5, -} +}; // JSX element, header const header = (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -394,12 +392,12 @@ const header = ( Oct 2, 2020
    -) +); // JSX element, main const mainStyles = { - backgroundColor: '#F3F0F5', -} + backgroundColor: "#F3F0F5", +}; const main = (

    Prerequisite to get started react.js:

    @@ -409,30 +407,30 @@ const main = (
  • JavaScript
  • -) +); const footerStyles = { - backgroundColor: '#61DBFB', -} + backgroundColor: "#61DBFB", +}; // JSX element, footer const footer = ( -) +); // JSX element, app const app = ( -
    +
    {header} {main} {footer}
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(app, rootElement) +ReactDOM.render(app, rootElement); ``` ![Inline styling JSX](../../images/styling_jsx_inline_create_react_app.png) @@ -441,12 +439,12 @@ ReactDOM.render(app, rootElement) ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // JSX element, header const header = (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -454,14 +452,14 @@ const header = ( Date: Oct 1, 2020
    -) +); // JSX element, main const main = (
    -
    +

    - Prerequisite to get started{' '} + Prerequisite to get started{" "} react.js @@ -474,29 +472,29 @@ const main = (

    -) +); // JSX element, footer const footer = (
    -
    +

    Copyright 2020

    -) +); // JSX element, app const app = ( -
    +
    {header} {main} {footer}
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(app, rootElement) +ReactDOM.render(app, rootElement); ``` ![Inline styling JSX](../../images/js_internal_style_create_react_app.png) @@ -505,24 +503,24 @@ ReactDOM.render(app, rootElement) ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // HTML belgesinden kök elemanı almak için // JSX element, header -const welcome = 'Welcome to 30 Days Of React' -const title = 'Getting Started React' -const subtitle = 'JavaScript Library' +const welcome = "Welcome to 30 Days Of React"; +const title = "Getting Started React"; +const subtitle = "JavaScript Library"; const author = { - firstName: 'Asabeneh', - lastName: 'Yetayeh', -} -const date = 'Oct 2, 2020' + firstName: "Asabeneh", + lastName: "Yetayeh", +}; +const date = "Oct 2, 2020"; // JSX element, header const header = (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -532,37 +530,37 @@ const header = ( Date: {date}
    -) +); -const numOne = 3 -const numTwo = 2 +const numOne = 3; +const numTwo = 2; const result = (

    {numOne} + {numTwo} = {numOne + numTwo}

    -) +); -const yearBorn = 1820 -const currentYear = new Date().getFullYear() -const age = currentYear - yearBorn +const yearBorn = 1820; +const currentYear = new Date().getFullYear(); +const age = currentYear - yearBorn; const personAge = (

    - {' '} + {" "} {author.firstName} {author.lastName} is {age} years old

    -) +); // JSX element, main -const techs = ['HTML', 'CSS', 'JavaScript'] -const techsFormatted = techs.map((tech) =>
  • {tech}
  • ) +const techs = ["HTML", "CSS", "JavaScript"]; +const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); // JSX element, main const main = (
    -
    +

    - Prerequisite to get started{' '} + Prerequisite to get started{" "} react.js @@ -573,31 +571,31 @@ const main = ( {personAge}

    -) +); -const copyRight = 'Copyright 2020' +const copyRight = "Copyright 2020"; // JSX element, footer const footer = (
    -
    +

    {copyRight}

    -) +); // JSX element, app const app = ( -
    +
    {header} {main} {footer}
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(app, rootElement) +ReactDOM.render(app, rootElement); ``` ![Inline styling JSX](../../images/inecting_data_to_jsx_create_react_app.png) @@ -609,19 +607,19 @@ src klasörü içinde images adında bir klasör oluşturun ve içine bir görse ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' -import asabenehImage from './images/asabeneh.jpg' +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images/asabeneh.jpg"; const user = (
    - asabeneh image + asabeneh image
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(user, rootElement) +ReactDOM.render(user, rootElement); ``` ![Rendering image](../../images/rendering_image.png) @@ -630,24 +628,24 @@ user'ı ana JSX elemanının içine enjekte edip sonucu görelim: ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // HTML belgesinden kök elemanı almak için -import asabenehImage from './images/asabeneh.jpg' +import asabenehImage from "./images/asabeneh.jpg"; // JSX element, header -const welcome = 'Welcome to 30 Days Of React' -const title = 'Getting Started React' -const subtitle = 'JavaScript Library' +const welcome = "Welcome to 30 Days Of React"; +const title = "Getting Started React"; +const subtitle = "JavaScript Library"; const author = { - firstName: 'Asabeneh', - lastName: 'Yetayeh', -} -const date = 'Oct 2, 2020' + firstName: "Asabeneh", + lastName: "Yetayeh", +}; +const date = "Oct 2, 2020"; // JSX element, header const header = (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -657,43 +655,43 @@ const header = ( Date: {date}
    -) +); -const numOne = 3 -const numTwo = 2 +const numOne = 3; +const numTwo = 2; const result = (

    {numOne} + {numTwo} = {numOne + numTwo}

    -) +); -const yearBorn = 1820 -const currentYear = new Date().getFullYear() -const age = currentYear - yearBorn +const yearBorn = 1820; +const currentYear = new Date().getFullYear(); +const age = currentYear - yearBorn; const personAge = (

    - {' '} + {" "} {author.firstName} {author.lastName} is {age} years old

    -) +); // JSX element, main -const techs = ['HTML', 'CSS', 'JavaScript'] -const techsFormatted = techs.map((tech) =>
  • {tech}
  • ) +const techs = ["HTML", "CSS", "JavaScript"]; +const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); const user = (
    - asabeneh image + asabeneh image
    -) +); // JSX element, main const main = (
    -
    +

    - Prerequisite to get started{' '} + Prerequisite to get started{" "} react.js @@ -705,31 +703,31 @@ const main = ( {user}

    -) +); -const copyRight = 'Copyright 2020' +const copyRight = "Copyright 2020"; // JSX element, footer const footer = (
    -
    +

    {copyRight}

    -) +); // JSX element, app const app = ( -
    +
    {header} {main} {footer}
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elemanını ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(app, rootElement) +ReactDOM.render(app, rootElement); ``` ![All JSX together final](../../images/all_jsx_final.png) diff --git a/Turkish/04_Gun_Bilesenler/04_bilesenler.md b/Turkish/04_Gun_Bilesenler/04_bilesenler.md index 7021505..867d402 100644 --- a/Turkish/04_Gun_Bilesenler/04_bilesenler.md +++ b/Turkish/04_Gun_Bilesenler/04_bilesenler.md @@ -7,9 +7,9 @@ Twitter Follow -Author: +Yazar: Asabeneh Yetayeh
    - October, 2020 + Ekim, 2020
    @@ -60,14 +60,14 @@ Bir JavaScript fonksiyonu ya klasik fonksiyon ya da ok fonksiyonu (arrow functio ```js const getUserInfo = (firstName, lastName, country, title, skills) => { return `${firstName} ${lastName}, a ${title} developer based in ${country}. He knows ${skills.join( - ' ' - )} ` -} + " ", + )} `; +}; // Bu fonksiyonu çağırırken parametrelere ihtiyacımız var -const skills = ['HTML', 'CSS', 'JS', 'React'] +const skills = ["HTML", "CSS", "JS", "React"]; console.log( - getUserInfo('Asabeneh', 'Yetayeh', 'Finland', 'FullStack Developer', skills) -) + getUserInfo("Asabeneh", "Yetayeh", "Finland", "FullStack Developer", skills), +); ``` ## JavaScript Class @@ -78,45 +78,45 @@ Bir class, bir nesnenin taslağıdır. Farklı nesneler oluşturmak için bir cl class Parent { constructor(firstName, lastName, country, title) { // this anahtar kelimesiyle parametreleri bu class nesnesine bağlıyoruz - this.firstName = firstName - this.lastName = lastName - this.country = country - this.title = title + this.firstName = firstName; + this.lastName = lastName; + this.country = country; + this.title = title; } getPersonInfo() { - return `${this.firstName} ${this.lastName}, a ${this.title} developer base in ${this.country} ` + return `${this.firstName} ${this.lastName}, a ${this.title} developer base in ${this.country} `; } parentMethod() { // kod buraya gelir } } -const p1 = new Parent('Asabeneh', 'Yetayeh', 'Finland', 'FullStack Developer') +const p1 = new Parent("Asabeneh", "Yetayeh", "Finland", "FullStack Developer"); class Child extends Parent { constructor(firstName, lastName, country, title, skills) { - super(firstName, lastName, country, title) - this.skills = skills + super(firstName, lastName, country, title); + this.skills = skills; // alt sınıf parametrelerini this anahtar kelimesiyle bu alt sınıf nesnesine bağlıyoruz } getSkills() { - let len = this.skills.length - return len > 0 ? this.skills.join(' ') : 'No skills found' + let len = this.skills.length; + return len > 0 ? this.skills.join(" ") : "No skills found"; } childMethod() { // kod buraya gelir } } -const skills = ['HTML', 'CSS', 'JS', 'React'] +const skills = ["HTML", "CSS", "JS", "React"]; const child = new Child( - 'Asabeneh', - 'Yetayeh', - 'Finland', - 'FullStack Developer', - skills -) + "Asabeneh", + "Yetayeh", + "Finland", + "FullStack Developer", + skills, +); ``` Fonksiyonu ve class'ı kısaca ele aldık. React bileşeni JavaScript fonksiyonlarından veya class'larından oluşur; o hâlde şimdi bir React bileşeni yapalım. @@ -130,10 +130,10 @@ Bir JavaScript fonksiyonu kullanarak işlevsel (functional) bir React bileşeni ```js // React bileşen sözdizimi // ok fonksiyonu, fonksiyon bildirimi veya fonksiyon ifadesi olabilir -const jsx = Content +const jsx = Content ; const ComponentName = () => { - return jsx -} + return jsx; +}; ``` Aşağıdaki ifade bir JSX elementidir. @@ -142,7 +142,7 @@ Aşağıdaki ifade bir JSX elementidir. // JSX elementi, header const header = (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -150,19 +150,19 @@ const header = ( Oct 3, 2020
    -) +); // React Component const Header = () => { - return header -} + return header; +}; // ya da doğrudan JSX döndürebiliriz const Header = () => { return (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -170,14 +170,14 @@ const Header = () => { Oct 3, 2020
    - ) -} + ); +}; // Yukarıdaki kod şu şekilde de yazılabilir // JSX açıkça döndürülüyor const Header = () => (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -185,7 +185,7 @@ const Header = () => ( Oct 3, 2020
    -) +); ``` ### Bileşenleri Render Etme @@ -196,13 +196,13 @@ const Header = () => ( ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Component const Header = () => (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -210,25 +210,25 @@ const Header = () => ( Oct 3, 2020
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // JSX elementini ReactDOM paketiyle render ediyoruz -ReactDOM.render(
    , rootElement) +ReactDOM.render(
    , rootElement); ``` Şimdi Header, Main ve Footer bileşenlerini sarmalayacak bir App bileşeni oluşturalım. Ardından App bileşeni DOM'a render edilecek. ```js // index.js -import React from 'react' -import ReactDOM from 'react-dom' -import asabenehImage from './images/asabeneh.jpg' +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images/asabeneh.jpg"; // Header Component const Header = () => (
    -
    +

    Welcome to 30 Days Of React

    Getting Started React

    JavaScript Library

    @@ -236,27 +236,27 @@ const Header = () => ( Oct 3, 2020
    -) +); // User Card Component const UserCard = () => ( -
    - asabeneh image +
    + asabeneh image

    Asabeneh Yetayeh

    -) +); // TechList Component const TechList = () => { - const techs = ['HTML', 'CSS', 'JavaScript'] - const techsFormatted = techs.map((tech) =>
  • {tech}
  • ) - return techsFormatted -} + const techs = ["HTML", "CSS", "JavaScript"]; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; +}; // Main Component const Main = () => (
    -
    +

    Prerequisite to get started react.js:

      @@ -264,29 +264,29 @@ const Main = () => (
    -) +); // Footer Component const Footer = () => (
    -
    +

    Copyright 2020

    -) +); // App, yani üst veya kapsayıcı bileşen const App = () => ( -
    +
    -) +); -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // App bileşenini ReactDOM paketiyle render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` ![Rendering Components](../../images/rendering_componnets.png) @@ -298,21 +298,21 @@ ReactDOM.render(, rootElement) Bu bölümde yalnızca string ekliyoruz. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; -const welcome = 'Welcome to 30 Days Of React' -const title = 'Getting Started React' -const subtitle = 'JavaScript Library' -const firstName = 'Asabeneh' -const lastName = 'Yetayeh' -const date = 'Oct 3, 2020' +const welcome = "Welcome to 30 Days Of React"; +const title = "Getting Started React"; +const subtitle = "JavaScript Library"; +const firstName = "Asabeneh"; +const lastName = "Yetayeh"; +const date = "Oct 3, 2020"; // JSX elementi, header const header = () => { return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -322,32 +322,32 @@ const header = () => { Date: {date}
    - ) -} -const rootElement = document.getElementById('root') + ); +}; +const rootElement = document.getElementById("root"); // App bileşenini ReactDOM paketiyle render ediyoruz -ReactDOM.render(
    , rootElement) +ReactDOM.render(
    , rootElement); ``` Header bileşenine benzer şekilde Main ve Footer bileşenlerine de uygulayabiliriz. ```js // HTML belgesinden kök elementi alıyoruz -const rootElement = document.querySelector('.root') +const rootElement = document.querySelector(".root"); // JSX elementi, header -const welcome = 'Welcome to 30 Days Of React Challenge' -const title = 'Getting Started React' -const subtitle = 'JavaScript Library' +const welcome = "Welcome to 30 Days Of React Challenge"; +const title = "Getting Started React"; +const subtitle = "JavaScript Library"; const author = { - firstName: 'Asabeneh', - lastName: 'Yetayeh', -} -const date = 'Oct 2, 2020' + firstName: "Asabeneh", + lastName: "Yetayeh", +}; +const date = "Oct 2, 2020"; // JSX elementi, header const Header = () => (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -357,48 +357,48 @@ const Header = () => ( Date: {date}
    -) +); -const numOne = 3 -const numTwo = 2 +const numOne = 3; +const numTwo = 2; const result = (

    {numOne} + {numTwo} = {numOne + numTwo}

    -) +); -const yearBorn = 1820 -const currentYear = 2020 -const age = currentYear - yearBorn +const yearBorn = 1820; +const currentYear = 2020; +const age = currentYear - yearBorn; const personAge = (

    - {' '} + {" "} {author.firstName} {author.lastName} is {age} years old

    -) +); // User Card Component const UserCard = () => ( -
    - asabeneh image +
    + asabeneh image

    {author.firstName} {author.lastName}

    -) +); // JSX elementi, main -const techs = ['HTML', 'CSS', 'JavaScript'] -const techsFormatted = techs.map((tech) =>
  • {tech}
  • ) +const techs = ["HTML", "CSS", "JavaScript"]; +const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); // JSX elementi, main const Main = () => (
    -
    +

    - Prerequisite to get started{' '} + Prerequisite to get started{" "} react.js @@ -411,30 +411,30 @@ const Main = () => (

    -) +); -const copyRight = '2020' +const copyRight = "2020"; // JSX elementi, footer const Footer = () => (
    -
    +

    Copyright ©{copyRight}

    -) +); // JSX elementi, app const app = () => ( -
    +
    -) +); // App bileşenini ReactDOM paketiyle render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` ### Functional Component'lere Daha Fazla Bakış @@ -442,7 +442,7 @@ ReactDOM.render(, rootElement) 2. Gün'deki tüm JSX elementlerini Functional Component'lere dönüştürdük; artık bileşenlere oldukça aşinasınız. Daha fazla bileşen oluşturalım. Bir bileşenin en küçük boyutu nedir? Yalnızca tek bir HTML öğesi döndüren JSX, küçük bileşen olarak kabul edilir. Örneğin bir buton bileşeni, bir uyarı kutusu bileşeni ya da yalnızca bir giriş alanı bileşeni. ```js -const Button = () => +const Button = () => ; ``` _Button_ bileşeni tek bir HTML buton öğesinden oluşmaktadır. @@ -450,36 +450,36 @@ Bu butonu JavaScript stil nesnesi kullanarak biçimlendirelim. Bir JavaScript CS ```js const buttonStyles = { - padding: '10px 20px', - background: 'rgb(0, 255, 0', - border: 'none', + padding: "10px 20px", + background: "rgb(0, 255, 0", + border: "none", borderRadius: 5, -} -const Button = () => +}; +const Button = () => ; ``` Button bileşeni hiçbir parametre almadığı ve aksiyon metnini dinamik olarak değiştiremediğimiz için aptal bir bileşendir (dumb component). Değerin dinamik olarak değişebilmesi için butona props geçmemiz gerekir. Props konusunu bir sonraki bölümde inceleyeceğiz. Bugünkü dersi kapatmadan önce rastgele bir onaltılık (hexadecimal) renk sayısı görüntüleyen daha işlevsel bir bileşen daha yapalım. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Onaltılık renk üreteci const hexaColor = () => { - let str = '0123456789abcdef' - let color = '' + let str = "0123456789abcdef"; + let color = ""; for (let i = 0; i < 6; i++) { - let index = Math.floor(Math.random() * str.length) - color += str[index] + let index = Math.floor(Math.random() * str.length); + color += str[index]; } - return '#' + color -} + return "#" + color; +}; -const HexaColor = () =>
    {hexaColor()}
    +const HexaColor = () =>
    {hexaColor()}
    ; -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); // App bileşenini ReactDOM paketiyle render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` # Egzersizler: Bileşenler diff --git a/Turkish/05_Gun_Props/05_props.md b/Turkish/05_Gun_Props/05_props.md index a58608e..d9ac67b 100644 --- a/Turkish/05_Gun_Props/05_props.md +++ b/Turkish/05_Gun_Props/05_props.md @@ -7,14 +7,14 @@ Twitter Follow -Author: +Yazar: Asabeneh Yetayeh
    - October, 2020 + Ekim, 2020
    -[<< Gün 4](../04_Gun_Bilesenler/04_bilesenler.md) | [Gün 6 >>](../../06_Day_Map_List_Keys/06_map_list_keys.md) +[<< Gün 4](../04_Gun_Bilesenler/04_bilesenler.md) | [Gün 6 >>](../06_Gun_Dizi_Haritalama/06_dizi_haritalama.md) ![30 Days of React banner](../../images/30_days_of_react_banner_day_5.jpg) @@ -81,19 +81,19 @@ const User = (props) => { Bir önceki bölümde verileri şu şekilde enjekte etmiştik; bugün bu verileri props'a dönüştüreceğiz. ```js -const welcome = 'Welcome to 30 Days Of React' -const title = 'Getting Started React' -const subtitle = 'JavaScript Library' +const welcome = "Welcome to 30 Days Of React"; +const title = "Getting Started React"; +const subtitle = "JavaScript Library"; const author = { - firstName: 'Asabeneh', - lastName: 'Yetayeh', -} -const date = 'Oct 4, 2020' + firstName: "Asabeneh", + lastName: "Yetayeh", +}; +const date = "Oct 4, 2020"; // Header Bileşeni const Header = () => (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -103,7 +103,7 @@ const Header = () => ( {date}
    -) +); ``` Veri enjekte etmek yerine verileri props olarak da geçirebiliriz. React props'ları, fonksiyonlardaki parametrelere benzer. @@ -113,15 +113,15 @@ Veri enjekte etmek yerine verileri props olarak da geçirebiliriz. React props'l React props'ı, bir React component'i oluşturduğunuzda anında elde ettiğiniz bir nesnedir. Component'e özellik geçirmeden önce props nesnesinde ne elde ettiğimize bakalım. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Bileşeni const Header = (props) => { - console.log(props) // boş nesne, {} + console.log(props); // boş nesne, {} return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -131,22 +131,22 @@ const Header = (props) => { {date}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { return ( -
    +
    - ) -} + ); +}; -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` Yukarıdaki console.log(props) ifadesinde boş bir nesne ({}) görürsünüz. Bu şu anlama gelir: component'i oluştururken herhangi bir özellik ya da nitelik geçirmezseniz props boş olacaktır; geçirirseniz, geçirdiğiniz verilerle doldurulacak ve bu niteliklerin doğru adı props olacaktır. @@ -154,41 +154,41 @@ Yukarıdaki console.log(props) ifadesinde boş bir nesne ({}) görürsünüz. Bu Basit bir örnekle başlayalım. Aşağıdaki örnekte, Header component'ine props olarak welcome dizesi geçirilmiştir. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Bileşeni const Header = (props) => { - console.log(props) // {welcome:'Welcome to 30 Days Of React'} + console.log(props); // {welcome:'Welcome to 30 Days Of React'} return (
    -
    +

    {props.welcome}

    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { return ( -
    -
    +
    +
    - ) -} + ); +}; -const rootElement = document.getElementById('root') +const rootElement = document.getElementById("root"); -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` Artık console.log(props) yaptığınızda şu nesneyi görmelisiniz; bu, Header component'ine geçirdiğimiz welcome özelliğinin props nesnesinin içinde bulunduğu anlamına gelir. ```js { - welcome: 'Welcome to 30 Days Of React' + welcome: "Welcome to 30 Days Of React"; } ``` @@ -201,15 +201,15 @@ Yukarıdaki koddan görüleceği üzere Header component'ine yalnızca tek bir p Component'e nitelik olarak geçirilen props'ın veri türü string'dir. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Bileşeni const Header = (props) => { - console.log(props) + console.log(props); return (
    -
    +

    {props.welcome}

    {props.title}

    {props.subtitle}

    @@ -219,26 +219,26 @@ const Header = (props) => { {props.date}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => ( -
    +
    -) +); -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Tarayıcı konsolunu kontrol ederseniz şu nesneyi görürsünüz: @@ -259,13 +259,13 @@ Artık bir JavaScript ustası olduğunuza göre bu nesneyle ne yapacağınızı Yukarıdaki örnekte görüldüğü gibi props değerleri statik olarak yazılmıştır. Ancak bir mantık uygulamak istediğimizde statik verilerle bunu yapmak güçleşir; bu nedenle değişkenleri props olarak kullanmak daha iyi olacaktır. Şu örneğe bakalım: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Bileşeni const Header = (props) => (
    -
    +

    {props.welcome}

    {props.title}

    {props.subtitle}

    @@ -275,20 +275,20 @@ const Header = (props) => ( {props.date}
    -) +); // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { - const welcome = 'Welcome to 30 Days Of React' - const title = 'Getting Started React' - const subtitle = 'JavaScript Library' - const firstName = 'Asabeneh' - const lastName = 'Yetayeh' - const date = 'Oct 4, 2020' + const welcome = "Welcome to 30 Days Of React"; + const title = "Getting Started React"; + const subtitle = "JavaScript Library"; + const firstName = "Asabeneh"; + const lastName = "Yetayeh"; + const date = "Oct 4, 2020"; return ( -
    +
    { date={date} />
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` ### Number Props Türü @@ -309,32 +309,32 @@ ReactDOM.render(, rootElement) Bir component'e sayısal props kullanalım. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; -const Age = (props) =>
    The person is {props.age} years old.
    +const Age = (props) =>
    The person is {props.age} years old.
    ; const Weight = (props) => (

    The weight of the object on earth is {props.weight} N.

    -) +); // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { - let currentYear = 2020 - let birthYear = 1820 - const age = currentYear - birthYear - const gravity = 9.81 - const mass = 75 + let currentYear = 2020; + let birthYear = 1820; + const age = currentYear - birthYear; + const gravity = 9.81; + const mass = 75; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` ### Boolean Props Türü @@ -342,32 +342,32 @@ ReactDOM.render(, rootElement) Bir React component'ine boolean veri türü geçirebiliriz. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const Status = (props) => { // kişinin durumunu kontrol etmek için üçlü operatör - let status = props.status ? 'Old enough to drive' : 'Too young for driving' - return

    {status}

    -} + let status = props.status ? "Old enough to drive" : "Too young for driving"; + return

    {status}

    ; +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { - let currentYear = 2020 - let birthYear = 2015 - const age = currentYear - birthYear // 15 yıl + let currentYear = 2020; + let birthYear = 2015; + const age = currentYear - birthYear; // 15 yıl - let status = age >= 18 + let status = age >= 18; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` ### Array Props Türü @@ -375,42 +375,42 @@ ReactDOM.render(, rootElement) Programlamada diziler ve nesneler, farklı problemleri çözmek ve verileri daha yapılandırılmış biçimde depolamak için en sık kullanılan veri yapılarıdır. Bu nedenle verilerle dizi biçiminde sıklıkla karşılaşırız. Bir component'e dizi geçirelim. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; -const Skills = (props) =>
      {props.skills}
    +const Skills = (props) =>
      {props.skills}
    ; const App = () => ( -
    - +
    +
    -) +); -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Tarayıcıdaki sonuca bakarsanız skills öğelerinin biçimlendirilmesi gerektiğini görürsünüz. Bu nedenle render etmeden önce her bir beceri arasına bir eleman eklememiz gerekir. Diziyi değiştirmek ve li öğesi eklemek için map metodunu kullanabiliriz. React'te rahat hissetmek için map, filter ve reduce gibi fonksiyonel programlama yöntemlerine hakim olmanız gerekir; değilseniz 1. Gün JavaScript tazeleyicisine geri dönün. Şimdi diziyi değiştirmek için map'i uygulayalım: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Skills Bileşeni const Skills = (props) => { // skills dizisini değiştirme - const skillList = props.skills.map((skill) =>
  • {skill}
  • ) - return
      {skillList}
    -} + const skillList = props.skills.map((skill) =>
  • {skill}
  • ); + return
      {skillList}
    ; +}; const App = () => ( -
    - +
    +
    -) +); -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Liste ve map konusuna ilerleyen bölümlerde ayrıntılı değineceğiz. Şimdi nesneyi props olarak nasıl kullanacağımıza bakalım. @@ -421,74 +421,74 @@ Bir React component'ine nesne olarak props geçirebiliriz. Bir örnek görelim. Önceki Header props'larını nesneye çevirebiliriz. Daha iyi anlamak için birkaç özelliği değiştirelim. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Header Bileşeni const Header = (props) => { return (
    -
    +

    {props.data.welcome}

    {props.data.title}

    {props.data.subtitle}

    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', - } + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + }; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') + ); +}; +const rootElement = document.getElementById("root"); // JSX elementini ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` Şimdi önceki tüm Header özelliklerini bir nesneye dönüştürelim. ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Header Bileşeni const Header = (props) => { return (
    -
    +

    {props.data.welcome}

    {props.data.title}

    {props.data.subtitle}

    @@ -498,31 +498,31 @@ const Header = (props) => { {showDate(props.data.date)}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", author: { - firstName: 'Asabeneh', - lastName: 'Yetayeh', + firstName: "Asabeneh", + lastName: "Yetayeh", }, date: new Date(), // tarih, okunabilir bir formata dönüştürülmelidir - } + }; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Nesneyi props olarak kullandığımızda, değerlere erişmek için genellikle veriyi destructure ederiz. Destructuring kodu okumayı kolaylaştırır. Props'u destructure etmeyi yakında göreceğiz; ama önce bir React component'i için function props türüne bakalım. @@ -532,81 +532,81 @@ Nesneyi props olarak kullandığımızda, değerlere erişmek için genellikle v Bir React component'ine fonksiyon türünde props geçirebiliriz. Birkaç örnek inceleyelim: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Bir button bileşeni -const Button = (props) => +const Button = (props) => ; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const sayHi = () => { - alert('Hi') - } + alert("Hi"); + }; return ( -
    -
    - ) -} -const rootElement = document.getElementById('root') + ); +}; +const rootElement = document.getElementById("root"); // JSX elementini ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` Fonksiyonu süslü parantez içine de yazabiliriz: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Bir button bileşeni -const Button = (props) => +const Button = (props) => ; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { return ( -
    -
    - ) -} -const rootElement = document.getElementById('root') + ); +}; +const rootElement = document.getElementById("root"); // JSX elementini ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` Şimdi farklı fonksiyonları props olarak uygulayalım: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Bir button bileşeni -const Button = (props) => +const Button = (props) => ; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const greetPeople = () => { - alert('Welcome to 30 Days Of React Challenge, 2020') - } + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; return ( -
    -
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Yukarıdaki örnekte onClick, greetPeople fonksiyonunu tutan bir props'tur. HTML'de onclick, onmouseover, onhover, onkeypress gibi olay işleyicileri bulunur. React'te bu işleyiciler camelCase yazımıyla kullanılır; örneğin onClick, onMouseOver, onKeyPress gibi. React'teki olayları ilerleyen bölümlerde ayrıntılı ele alacağız. @@ -616,54 +616,54 @@ Bir React component'inde fonksiyonun props olarak nasıl kullanılacağını dah Bu component, ay, gün ve yılı bir uyarı kutusu olarak gösterir: ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; // Zamanı Ay gün, yıl formatında göstermek için fonksiyon, örn. Oct 4, 2020 const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Bir button bileşeni -const Button = (props) => +const Button = (props) => ; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const handleTime = () => { - alert(showDate(new Date())) - } + alert(showDate(new Date())); + }; const greetPeople = () => { - alert('Welcome to 30 Days Of React Challenge, 2020') - } + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; return ( -
    -
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` ## Props'u Parçalama @@ -673,38 +673,38 @@ Artık bir JavaScript ustası olduğunuzu ve dizileri ile nesneleri nasıl parç 1. Adım adım parçalama ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Header Bileşeni const Header = (props) => { - const data = props.data - const { welcome, title, subtitle, author, date } = data - const { firstName, lastName } = author + const data = props.data; + const { welcome, title, subtitle, author, date } = data; + const { firstName, lastName } = author; return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -714,75 +714,75 @@ const Header = (props) => { {showDate(date)}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", author: { - firstName: 'Asabeneh', - lastName: 'Yetayeh', + firstName: "Asabeneh", + lastName: "Yetayeh", }, date: new Date(), - } + }; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') + ); +}; +const rootElement = document.getElementById("root"); // JSX elementini ReactDOM paketi kullanarak render ediyoruz -ReactDOM.render(, rootElement) +ReactDOM.render(, rootElement); ``` 2. Tek satırda parçalama ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Header Bileşeni const Header = (props) => { - const data = props.data + const data = props.data; const { welcome, title, subtitle, author: { firstName, lastName }, date, - } = data + } = data; return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -792,60 +792,60 @@ const Header = (props) => { {showDate(date)}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", author: { - firstName: 'Asabeneh', - lastName: 'Yetayeh', + firstName: "Asabeneh", + lastName: "Yetayeh", }, date: new Date(), - } + }; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` 3. Props'u parantez içinde parçalama ```js -import React from 'react' -import ReactDOM from 'react-dom' +import React from "react"; +import ReactDOM from "react-dom"; const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Header Bileşeni const Header = ({ data: { @@ -858,7 +858,7 @@ const Header = ({ }) => { return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -868,64 +868,64 @@ const Header = ({ {showDate(date)}
    - ) -} + ); +}; // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", author: { - firstName: 'Asabeneh', - lastName: 'Yetayeh', + firstName: "Asabeneh", + lastName: "Yetayeh", }, date: new Date(), - } + }; return ( -
    +
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` Şimdi sahip olduğumuz tüm component'leri parçalayalım ve bir araya getirelim. Props'u genellikle üst component'ten alt component'e doğru bir component'ten diğerine geçiririz. Örneğin, Main component'inde techs, user, greetPeople ve handleTime props'ları, üst component olan Main'den alt component'lere (TechList ve UserCard) geçirilmiştir. Aşağıda tüm kodlar parçalanmış ve temizlenmiş haliyle yer almaktadır. ```js -import React from 'react' -import ReactDOM from 'react-dom' -import asabenehImage from './images/asabeneh.jpg' +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images/asabeneh.jpg"; // Ay gün yıl göstermek için fonksiyon const showDate = (time) => { const months = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - 'August', - 'September', - 'October', - 'November', - 'December', - ] - - const month = months[time.getMonth()].slice(0, 3) - const year = time.getFullYear() - const date = time.getDate() - return ` ${month} ${date}, ${year}` -} + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; // Header Bileşeni const Header = ({ @@ -939,7 +939,7 @@ const Header = ({ }) => { return (
    -
    +

    {welcome}

    {title}

    {subtitle}

    @@ -949,25 +949,25 @@ const Header = ({ {showDate(date)}
    - ) -} + ); +}; // TechList Bileşeni const TechList = ({ techs }) => { - const techList = techs.map((tech) =>
  • {tech}
  • ) - return techList -} + const techList = techs.map((tech) =>
  • {tech}
  • ); + return techList; +}; // User Card Bileşeni const UserCard = ({ user: { firstName, lastName, image } }) => ( -
    +
    {firstName}

    {firstName} {lastName}

    -) +); // Bir button bileşeni @@ -975,71 +975,71 @@ const Button = ({ text, onClick, style }) => ( -) +); // JavaScript Nesnesi olarak CSS stilleri const buttonStyles = { - backgroundColor: '#61dbfb', + backgroundColor: "#61dbfb", padding: 10, - border: 'none', + border: "none", borderRadius: 5, margin: 3, - cursor: 'pointer', + cursor: "pointer", fontSize: 18, - color: 'white', -} + color: "white", +}; // Main Bileşeni const Main = ({ user, techs, greetPeople, handleTime }) => (
    -
    +

    Prerequisite to get started react.js:

    -
    -) +); // Footer Bileşeni const Footer = ({ copyRight }) => (
    -
    +

    Copyright {copyRight.getFullYear()}

    -) +); // App, üst veya kapsayıcı bileşen // Fonksiyonel Bileşen const App = () => { const data = { - welcome: 'Welcome to 30 Days Of React', - title: 'Getting Started React', - subtitle: 'JavaScript Library', + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", author: { - firstName: 'Asabeneh', - lastName: 'Yetayeh', + firstName: "Asabeneh", + lastName: "Yetayeh", }, date: new Date(), // tarih, okunabilir bir formata dönüştürülmelidir - } - const date = new Date() - const techs = ['HTML', 'CSS', 'JavaScript'] + }; + const date = new Date(); + const techs = ["HTML", "CSS", "JavaScript"]; // spread operatörü kullanarak data nesnesindeki author'ı user değişkenine kopyalama - const user = { ...data.author, image: asabenehImage } + const user = { ...data.author, image: asabenehImage }; const handleTime = () => { - alert(showDate(new Date())) - } + alert(showDate(new Date())); + }; const greetPeople = () => { - alert('Welcome to 30 Days Of React Challenge, 2020') - } + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; return ( -
    +
    { />
    - ) -} -const rootElement = document.getElementById('root') -ReactDOM.render(, rootElement) + ); +}; +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); ``` ## propTypes @@ -1096,4 +1096,4 @@ propTypes konusunu ilerleyen bölümlerde ayrıntılı olarak ele alacağız. 🎉 TEBRİKLER! 🎉 -[<< Gün 4](../04_Gun_Bilesenler/04_bilesenler.md) | [Gün 6 >>](../../06_Day_Map_List_Keys/06_map_list_keys.md) +[<< Gün 4](../04_Gun_Bilesenler/04_bilesenler.md) | [Gün 6 >>](../06_Gun_Dizi_Haritalama/06_dizi_haritalama.md) diff --git a/Turkish/06_Gun_Dizi_Haritalama/06_dizi_haritalama.md b/Turkish/06_Gun_Dizi_Haritalama/06_dizi_haritalama.md new file mode 100644 index 0000000..535f7ce --- /dev/null +++ b/Turkish/06_Gun_Dizi_Haritalama/06_dizi_haritalama.md @@ -0,0 +1,288 @@ +
    +

    30 Days Of React: Dizileri Haritalama (Mapping Arrays)

    + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
    + Ekim, 2020 +
    + +
    + +[<< Gün 5](../05_Gun_Props/05_props.md) | [Gün 7 >>](../07_Gun_Class_Bilesenler/07_class_bilesenler.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_6.jpg) + +- [Dizileri Haritalama (Mapping Arrays)](#dizileri-haritalama-mapping-arrays) + - [Dizi haritalama ve render etme](#dizi-haritalama-ve-render-etme) + - [Sayı dizisini haritalama](#sayı-dizisini-haritalama) + - [Dizi içinde diziyi haritalama](#dizi-içinde-diziyi-haritalama) + - [Nesne dizisini haritalama](#nesne-dizisini-haritalama) + - [Dizi haritalamada key (anahtar)](#dizi-haritalamada-key-anahtar) +- [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# Dizileri Haritalama (Mapping Arrays) + +Dizi, birçok farklı problemi çözmek için en sık kullanılan veri yapısıdır. React'ta, bir dizideki her elemana belirli HTML element'leri ekleyerek bu diziyi JSX listesine dönüştürmek için map kullanırız. + +## Dizi haritalama ve render etme + +Çoğu zaman veriler bir dizi veya nesne dizisi şeklinde gelir. Bu dizi ya da nesne dizisini render etmek için çoğu zaman _map_ kullanarak veriyi değiştiririz. Önceki bölümde, techs listesini bir map metodu kullanarak render etmiştik. Bu bölümde daha fazla örnek göreceğiz. + +Aşağıdaki örneklerde, tarayıcıda sayı dizisi, string dizisi, ülkeler dizisi ve beceriler dizisini nasıl render edeceğimizi göreceksiniz. + +```js +import React from "react"; +import ReactDOM from "react-dom"; +const App = () => { + return ( +
    +
    +

    Numbers List

    + {[1, 2, 3, 4, 5]} +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Tarayıcıyı kontrol ederseniz, sayıların tek bir satırda birbirine yapışık göründüğünü görürsünüz. Bunu önlemek için diziyi değiştiririz ve dizi elemanlarını JSX elementine çeviririz. Aşağıdaki örnekte, dizi bir JSX elemanları listesine dönüştürülmüştür. + +### Sayı dizisini haritalama + +```js +import React from "react"; +import ReactDOM from "react-dom"; + +const Numbers = ({ numbers }) => { + // diziyi li JSX dizisine dönüştürme + const list = numbers.map((number) =>
  • {number}
  • ); + return list; +}; + +// App component (Bileşeni) + +const App = () => { + const numbers = [1, 2, 3, 4, 5]; + + return ( +
    +
    +

    Numbers List

    +
      + +
    +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +### Dizi içinde diziyi haritalama + +Dizi içinde dizi nasıl haritalanır görelim: + +```js +import React from "react"; +import ReactDOM from "react-dom"; + +const skills = [ + ["HTML", 10], + ["CSS", 7], + ["JavaScript", 9], + ["React", 8], +]; + +// Skill Component (Bileşeni) +const Skill = ({ skill: [tech, level] }) => ( +
  • + {tech} {level} +
  • +); + +// Skills Component (Bileşeni) +const Skills = ({ skills }) => { + const skillsList = skills.map((skill) => ); + console.log(skillsList); + return
      {skillsList}
    ; +}; + +const App = () => { + return ( +
    +
    +

    Skills Level

    + +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +### Nesne dizisini haritalama + +Nesne dizisini render etme: + +```js +import React from "react"; +import ReactDOM from "react-dom"; + +const countries = [ + { name: "Finland", city: "Helsinki" }, + { name: "Sweden", city: "Stockholm" }, + { name: "Denmark", city: "Copenhagen" }, + { name: "Norway", city: "Oslo" }, + { name: "Iceland", city: "Reykjavík" }, +]; + +// Country component (Bileşeni) +const Country = ({ country: { name, city } }) => { + return ( +
    +

    {name}

    + {city} +
    + ); +}; + +// Countries component (Bileşeni) +const Countries = ({ countries }) => { + const countryList = countries.map((country) => ); + return
    {countryList}
    ; +}; +// App component (Bileşeni) +const App = () => ( +
    +
    +

    Countries List

    + +
    +
    +); + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +### Dizi haritalamada key (anahtar) + +Key'ler (Anahtarlar), React'ın hangi elemanların değiştiğini, eklendiğini veya kaldırıldığını tanımlamasına yardımcı olur. Dizi içindeki elemanlara, o elemanlara kararlı bir kimlik kazandırmak için key verilmelidir. Key benzersiz olmalıdır. Çoğu zaman veriler bir id ile birlikte gelir ve bu id'yi key olarak kullanabiliriz. React'a haritalama sırasında key geçirmezsek tarayıcıda bir uyarı üretilir. Verinin id'si yoksa, haritalama sırasında her eleman için benzersiz bir tanımlayıcı oluşturmanın bir yolunu bulmamız gerekir. Aşağıdaki örneğe bakın: + +```js +import React from "react"; +import ReactDOM from "react-dom"; + +const Numbers = ({ numbers }) => { + // diziyi li JSX dizisine dönüştürme + const list = numbers.map((num) =>
  • {num}
  • ); + return list; +}; + +const App = () => { + const numbers = [1, 2, 3, 4, 5]; + + return ( +
    +
    +

    Numbers List

    +
      + +
    +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Şimdi ülkeler haritalama örneğine de key ekleyelim: + +```js +import React from "react"; +import ReactDOM from "react-dom"; + +const countries = [ + { name: "Finland", city: "Helsinki" }, + { name: "Sweden", city: "Stockholm" }, + { name: "Denmark", city: "Copenhagen" }, + { name: "Norway", city: "Oslo" }, + { name: "Iceland", city: "Reykjavík" }, +]; + +// Country component (Bileşeni) +const Country = ({ country: { name, city } }) => { + return ( +
    +

    {name}

    + {city} +
    + ); +}; + +// Countries component (Bileşeni) +const Countries = ({ countries }) => { + const countryList = countries.map((country) => ( + + )); + return
    {countryList}
    ; +}; +const App = () => ( +
    +
    +

    Countries List

    + +
    +
    +); + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +# Egzersizler + +## Egzersizler: Seviye 1 + +1. Neden bir diziyi haritalamamız gerekir? +2. Dizi haritalamada neden key'lere (anahtarlara) ihtiyaç duyarız? +3. Kodunuzu destructuring (parçalama) etmenin önemi nedir? +4. Destructuring (Parçalama) kodunuzu daha temiz ve okunması daha kolay hale getirir mi? + +## Egzersizler: Seviye 2 + +1. Aşağıdaki tasarımda çift sayılar yeşil, tek sayılar sarı ve asal sayılar kırmızıdır. Bu renkleri React Component (Bileşen) kullanarak oluşturun. + +![Number Generator](../../images/day_6_number_generater_exercise.png) + +2. Aşağıdaki onaltılık (hexadecimal) renkleri React Component (Bileşen) kullanarak oluşturun. + +![Number Generator](../../images/day_6_hexadecimal_colors_exercise.png) + +## Egzersizler: Seviye 3 + +1. Verilen [veriyi](../06_Day_Map_List_Keys/06_map_list_keys_boilerplate/src/data/ten_most_highest_populations.js) kullanarak aşağıdaki çubuk grafiğini oluşturun. + +![Ten most highest populations](../../images/day_6_ten_highest_populations_exercise.png) + +🎉 TEBRİKLER! 🎉 + +[<< Gün 5](../05_Gun_Props/05_props.md) | [Gün 7 >>](../07_Gun_Class_Bilesenler/07_class_bilesenler.md) diff --git a/Turkish/07_Gun_Class_Bilesenler/07_class_bilesenler.md b/Turkish/07_Gun_Class_Bilesenler/07_class_bilesenler.md new file mode 100644 index 0000000..a6bd23d --- /dev/null +++ b/Turkish/07_Gun_Class_Bilesenler/07_class_bilesenler.md @@ -0,0 +1,844 @@ +
    +

    30 Days Of React: Class Component (Sınıf Tabanlı Bileşenler)

    + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
    + Ekim, 2020 +
    + +
    + +[<< Gün 6](../06_Gun_Dizi_Haritalama/06_dizi_haritalama.md) | [Gün 8 >>](../08_Gun_State/08_state.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_7.jpg) + +- [Class Component (Sınıf Tabanlı Bileşenler)](#class-component-sınıf-tabanlı-bileşenler) + - [Class Component'ta Props'a Erişim](#class-componentta-propsa-erişim) + - [Class Tabanlı Component'ta Metotlar](#class-tabanlı-componentta-metotlar) +- [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# Class Component (Sınıf Tabanlı Bileşenler) + +Önceki bölümlerde JSX, Functional Component (Fonksiyonel Bileşen) ve Props (Özellikler) konularını ele aldık. Bu bölümde Class Component (Sınıf Tabanlı Bileşenler) veya stateful component (durumlu bileşen) konusunu ele alacağız. Yalnızca class tabanlı component'lerin state (durum) ve yaşam döngüsü metotları vardı. Ancak React 16.8.0 sürümünden sonra fonksiyonel component'ler de React Hook'ları (Kancalar) kullanarak state ve yaşam döngüsüne sahip olabilmektedir. 30 Days Of React meydan okumasında, hem eski hem yeni sürümü anlamak amacıyla React'ı 16.8.0 öncesi ve sonrasını kapsayacak şekilde ele alacağız. Eski sürümde yazılmış çok sayıda kod var ve bu kodlar belirli bir noktada taşınmayı gerektirebilir. Bunun yanı sıra, React'ı gerçekten iyi anlamak için class tabanlı component'leri de anlamak gerekmektedir. + +Şimdiye kadar gördüğümüz tüm component'ler fonksiyonel component'tir. Şimdi class tabanlı component de oluşturalım. Class tabanlı component, JavaScript class'ı kullanılarak yapılır ve React Component'tan kalıtım alır. Daha önce oluşturduğumuz tüm fonksiyonel component'leri dönüştürerek class tabanlı component'in nasıl yapıldığını öğrenelim. Tümünü dönüştürmek zorunlu değildir; ancak fonksiyonel component'lerin class component'e nasıl dönüştürüldüğünü öğrenmek amacıyla bunu yapıyoruz. + +```js +// Saf JavaScript class'ı ve child (çocuk) class +// React paketinden import ettiğimizi hayal edin +class Component { + constructor(props) {} +} + +// Class tabanlı component'leri bu şekilde üst class'tan kalıtarak yaparız +class Child extends Component { + constructor(props) { + super(props); + } +} +``` + +Fonksiyonel React Component (Bileşeni): + +```js +// index.js + +import React from "react"; +import ReactDOM from "react-dom"; +// Header Component (Bileşeni) +// Fonksiyonel component +const Header = () => ( +
    +
    +

    Welcome to 30 Days Of React

    +

    Getting Started React

    +

    JavaScript Library

    +

    Asabeneh Yetayeh

    + Oct 6, 2020 +
    +
    +); +const rootElement = document.getElementById("root"); +ReactDOM.render(
    , rootElement); +``` + +Class tabanlı React Component (Bileşeni), React.Component'in bir child'ıdır (çocuğudur); yerleşik bir render metoduna sahiptir ve constructor içerebilir. + +```js +//index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + render() { + return ( +
    +
    +

    Welcome to 30 Days Of React

    +

    Getting Started React

    +

    JavaScript Library

    +

    Asabeneh Yetayeh

    + Oct 7, 2020 +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(
    , rootElement); +``` + +Yukarıdaki component'i constructor ile görelim: + +```js +//index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + return ( +
    +
    +

    Welcome to 30 Days Of React

    +

    Getting Started React

    +

    JavaScript Library

    +

    Asabeneh Yetayeh

    + Oct 7, 2020 +
    +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(
    , rootElement); +``` + +Tüm fonksiyonel component'leri class tabanlı component'e dönüştürelim: + +```js +// TechList Component (Bileşeni) +// fonksiyonel component +const TechList = () => { + const techs = ["HTML", "CSS", "JavaScript"]; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; +}; + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + constructor(props) { + super(props); + } + render() { + const techs = ["HTML", "CSS", "JavaScript"]; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Fonksiyonel Component +const Main = () => ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    +
    +
    +); + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    +
    +
    + ); + } +} + +// Footer Component (Bileşeni) +// Fonksiyonel component +const Footer = () => ( +
    +
    +

    Copyright 2020

    +
    +
    +); + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright 2020

    +
    +
    + ); + } +} + +// Ana uygulama veya üst (parent) veya kapsayıcı (container) component +// Fonksiyonel Component +const App = () => ( +
    +
    +
    +
    +
    +); + +// Ana uygulama veya üst (parent) veya kapsayıcı (container) component +// Class Component +class App extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +
    +
    +
    + ); + } +} +``` + +Tüm class tabanlı component'leri tek dosyada birleştirelim: + +```js +//index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + return ( +
    +
    +

    Welcome to 30 Days Of React

    +

    Getting Started React

    +

    JavaScript Library

    +

    Asabeneh Yetayeh

    + Oct 7, 2020 +
    +
    + ); + } +} + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + constructor(props) { + super(props); + } + render() { + const techs = ["HTML", "CSS", "JavaScript"]; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    +
    +
    + ); + } +} + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright 2020

    +
    +
    + ); + } +} + +// Ana uygulama veya üst (parent) veya kapsayıcı (container) component +// Class Component +class App extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +
    +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +## Class Component'ta Props'a Erişim + +Props (Özellikler)'in, bir component'ten diğerine veri göndermenin yolu olduğunu ya da başka bir deyişle props'un bir veri taşıyıcısı olduğunu belirtmiştik. Bu nedenle, class tabanlı component'te de props'u işlememiz gerekir. Bir class tabanlı component'in props'una _this_ anahtar kelimesini kullanarak erişebiliriz. Aşağıdaki örneğe bakın: + +```js +// index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + return ( +
    +
    +

    {this.props.data.welcome}

    +

    {this.props.data.title}

    +

    + {this.props.data.author.firstName} {this.props.data.author.lastName} +

    + {this.props.data.date} +
    +
    + ); + } +} +const App = () => { + const data = { + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 7, 2020", + }; + + return ( +
    +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Yukarıdaki örnekte görüldüğü gibi, props'tan veriyi almak için her seferinde _props.data_ yazmamız gerekiyor. Destructuring (Parçalama) kullanarak bu tekrarı önleyebiliriz: + +```js +// index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} +const App = () => { + const data = { + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 6, 2020", + }; + + return ( +
    +
    +
    + ); +}; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Yukarıdaki kodun bir öncekinden daha temiz olduğunu görebilirsiniz. Şimdi sahip olduğumuz tüm component'leri temizleyip birleştirelim: + +```js +// index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + constructor(props) { + super(props); + } + render() { + const { techs } = this.props; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    +
    +
    + ); + } +} + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright {this.props.date.getFullYear()}

    +
    +
    + ); + } +} + +class App extends React.Component { + render() { + const data = { + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 7, 2020", + }; + const techs = ["HTML", "CSS", "JavaScript"]; + + return ( +
    +
    +
    +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +## Class Tabanlı Component'ta Metotlar + +Class tabanlı component'te metotlara erişiriz. Çoğu zaman farklı metotları üst (parent) component'te yazarız ve bunları alt (child) component'lere geçiririz. Uygulamayı görelim. + +Bu component'e bir metot ekleyelim: + +```js +//index.js + +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + greetPeople = () => { + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; + render() { + return ( +
    +
    +

    Welcome to 30 Days Of React

    +

    Getting Started React

    +

    JavaScript Library

    +

    Asabeneh Yetayeh

    + Oct 7, 2020 + +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(
    , rootElement); +``` + +Metodu çağırmak veya tetiklemek event oluştuğunda gerçekleşir. Bu nedenle bir metodu event listener'a geçirirken metodu çağırmayın (parantez koymayın). + +Şimdi sahip olduğumuz koda gerekli tüm metotları ekleyelim: + +```js +// index.js + +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images/asabeneh.jpg"; + +// User Card Component (Bileşeni) +const UserCard = ({ user: { firstName, lastName, image } }) => ( +
    + {firstName} +

    + {firstName} + {lastName} +

    +
    +); + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: 3, + cursor: "pointer", + fontSize: 18, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + constructor(props) { + super(props); + } + render() { + const { techs } = this.props; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    + +
    +
    + ); + } +} + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright {this.props.date.getFullYear()}

    +
    +
    + ); + } +} + +class App extends React.Component { + showDate = (time) => { + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; + }; + handleTime = () => { + alert(this.showDate(new Date())); + }; + greetPeople = () => { + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; + render() { + const data = { + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 7, 2020", + }; + const techs = ["HTML", "CSS", "JavaScript"]; + + // spread operatörü kullanarak data nesnesindeki author'ı user değişkenine kopyalama + const user = { ...data.author, image: asabenehImage }; + + return ( +
    +
    +
    + +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Çoğu zaman kapsayıcı (container) veya üst (parent) component class component olarak yazılabilir; diğerleri ise fonksiyonel veya sunum (presentational) component olarak yazılabilir. Veri genellikle üst component'ten alt (child) component'e akar ve bu tek yönlüdür. Ancak React'ın en son sürümü, uygulamamızdaki her component'i yalnızca fonksiyonel component'lerle yazmamıza olanak tanımaktadır. Bu, önceki sürümlerde mümkün değildi. + +Bir sonraki bölümde, React'ın kalbi olan State (Durum)'u ele alacağız. State (Durum), React component'inin her state değişikliğinde yeniden render edilmesine (tekrar oluşturulmasına) olanak tanır. + +# Egzersizler + +## Egzersizler: Seviye 1 + +1. Saf bir JavaScript fonksiyonunu nasıl yazarsınız? +2. Inheritance (Kalıtım) nedir ve bir üst class'tan (parent class) nasıl child class oluşturursunuz? +3. Class tabanlı React Component (Bileşeni) nedir? +4. Fonksiyonel React Component (Bileşeni) ile class tabanlı React Component (Bileşeni) arasındaki fark nedir? +5. Fonksiyonel component'ler yerine class tabanlı component'leri ne zaman kullanmamız gerekir? +6. Class tabanlı component'in kullanım alanları nelerdir? +7. Daha sık hangi tür component kullanırsınız? Fonksiyonel mi, class tabanlı mı? +8. React yaşam döngüsü (life cycle) nedir? (henüz ele alınmadı) +9. React'ta State (Durum) nedir? (henüz ele alınmadı) + +## Egzersizler: Seviye 2 + +Önceki gün egzersizlerini class tabanlı component'lere çevirerek class tabanlı component hakkında daha fazla bilgi edinin. + +## Egzersizler: Seviye 3 + +Yakında... + +🎉 TEBRİKLER! 🎉 + +[<< Gün 6](../06_Gun_Dizi_Haritalama/06_dizi_haritalama.md) | [Gün 8 >>](../08_Gun_State/08_state.md) diff --git a/Turkish/08_Gun_State/08_state.md b/Turkish/08_Gun_State/08_state.md new file mode 100644 index 0000000..ead5f1c --- /dev/null +++ b/Turkish/08_Gun_State/08_state.md @@ -0,0 +1,518 @@ +
    +

    30 Days Of React: State (Durum)

    + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
    + Ekim, 2020 +
    + +
    + +[<< Gün 7](../07_Gun_Class_Bilesenler/07_class_bilesenler.md) | [Gün 9 >>](../09_Gun_Kosullu_Render/09_kosullu_render.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_8.jpg) + +- [State (Durum)](#state-durum) + - [State (Durum) Nedir?](#state-durum-nedir) + - [State nasıl ayarlanır?](#state-nasıl-ayarlanır) + - [Bir JavaScript metodu ile state'i sıfırlama](#bir-javascript-metodu-ile-statei-sıfırlama) + - [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# State (Durum) + +## State (Durum) Nedir? + +State nedir? State'in İngilizce anlamı, \_belirli bir anda birisinin veya bir şeyin içinde bulunduğu özel koşul_dur. + +State'in bir şeylerin durumu olduğunu görelim: + +- Mutlu musunuz yoksa üzgün mü? +- Işık açık mı yoksa kapalı mı? +- Mevcut musunuz yoksa yok musunuz? +- Dolu mu yoksa boş mu? + +Örneğin, 30 Days Of React meydan okumasını oluşturmaktan keyif aldığım için mutluyum. Sizin de mutlu olduğunuza inanıyorum. + +State (Durum), React'ta state verisi değiştiğinde component'in yeniden render edilmesini sağlayan bir nesnedir. + +## State nasıl ayarlanır? + +Class tabanlı bir component'in constructor'ı içinde veya dışında bir başlangıç state'i belirleriz. State'i doğrudan değiştirmeyiz ya da mutate etmeyiz; bunun yerine yeni bir state'e sıfırlamak için _setState()_ metodunu kullanırız. Aşağıdaki örnekte görüldüğü gibi, state nesnesinde başlangıç değeri 0 olan count bulunmaktadır. State nesnesine _this.state_ ve özellik adını kullanarak erişebiliriz. Aşağıdaki örneğe bakın: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +class App extends React.Component { + // state'i tanımlama + state = { + count: 0, + }; + render() { + // state değerine erişme + const count = this.state.count; + return ( +
    +

    {count}

    +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Yukarıdaki kodu çalıştırırsanız tarayıcıda sıfır görürsünüz. JavaScript metodu kullanarak state değerini değiştirerek count değerini artırabilir veya azaltabiliriz. + +## Bir JavaScript metodu ile state'i sıfırlama + +Şimdi bir düğmeye tıklayarak count değerini artıran veya azaltan bazı metotlar ekleyelim. Artırmak için bir düğme ve azaltmak için bir düğme ekleyelim. State'i ayarlamak için React'ın _this.setState_ metodunu kullanırız. Aşağıdaki örneğe bakın: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +class App extends React.Component { + // state'i tanımlama + state = { + count: 0, + }; + render() { + // state değerine erişme + const count = this.state.count; + return ( +
    +

    {count}

    + +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Yukarıdaki örneği anlarsanız, eksi bir metodu eklemek kolay olacaktır. Click event'e eksi bir metot ekleyelim: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +class App extends React.Component { + // state'i tanımlama + state = { + count: 0, + }; + render() { + // state değerine erişme + const count = this.state.count; + return ( +
    +

    {count}

    + +
    + {" "} + +
    +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Her iki düğme de iyi çalışıyor; ancak kodu iyi yapılandırmamız gerekiyor. Component'te ayrı metotlar oluşturalım: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +class App extends React.Component { + // state'i tanımlama + state = { + count: 0, + }; + // state'e bir ekleyen metot + addOne = () => { + this.setState({ count: this.state.count + 1 }); + }; + + // state'ten bir çıkaran metot + minusOne = () => { + this.setState({ count: this.state.count - 1 }); + }; + render() { + // state değerine erişme + const count = this.state.count; + return ( +
    +

    {count}

    + +
    + {" "} + +
    +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +State hakkında daha fazla örnek yapalım. Aşağıdaki örnekte ya köpek ya da kedi gösteren küçük bir uygulama geliştireceğiz. Başlangıç state'ini kedi olarak ayarlayabiliriz; tıklandığında köpek gösterecek ve bu şekilde devam edecek. Hayvanı dönüşümlü olarak değiştiren bir metoda ihtiyacımız var. Canlı örneği görmek için [buraya](https://codepen.io/Asabeneh/full/LYVxKpq) tıklayın: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +class App extends React.Component { + // state'i tanımlama + state = { + image: "https://www.smithsstationah.com/imagebank/eVetSites/Feline/01.jpg", + }; + changeAnimal = () => { + let dogURL = + "https://static.onecms.io/wp-content/uploads/sites/12/2015/04/dogs-pembroke-welsh-corgi-400x400.jpg"; + let catURL = + "https://www.smithsstationah.com/imagebank/eVetSites/Feline/01.jpg"; + let image = this.state.image === catURL ? dogURL : catURL; + this.setState({ image }); + }; + + render() { + // state değerine erişme + const count = this.state.count; + return ( +
    +

    30 Days Of React

    +
    + animal +
    + + +
    + ); + } +} +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Şimdi şimdiye kadar sahip olduğumuz tüm kodları bir araya koyalım ve gerekli olduğunda state'i de uygulayalım: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images/asabeneh.jpg"; + +// Ay, gün ve yılı gösteren fonksiyon + +const showDate = (time) => { + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; +}; + +// User Card Component (Bileşeni) +const UserCard = ({ user: { firstName, lastName, image } }) => ( +
    + {firstName} +

    + {firstName} + {lastName} +

    +
    +); + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: 3, + cursor: "pointer", + fontSize: 18, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + constructor(props) { + super(props); + // constructor içindeki kod diğer tüm kodlardan önce çalışır + } + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +const Count = ({ count, addOne, minusOne }) => ( +
    +

    {count}

    +
    +
    +
    +); + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + constructor(props) { + super(props); + } + render() { + const { techs } = this.props; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + constructor(props) { + super(props); + } + render() { + const { + techs, + user, + greetPeople, + handleTime, + changeBackground, + count, + addOne, + minusOne, + } = this.props; + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    + +
    +
    + ); + } +} + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright {this.props.date.getFullYear()}

    +
    +
    + ); + } +} + +class App extends React.Component { + state = { + count: 0, + styles: { + backgroundColor: "", + color: "", + }, + }; + showDate = (time) => { + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return ` ${month} ${date}, ${year}`; + }; + addOne = () => { + this.setState({ count: this.state.count + 1 }); + }; + + // state'ten bir çıkaran metot + minusOne = () => { + this.setState({ count: this.state.count - 1 }); + }; + handleTime = () => { + alert(this.showDate(new Date())); + }; + greetPeople = () => { + alert("Welcome to 30 Days Of React Challenge, 2020"); + }; + changeBackground = () => {}; + render() { + const data = { + welcome: "Welcome to 30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 7, 2020", + }; + const techs = ["HTML", "CSS", "JavaScript"]; + const date = new Date(); + // spread operatörü kullanarak data nesnesindeki author'ı user değişkenine kopyalama + const user = { ...data.author, image: asabenehImage }; + + return ( +
    + {this.state.backgroundColor} +
    +
    +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Artık State (Durum) konusunu çok iyi anladığınıza inanıyorum. Bundan sonra diğer bölümlerde de state kullanacağız; çünkü state ve props, React uygulamasının çekirdeğidir. + +## Egzersizler + +### Egzersizler: Seviye 1 + +1. Bugün state'iniz nasıldı? Mutlu musunuz? Umarım öyledir. Buraya kadar geldiyseniz mutlu olmalısınız. +2. React'ta State (Durum) nedir? +3. React'ta Props (Özellikler) ve State (Durum) arasındaki fark nedir? +4. Bir React component'inde state'e nasıl erişirsiniz? +5. Bir React component'inde state'i nasıl ayarlarsınız? + +### Egzersizler: Seviye 2 + +1. React state'i kullanarak sayfanın arka plan rengini değiştirin. Bu tekniği portföyünüz için karanlık mod uygulamak amacıyla kullanabilirsiniz. + +![Change Background](../../images/08_day_changing_background_exercise.gif) + +2. Uzun süredir devam eden kapanmanın ardından seyahat etmeyi düşünüyor olabilirsiniz ve nereye gideceğinizi bilmiyorsunuzdur. Tatil hedefinizi seçen rastgele bir ülke seçici geliştirmek isteyebilirsiniz. + +![Change Background](../../images/08_day_select_country_exercise.gif) + +### Egzersizler: Seviye 3 + +Yakında + +🎉 TEBRİKLER! 🎉 + +[<< Gün 7](../07_Gun_Class_Bilesenler/07_class_bilesenler.md) | [Gün 9 >>](../09_Gun_Kosullu_Render/09_kosullu_render.md) diff --git a/Turkish/09_Gun_Kosullu_Render/09_kosullu_render.md b/Turkish/09_Gun_Kosullu_Render/09_kosullu_render.md new file mode 100644 index 0000000..20c779d --- /dev/null +++ b/Turkish/09_Gun_Kosullu_Render/09_kosullu_render.md @@ -0,0 +1,783 @@ +
    +

    30 Days Of React: Koşullu Render (Conditional Rendering)

    + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
    + Ekim, 2020 +
    + +
    + +[<< Gün 8](../08_Gun_State/08_state.md) | [Gün 10 >>](../10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_9.jpg) + +# Koşullu Render (Conditional Rendering) + +Terimden anlaşılacağı gibi, koşullu render (conditional rendering), farklı koşullarda farklı JSX veya component (bileşen) render etmenin bir yoludur. Koşullu render'i sıradan if ve else ifadesini, üçlü (ternary) operatörü ve &&'yi kullanarak uygulayabiliriz. Farklı koşullu render'ları uygulayalım. + +## If ve Else İfadesi ile Koşullu Render + +Aşağıdaki kodda başlangıç state'i (durumu) false olan loggedIn değişkeni bulunmaktadır. State false ise kullanıcıya giriş yapmasını söyleriz; aksi takdirde kullanıcıyı karşılarız: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + render() { + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +

    Select a country for your next holiday

    +
    +
    + ); + } +} + +class App extends React.Component { + state = { + loggedIn: false, + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + // if ve else ifadesi kullanarak koşullu render + + let status; + + if (this.state.loggedIn) { + status =

    Welcome to 30 Days Of React

    ; + } else { + status =

    Please Login

    ; + } + + return ( +
    +
    + {status} +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Kullanıcının oturum durumunu değiştirmesine izin veren bir metot ekleyelim. Giriş ve çıkış yapmak için event işleyen bir düğmeye ihtiyacımız var: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: "3px auto", + cursor: "pointer", + fontSize: 22, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +class App extends React.Component { + state = { + loggedIn: false, + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + let status; + let text; + + if (this.state.loggedIn) { + status =

    Welcome to 30 Days Of React

    ; + text = "Logout"; + } else { + status =

    Please Login

    ; + text = "Login"; + } + + return ( +
    +
    + {status} +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Koşulumuz ikiden fazlaysa ne olur? Saf JavaScript'te olduğu gibi if else if ifadesini kullanabiliriz. Genel olarak, koşullu render, saf JavaScript koşullu ifadesinden farklı değildir. + +## Üçlü (Ternary) Operatör ile Koşullu Render + +Üçlü (ternary) operatör, if else ifadesine bir alternatiftir. Ancak üçlü operatörün if else ifadesinden daha fazla kullanım alanı vardır. Örneğin üçlü operatörü, bir component'teki stil, className ve diğer yerlerde sıradan if else ifadesinden çok daha fazla kullanabilirsiniz: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: "3px auto", + cursor: "pointer", + fontSize: 22, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + render() { + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +class App extends React.Component { + state = { + loggedIn: false, + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + let status = this.state.loggedIn ? ( +

    Welcome to 30 Days Of React

    + ) : ( +

    Please Login

    + ); + + return ( +
    +
    + {status} +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +JSX'e ek olarak, bir component'i de koşullu olarak render edebiliriz. Yukarıdaki koşullu JSX'i bir component'e çevirelim: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: "3px auto", + cursor: "pointer", + fontSize: 22, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + render() { + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +const Login = () => ( +
    +

    Please Login

    +
    +); +const Welcome = (props) => ( +
    +

    Welcome to 30 Days Of React

    +
    +); + +class App extends React.Component { + state = { + loggedIn: false, + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + const status = this.state.loggedIn ? : ; + + return ( +
    +
    + {status} +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +## && Operatörü ile Koşullu Render + +&& operatörü, sol operand (ifade) true (doğru) ise sağ JSX operandını render eder: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: "3px auto", + cursor: "pointer", + fontSize: 22, + color: "white", +}; + +// class tabanlı component +class Header extends React.Component { + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} +const Login = () => ( +
    +

    Please Login

    +
    +); +const Welcome = (props) => ( +
    +

    Welcome to 30 Days Of React

    +
    +); + +class App extends React.Component { + state = { + loggedIn: false, + techs: ["HTML", "CSS", "JS"], + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + // state'i parçalayabiliriz + + const { loggedIn, techs } = this.state; + + const status = loggedIn ? : ; + + return ( +
    +
    + {status} +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Önceki bölümde karşılama ve saati alert kutusu olarak göstermiştik. Şimdi karşılamayı ve saati alert kutusu yerine tarayıcı DOM'unda render edelim: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +// class tabanlı component +class Header extends React.Component { + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +const Message = ({ message }) => ( +
    +

    {message}

    +
    +); +const Login = () => ( +
    +

    Please Login

    +
    +); +const Welcome = (props) => ( +
    +

    Welcome to 30 Days Of React

    +
    +); + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + render() { + const { techs } = this.props; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + render() { + const { techs, greetPeople, handleTime, loggedIn, handleLogin, message } = + this.props; + console.log(message); + + const status = loggedIn ? : ; + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    + {techs.length === 3 && ( +

    You have all the prerequisite courses to get started React

    + )} +
    +
    +
    +
    + +
    +
    + ); + } +} + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: "3px auto", + cursor: "pointer", + fontSize: 22, + color: "white", +}; + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright {this.props.date.getFullYear()}

    +
    +
    + ); + } +} + +class App extends React.Component { + state = { + loggedIn: false, + techs: ["HTML", "CSS", "JS"], + message: "Click show time or Greet people to change me", + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + showDate = (time) => { + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return `${month} ${date}, ${year}`; + }; + handleTime = () => { + let message = this.showDate(new Date()); + this.setState({ message }); + }; + greetPeople = () => { + let message = "Welcome to 30 Days Of React Challenge, 2020"; + this.setState({ message }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + + return ( +
    +
    + +
    + +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +## Tanıklık + +Artık Yazar ve 30DaysOfReact hakkındaki düşüncelerinizi paylaşmanın zamanı geldi. Tanıklığınızı bu [bağlantıda](https://www.asabeneh.com/testimonials) bırakabilirsiniz. + +## Egzersizler + +### Egzersizler: Seviye 1 + +1. Koşullu render (conditional rendering) nedir? +2. Koşullu render'ı nasıl uygularsınız? +3. Koşullu render için hangi yöntemi kullanmayı tercih edersiniz? + +### Egzersizler: Seviye 2 + +1. Yılın mevsimine göre (Sonbahar, Kış, İlkbahar, Yaz) arka plan rengini değiştiren tek sayfalık bir uygulama yapın. +2. Günün saatine göre (Sabah, Öğle, Akşam, Gece) arka plan rengini değiştiren tek sayfalık bir uygulama yapın. + +### Egzersizler: Seviye 3 + +1. Veri çekmek belirli bir süre alır. Veri yüklenene kadar kullanıcı beklemek zorundadır. Veri henüz çekilmemişken bir yükleme (loading) fonksiyonelliği uygulayın. Gecikmeyi setTimeout kullanarak simüle edebilirsiniz. + +🎉 TEBRİKLER! 🎉 + +[<< Gün 8](../08_Gun_State/08_state.md) | [Gün 10 >>](../10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md) diff --git a/Turkish/10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md b/Turkish/10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md new file mode 100644 index 0000000..bbb01b4 --- /dev/null +++ b/Turkish/10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md @@ -0,0 +1,620 @@ +
    +

    30 Days Of React: React Proje Klasör Yapısı (Project Folder Structure)

    + + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
    + Ekim, 2020 +
    + +
    + +[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../../11_Day_Events/11_events.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_10.jpg) + +- [React Proje Klasör Yapısı ve Dosya İsimlendirme](#react-proje-klasör-yapısı-ve-dosya-i̇simlendirme) + - [Dosya İsimlendirme](#dosya-i̇simlendirme) + - [Klasör](#klasör) + - [Components (Bileşenler) Klasörü](#components-bileşenler-klasörü) + - [Fragment (Parça)](#fragment-parça) +- [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# React Proje Klasör Yapısı ve Dosya İsimlendirme + +React projesinde tek bir klasör yapısı ya da dosya isimlendirmesi kullanmanın zorunlu bir yolu yoktur. Çoğu zaman bu tür seçimler bir ekip tarafından yapılabilir. Bazen bir şirketin hangi kod kurallarının, klasör yapısının ve dosya isimlendirmesinin kullanılacağına dair geliştirilmiş yönergeleri olabilir. React projesini yapılandırmanın doğru ya da yanlış yolu yoktur; ancak bazı yapılar ölçeklenebilirlik, sürdürülebilirlik, dosyalar üzerinde çalışma kolaylığı ve anlaşılması kolay yapı açısından diğerlerinden daha iyidir. Klasör yapısı hakkında daha fazla bilgi edinmek isterseniz aşağıdaki makaleleri inceleyebilirsiniz: + +- [React Folder Structure by https://www.devaradise.com ](https://www.devaradise.com/react-project-folder-structure) +- [React Folder Structure by www.robinwieruch.de ](https://www.robinwieruch.de/react-folder-structure) +- [React Folder Structure by Faraz Ahmad](https://dev.to/farazamiruddin/an-opinionated-guide-to-react-folder-structure-file-naming-1l7i) +- [React Folder Structure by https://maxrozen.com/](https://maxrozen.com/guidelines-improve-react-app-folder-structure/) + +Farklı kuralların bir karışımını kullanıyorum. Dilerseniz bunu takip edebilirsiniz; ancak lütfen sizin için anlamlı olan bir yapıya sadık kalın. + +## Dosya İsimlendirme + +Tüm React projelerimde, tüm component'ler için CamelCase (deve harfi) dosya adı kullanacağım. Açıklayıcı ve uzun isimler kullanmayı tercih ederim. + +## Klasör + +Tüm görselleri, ikonları ve fontları assets klasöründe, tüm CSS stil dosyalarını ise styles klasöründe toplamayı kolay buluyorum. Tüm component'ler components klasöründe olacak. + +Şimdiye kadar index.js dosyası üzerinde çalışıyorduk. index.js'de çok sayıda component bulunuyor. Bugün her component'i ayrı bir dosyaya taşıyacağız ve tüm dosyaları App.js'e import edeceğiz. Bu süreçte klasör yapımı göreceksiniz. Şu anda src dizinindeyiz. Tüm klasör yapısı src dizininin içinde olacak. index.js dosyasından başlayalım. index.js dosyasına ek olarak, bir App.js dosyası oluşturalım ve şimdilik sahip olduğumuz component'lerin çoğunu App.js'e taşıyalım. index.js, component'i index.html ile bağlayan ana kapınızdır. + +```js +// src/index.js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; + +const App = () =>

    Welcome to 30 Days Of React

    ; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Yukarıdaki kod parçasında App component'i bulunmaktadır. App component'ini kendi dosyasına, App.js'e taşıyalım: + +```js +// src/App.js +import React from 'react +const App = () =>

    Welcome to 30 Days Of React

    +``` + +Component'i başka bir dosyaya import etmek için dışa aktarmamız (export etmemiz) gerekiyor. Default veya named (isimli) export olarak dışa aktarabiliriz. Bir dosyada bir default export ve çok sayıda named export yapılabilir. Önce named export ile uygulayalım, ardından default export'a geçelim. + +Named export yapmak için _let_ veya _const_'tan önce sadece _export_ anahtar kelimesini ekleriz: + +```js +// src/App.js +import React from 'react + +// ok fonksiyonunda named export +export const App = () =>

    Welcome to 30 Days Of React

    +``` + +Normal fonksiyon tanımlamasında dışa aktarma: + +```js +// src/App.js +import React from 'react +// normal fonksiyonda named export, function declaration +export function App () { +return

    Welcome to 30 Days Of React

    +} +``` + +Şimdi App component'ini App.js dosyasından index.js dosyasına import edelim: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +import { App } from "./App"; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Named export'u gördük; şimdi default export ile uygulayalım. Bunu iki şekilde yapabiliriz; ancak component'leri dışa aktarırken ikinci yöntem önerilir; çünkü bazen bir component'i başka bir higher order component (yüksek dereceli bileşen) ile sarmalayabiliriz: + +```js +// src/App.js +import React from 'react +// ok fonksiyonunda default export +export default const App = () =>

    Welcome to 30 Days Of React

    + +``` + +```js +// src/App.js +import React from 'react +// default export, normal fonksiyon +export default function App () { + return

    Welcome to 30 Days Of React

    +} +``` + +```js +// src/App.js +// Çoğu durumda önerilen yöntem +import React from 'react +const App = () =>

    Welcome to 30 Days Of React

    +export default App +``` + +Bir component default olarak dışa aktarılmışsa import ederken süslü paranteze gerek yoktur: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +import App from "./App"; + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +Şimdiye kadar oluşturduğumuz component'leri hatırlarsanız, hepsini bir arada tutuyorduk. Bu şekilde çalışmak kolay değildir. Şimdi tüm component'leri ayrı bir dosyaya taşıyacağız: + +```js +// index.js +import React from "react"; +import ReactDOM from "react-dom"; +import asabenehImage from "./images"; +import { countriesData } from "./data/countries"; + +// Header component (Bileşeni) +class Header extends React.Component { + render() { + console.log(this.props.data); + const { + welcome, + title, + subtitle, + author: { firstName, lastName }, + date, + } = this.props.data; + + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); + } +} + +const Country = ({ + country: { name, capital, flag, languages, population, currency }, +}) => { + const formatedCapital = + capital.length > 0 ? ( + <> + Capital: + {capital} + + ) : ( + "" + ); + const formatLanguage = languages.length > 1 ? `Languages` : `Language`; + return ( +
    +
    + {name} +
    +

    {name.toUpperCase()}

    +
    +

    {formatedCapital}

    +

    + {formatLanguage}: + {languages.join(", ")} +

    +

    + Population: + {population.toLocaleString()} +

    +

    + Currency: + {currency} +

    +
    +
    + ); +}; + +// User Card Component (Bileşeni) +const UserCard = () => ( +
    + asabeneh image +

    Asabeneh Yetayeh

    +
    +); + +// Onaltılık (hexadecimal) renk üreteci +const hexaColor = () => { + let str = "0123456789abcdef"; + let color = ""; + for (let i = 0; i < 6; i++) { + let index = Math.floor(Math.random() * str.length); + color += str[index]; + } + return "#" + color; +}; + +const HexaColor = () =>
    {hexaColor()}
    ; + +const Message = ({ message }) => ( +
    +

    {message}

    +
    +); +const Login = () => ( +
    +

    Please Login

    +
    +); +const Welcome = (props) => ( +
    +

    Welcome to 30 Days Of React

    +
    +); + +// Düğme component'i +const Button = ({ text, onClick, style }) => ( + +); + +// TechList Component (Bileşeni) +// class tabanlı component +class TechList extends React.Component { + render() { + const { techs } = this.props; + const techsFormatted = techs.map((tech) =>
  • {tech}
  • ); + return techsFormatted; + } +} + +// Main Component (Bileşeni) +// Class Component +class Main extends React.Component { + render() { + const { techs, greetPeople, handleTime, loggedIn, handleLogin, message } = + this.props; + console.log(message); + + const status = loggedIn ? : ; + return ( +
    +
    +

    Prerequisite to get started react.js:

    +
      + +
    + {techs.length === 3 && ( +

    You have all the prerequisite courses to get started React

    + )} +
    +
    +
    +
    + +
    +
    + ); + } +} + +// CSS stilleri JavaScript nesnesi olarak +const buttonStyles = { + backgroundColor: "#61dbfb", + padding: 10, + border: "none", + borderRadius: 5, + margin: 3, + cursor: "pointer", + fontSize: 22, + color: "white", + margin: "0 auto", +}; + +// Footer Component (Bileşeni) +// Class component +class Footer extends React.Component { + constructor(props) { + super(props); + } + render() { + return ( +
    +
    +

    Copyright {this.props.date.getFullYear()}

    +
    +
    + ); + } +} + +class App extends React.Component { + state = { + loggedIn: false, + techs: ["HTML", "CSS", "JS"], + message: "Click show time or Greet people to change me", + }; + handleLogin = () => { + this.setState({ + loggedIn: !this.state.loggedIn, + }); + }; + showDate = (time) => { + const months = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + + const month = months[time.getMonth()].slice(0, 3); + const year = time.getFullYear(); + const date = time.getDate(); + return `${month} ${date}, ${year}`; + }; + handleTime = () => { + let message = this.showDate(new Date()); + this.setState({ message }); + }; + greetPeople = () => { + let message = "Welcome to 30 Days Of React Challenge, 2020"; + this.setState({ message }); + }; + + render() { + const data = { + welcome: "30 Days Of React", + title: "Getting Started React", + subtitle: "JavaScript Library", + author: { + firstName: "Asabeneh", + lastName: "Yetayeh", + }, + date: "Oct 9, 2020", + }; + const techs = ["HTML", "CSS", "JavaScript"]; + + return ( +
    + {this.state.backgroundColor} +
    + +
    + +
    +
    + ); + } +} + +const rootElement = document.getElementById("root"); +ReactDOM.render(, rootElement); +``` + +## Components (Bileşenler) Klasörü + +src dizininin içinde tüm component'leri ayrı bir klasörde toplayacağız: + +```sh +src + App.js + index.js + components + -auth + -Signup.js + -Signin.js + -Forgotpassword.js + -Resetpassord.js + header + -Header.js + footer + -Footer.js + assets + -images + -icnons + - fonts + styles + -button.js + -button.scss + utils + -random-id.js + -display-time.js + -generate-color.js + shared + -Button.js + -InputField.js + -TextAreaField.js +``` + +src içinde components dizini oluşturalım; components içinde header dizini oluşturalım. header dizini içinde Header.js dosyası oluşturalım: + +```js +// src/components/header/Header.js +import React from "react"; + +const Header = (props) => { + return ( +
    +
    +

    {welcome}

    +

    {title}

    +

    {subtitle}

    +

    + {firstName} {lastName} +

    + {date} +
    +
    + ); +}; + +export default Header; +``` + +Header'a benzer şekilde, tüm component'leri ilgili dosyalarına taşıyalım. index.html'deki tüm CSS dosyaları styles klasörüne taşınacak; her parça kendi dosyasına ayrıldıktan sonra styles klasörünü kontrol etmeye çalışın. + +## Fragment (Parça) + +Fragment'lar (Parçalar), JSX'te gereksiz üst element kullanmaktan kaçınmanın bir yoludur. Bir fragment uygulayalım. Fragment'ı react modülünden import ediyoruz. Aşağıda görüldüğü gibi React ve fragment'ı virgül ayırımı kullanarak birlikte import ettik: + +```js +import React, { Fragment } from "react"; + +const Skills = () => { + return ( + +
  • HTML
  • +
  • CSS
  • +
  • JavaScript
  • +
    + ); +}; +const RequiredSkills = () => { + return ( +
      + +
    + ); +}; +``` + +Fragment modülünü React'tan şu şekilde çıkarmak da mümkündür: + +```js +import React from "react"; + +const Skills = () => { + return ( + +
  • HTML
  • +
  • CSS
  • +
  • JavaScript
  • +
    + ); +}; + +const RequiredSkills = () => { + return ( +
      + +
    + ); +}; +``` + +React'ın son sürümünde bu işaretler kullanılarak çıkarmadan veya import etmeden de yazılabilir (<> ): + +```js +import React from "react"; + +// Önerilen yöntem +const Skills = () => { + return ( + <> +
  • HTML
  • +
  • CSS
  • +
  • JavaScript
  • + + ); +}; + +const RequiredSkills = () => { + return ( +
      + +
    + ); +}; +``` + +Class tabanlı component yaparken React.Component kullanıyorduk; bunun yerine sadece Component'i import ederek kodu daha temiz yazabiliriz. Bir örnek görelim: + +```js +import React from "react"; + +// Component'i import etmeden +// Önerilmez +class App extends React.Component { + render() { + return

    30 Days of React

    ; + } +} +``` + +```js +import React, { Component } from "react"; + +// Bu önerilen yöntemdir +class App extends Component { + render() { + return

    30 Days of React

    ; + } +} +``` + +Harika iş çıkardınız. Beyniniz ve kaslarınız için bazı egzersizler yapma zamanı. + +# Egzersizler + +## Egzersizler: Seviye 1 + +1. React Klasör Yapısı ve Dosya İsimlendirmesinin önemi nedir? +2. Dosya nasıl dışa aktarılır (export edilir)? +3. Dosya nasıl içe aktarılır (import edilir)? +4. Bir component veya modül oluşturun ve named ya da default export ile dışa aktarın. +5. Bir component veya modül oluşturun ve import edin. +6. Sahip olduğunuz tüm component'leri farklı bir klasör yapısına taşıyın. + +## Egzersizler: Seviye 2 + +1. Şimdiye kadar oluşturduğumuz component'leri kullanarak basit bir portföy yapın. 8. gün meydan okumasında yazdığımız fonksiyonu kullanarak karanlık mod (dark mode) uygulayın. + +## Egzersizler: Seviye 3 + +Yakında + +🎉 TEBRİKLER! 🎉 + +[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../../11_Day_Events/11_events.md) diff --git a/Turkish/readMe.md b/Turkish/readMe.md index 35e00d6..9999ea9 100644 --- a/Turkish/readMe.md +++ b/Turkish/readMe.md @@ -15,15 +15,21 @@ Yazar: Asabeneh Yetayeh
    - October, 2020
    + Ekim, 2020
    -[Gün 2 >>](./02_Gun_Reacta_Giris/02_reacta_giris.md) - -| # Gün | Konular | -| ----- | :------------------------------------------------------------------------------------------------: | -| 02 | [React'a Giriş](./02_Gun_Reacta_Giris/02_reacta_giris.md) | -| 03 | [Kurulum](./03_Gun_Kurulum/03_kurulum.md) | -| 04 | [Bileşenler](./04_Gun_Bilesenler/04_bilesenler.md) | -| 05 | [Props](./05_Gun_Props/05_props.md) | +[Gün 1 >>](./01_Gun_JavaScript_Tazeleyici/01_javascript_tazeleyici.md) + +| # Gün | Konular | +| ----- | :---------------------------------------------------------------------------------: | +| 01 | [JavaScript Tazeleyici](./01_Gun_JavaScript_Tazeleyici/01_javascript_tazeleyici.md) | +| 02 | [React'a Giriş](./02_Gun_Reacta_Giris/02_reacta_giris.md) | +| 03 | [Kurulum](./03_Gun_Kurulum/03_kurulum.md) | +| 04 | [Bileşenler](./04_Gun_Bilesenler/04_bilesenler.md) | +| 05 | [Props](./05_Gun_Props/05_props.md) | +| 06 | [Dizi Haritalama](./06_Gun_Dizi_Haritalama/06_dizi_haritalama.md) | +| 07 | [Class Bileşenler](./07_Gun_Class_Bilesenler/07_class_bilesenler.md) | +| 08 | [State (Durum)](./08_Gun_State/08_state.md) | +| 09 | [Koşullu Render](./09_Gun_Kosullu_Render/09_kosullu_render.md) | +| 10 | [Proje Klasör Yapısı](./10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md) |