feat(turkish): add Turkish translations for Days 1, 6-10 and fix Days 3-5 bugs

New translations added:
- Day 01: JavaScript Refresher (01_Gun_JavaScript_Tazeleyici)
  Complete coverage: adding JS to web, variables, data types, arrays,
  conditionals, loops, scope, objects, functions, higher order functions,
  destructuring, spread, functional programming, classes, DOM
- Day 06: Mapping Arrays (06_Gun_Dizi_Haritalama)
  Covers mapping number arrays, arrays of arrays, arrays of objects,
  and the importance of the key prop
- Day 07: Class Components (07_Gun_Class_Bilesenler)
  Converting functional to class components, this.props access,
  class methods, complete code examples
- Day 08: State / Durum (08_Gun_State)
  What is state, setState(), counter example, cat/dog toggle example,
  full combined app with state and props
- Day 09: Conditional Rendering / Kosullu Render (09_Gun_Kosullu_Render)
  if/else, ternary operator, && operator, Login/Welcome components,
  message state, exercises
- Day 10: React Project Folder Structure (10_Gun_Proje_Klasor_Yapisi)
  File naming (CamelCase), folder structure, named vs default exports,
  components folder organization, Fragments

Bug fixes in existing translations (Days 3-5):
- Fixed 'Author:' not translated -> 'Yazar:' in Days 3, 4, 5
- Fixed 'October, 2020' not translated -> 'Ekim, 2020' in Days 3, 4, 5 and readMe

Navigation improvements:
- readMe.md: updated top nav link from Day 2 to Day 1 (now that Day 1 exists)
- readMe.md: expanded table of contents from Days 2-5 to Days 1-10
- Day 05 (05_props.md): fixed both nav links for Day 6 to point to Turkish
  version (06_Gun_Dizi_Haritalama) instead of English source

Translation conventions used throughout:
- Prose and headings fully translated to Turkish
- Code (variable/function names, JSX) left unchanged
- Code comments translated to Turkish
- React technical terms kept in English with Turkish in parentheses:
  Component (Bilesen), State (Durum), Props (Ozellikler), Hook (Kanca),
  Functional Component (Fonksiyonel Bilesen), Class Component (Sinif
  Tabanlı Bilesen), Fragment (Parca), etc.
pull/439/head
Samet SARIKAYA 2 months ago
parent e96fc7ed4d
commit c9fe2e345f

@ -7,9 +7,9 @@
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Author:
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> October, 2020</small>
<small> Ekim, 2020</small>
</sub>
</div>
@ -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 = <h1>This is a JSX element</h1>
const rootElement = document.getElementById('root')
const jsxElement = <h1>This is a JSX element</h1>;
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 = <h2>Getting Started React</h2>
const title = <h2>Getting Started React</h2>;
```
Önceki JSX'e daha fazla içerik ekleyelim ve adını header olarak değiştirelim.
@ -282,7 +280,7 @@ const header = (
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
</header>
)
);
```
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 = (
<header>
@ -302,10 +300,10 @@ const header = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
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 = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
// JSX element, main
const main = (
@ -339,14 +337,14 @@ const main = (
<li>JavaScript</li>
</ul>
</main>
)
);
// JSX element, footer
const footer = (
<footer>
<p>Copyright 2020</p>
</footer>
)
);
// JSX element, app, a container or a parent
const app = (
@ -355,12 +353,12 @@ const app = (
{main}
{footer}
</div>
)
);
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 = (
<header style={headerStyles}>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -394,12 +392,12 @@ const header = (
<small>Oct 2, 2020</small>
</div>
</header>
)
);
// JSX element, main
const mainStyles = {
backgroundColor: '#F3F0F5',
}
backgroundColor: "#F3F0F5",
};
const main = (
<main style={mainStyles}>
<p>Prerequisite to get started react.js:</p>
@ -409,30 +407,30 @@ const main = (
<li>JavaScript</li>
</ul>
</main>
)
);
const footerStyles = {
backgroundColor: '#61DBFB',
}
backgroundColor: "#61DBFB",
};
// JSX element, footer
const footer = (
<footer style={footerStyles}>
<p>Copyright 2020</p>
</footer>
)
);
// JSX element, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
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 = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -454,14 +452,14 @@ const header = (
<small>Date: Oct 1, 2020</small>
</div>
</header>
)
);
// JSX element, main
const main = (
<main>
<div className='main-wrapper'>
<div className="main-wrapper">
<p>
Prerequisite to get started{' '}
Prerequisite to get started{" "}
<strong>
<em>react.js</em>
</strong>
@ -474,29 +472,29 @@ const main = (
</ul>
</div>
</main>
)
);
// JSX element, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
)
);
// JSX element, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
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 = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -532,37 +530,37 @@ const header = (
<small>Date: {date}</small>
</div>
</header>
)
);
const numOne = 3
const numTwo = 2
const numOne = 3;
const numTwo = 2;
const result = (
<p>
{numOne} + {numTwo} = {numOne + numTwo}
</p>
)
);
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 = (
<p>
{' '}
{" "}
{author.firstName} {author.lastName} is {age} years old
</p>
)
);
// JSX element, main
const techs = ['HTML', 'CSS', 'JavaScript']
const techsFormatted = techs.map((tech) => <li>{tech}</li>)
const techs = ["HTML", "CSS", "JavaScript"];
const techsFormatted = techs.map((tech) => <li>{tech}</li>);
// JSX element, main
const main = (
<main>
<div className='main-wrapper'>
<div className="main-wrapper">
<p>
Prerequisite to get started{' '}
Prerequisite to get started{" "}
<strong>
<em>react.js</em>
</strong>
@ -573,31 +571,31 @@ const main = (
{personAge}
</div>
</main>
)
);
const copyRight = 'Copyright 2020'
const copyRight = "Copyright 2020";
// JSX element, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>{copyRight}</p>
</div>
</footer>
)
);
// JSX element, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
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 = (
<div>
<img src={asabenehImage} alt='asabeneh image' />
<img src={asabenehImage} alt="asabeneh image" />
</div>
)
);
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 = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -657,43 +655,43 @@ const header = (
<small>Date: {date}</small>
</div>
</header>
)
);
const numOne = 3
const numTwo = 2
const numOne = 3;
const numTwo = 2;
const result = (
<p>
{numOne} + {numTwo} = {numOne + numTwo}
</p>
)
);
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 = (
<p>
{' '}
{" "}
{author.firstName} {author.lastName} is {age} years old
</p>
)
);
// JSX element, main
const techs = ['HTML', 'CSS', 'JavaScript']
const techsFormatted = techs.map((tech) => <li>{tech}</li>)
const techs = ["HTML", "CSS", "JavaScript"];
const techsFormatted = techs.map((tech) => <li>{tech}</li>);
const user = (
<div>
<img src={asabenehImage} alt='asabeneh image' />
<img src={asabenehImage} alt="asabeneh image" />
</div>
)
);
// JSX element, main
const main = (
<main>
<div className='main-wrapper'>
<div className="main-wrapper">
<p>
Prerequisite to get started{' '}
Prerequisite to get started{" "}
<strong>
<em>react.js</em>
</strong>
@ -705,31 +703,31 @@ const main = (
{user}
</div>
</main>
)
);
const copyRight = 'Copyright 2020'
const copyRight = "Copyright 2020";
// JSX element, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>{copyRight}</p>
</div>
</footer>
)
);
// JSX element, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
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)

@ -7,9 +7,9 @@
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Author:
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> October, 2020</small>
<small> Ekim, 2020</small>
</sub>
</div>
@ -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 = <tag> Content </tag>
const jsx = <tag> Content </tag>;
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 = (
<header style={headerStyles}>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -150,19 +150,19 @@ const header = (
<small>Oct 3, 2020</small>
</div>
</header>
)
);
// React Component
const Header = () => {
return header
}
return header;
};
// ya da doğrudan JSX döndürebiliriz
const Header = () => {
return (
<header style={headerStyles}>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -170,14 +170,14 @@ const Header = () => {
<small>Oct 3, 2020</small>
</div>
</header>
)
}
);
};
// Yukarıdaki kod şu şekilde de yazılabilir
// JSX açıkça döndürülüyor
const Header = () => (
<header style={headerStyles}>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -185,7 +185,7 @@ const Header = () => (
<small>Oct 3, 2020</small>
</div>
</header>
)
);
```
### 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 = () => (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -210,25 +210,25 @@ const Header = () => (
<small>Oct 3, 2020</small>
</div>
</header>
)
);
const rootElement = document.getElementById('root')
const rootElement = document.getElementById("root");
// JSX elementini ReactDOM paketiyle render ediyoruz
ReactDOM.render(<Header />, rootElement)
ReactDOM.render(<Header />, 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 = () => (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
@ -236,27 +236,27 @@ const Header = () => (
<small>Oct 3, 2020</small>
</div>
</header>
)
);
// User Card Component
const UserCard = () => (
<div className='user-card'>
<img src={asabenehImage} alt='asabeneh image' />
<div className="user-card">
<img src={asabenehImage} alt="asabeneh image" />
<h2>Asabeneh Yetayeh</h2>
</div>
)
);
// TechList Component
const TechList = () => {
const techs = ['HTML', 'CSS', 'JavaScript']
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>)
return techsFormatted
}
const techs = ["HTML", "CSS", "JavaScript"];
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>);
return techsFormatted;
};
// Main Component
const Main = () => (
<main>
<div className='main-wrapper'>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList />
@ -264,29 +264,29 @@ const Main = () => (
<UserCard />
</div>
</main>
)
);
// Footer Component
const Footer = () => (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
)
);
// App, yani üst veya kapsayıcı bileşen
const App = () => (
<div className='app'>
<div className="app">
<Header />
<Main />
<Footer />
</div>
)
);
const rootElement = document.getElementById('root')
const rootElement = document.getElementById("root");
// App bileşenini ReactDOM paketiyle render ediyoruz
ReactDOM.render(<App />, rootElement)
ReactDOM.render(<App />, rootElement);
```
![Rendering Components](../../images/rendering_componnets.png)
@ -298,21 +298,21 @@ ReactDOM.render(<App />, 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 (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -322,32 +322,32 @@ const header = () => {
<small>Date: {date}</small>
</div>
</header>
)
}
const rootElement = document.getElementById('root')
);
};
const rootElement = document.getElementById("root");
// App bileşenini ReactDOM paketiyle render ediyoruz
ReactDOM.render(<Header />, rootElement)
ReactDOM.render(<Header />, 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 = () => (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -357,48 +357,48 @@ const Header = () => (
<small>Date: {date}</small>
</div>
</header>
)
);
const numOne = 3
const numTwo = 2
const numOne = 3;
const numTwo = 2;
const result = (
<p>
{numOne} + {numTwo} = {numOne + numTwo}
</p>
)
);
const yearBorn = 1820
const currentYear = 2020
const age = currentYear - yearBorn
const yearBorn = 1820;
const currentYear = 2020;
const age = currentYear - yearBorn;
const personAge = (
<p>
{' '}
{" "}
{author.firstName} {author.lastName} is {age} years old
</p>
)
);
// User Card Component
const UserCard = () => (
<div className='user-card'>
<img src={asabenehImage} alt='asabeneh image' />
<div className="user-card">
<img src={asabenehImage} alt="asabeneh image" />
<h2>
{author.firstName} {author.lastName}
</h2>
</div>
)
);
// JSX elementi, main
const techs = ['HTML', 'CSS', 'JavaScript']
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>)
const techs = ["HTML", "CSS", "JavaScript"];
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>);
// JSX elementi, main
const Main = () => (
<main>
<div className='main-wrapper'>
<div className="main-wrapper">
<div>
<p>
Prerequisite to get started{' '}
Prerequisite to get started{" "}
<strong>
<em>react.js</em>
</strong>
@ -411,30 +411,30 @@ const Main = () => (
<UserCard />
</div>
</main>
)
);
const copyRight = '2020'
const copyRight = "2020";
// JSX elementi, footer
const Footer = () => (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>Copyright &copy;{copyRight}</p>
</div>
</footer>
)
);
// JSX elementi, app
const app = () => (
<div className='app'>
<div className="app">
<Header />
<Main />
<Footer />
</div>
)
);
// App bileşenini ReactDOM paketiyle render ediyoruz
ReactDOM.render(<App />, rootElement)
ReactDOM.render(<App />, rootElement);
```
### Functional Component'lere Daha Fazla Bakış
@ -442,7 +442,7 @@ ReactDOM.render(<App />, 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 = () => <button>action</button>
const Button = () => <button>action</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 = () => <button style={buttonStyles}> action </button>
};
const Button = () => <button style={buttonStyles}> action </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 = () => <div>{hexaColor()}</div>
const HexaColor = () => <div>{hexaColor()}</div>;
const rootElement = document.getElementById('root')
const rootElement = document.getElementById("root");
// App bileşenini ReactDOM paketiyle render ediyoruz
ReactDOM.render(<HexaColor />, rootElement)
ReactDOM.render(<HexaColor />, rootElement);
```
# Egzersizler: Bileşenler

File diff suppressed because it is too large Load Diff

@ -0,0 +1,288 @@
<div align="center">
<h1> 30 Days Of React: Dizileri Haritalama (Mapping Arrays) </h1>
<a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/">
<img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social">
</a>
<a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> Ekim, 2020</small>
</sub>
</div>
[<< 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 (
<div className="container">
<div>
<h1>Numbers List</h1>
{[1, 2, 3, 4, 5]}
</div>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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) => <li>{number}</li>);
return list;
};
// App component (Bileşeni)
const App = () => {
const numbers = [1, 2, 3, 4, 5];
return (
<div className="container">
<div>
<h1>Numbers List</h1>
<ul>
<Numbers numbers={numbers} />
</ul>
</div>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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] }) => (
<li>
{tech} {level}
</li>
);
// Skills Component (Bileşeni)
const Skills = ({ skills }) => {
const skillsList = skills.map((skill) => <Skill skill={skill} />);
console.log(skillsList);
return <ul>{skillsList}</ul>;
};
const App = () => {
return (
<div className="container">
<div>
<h1>Skills Level</h1>
<Skills skills={skills} />
</div>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div>
<h1>{name}</h1>
<small>{city}</small>
</div>
);
};
// Countries component (Bileşeni)
const Countries = ({ countries }) => {
const countryList = countries.map((country) => <Country country={country} />);
return <div>{countryList}</div>;
};
// App component (Bileşeni)
const App = () => (
<div className="container">
<div>
<h1>Countries List</h1>
<Countries countries={countries} />
</div>
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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) => <li key={num}>{num}</li>);
return list;
};
const App = () => {
const numbers = [1, 2, 3, 4, 5];
return (
<div className="container">
<div>
<h1>Numbers List</h1>
<ul>
<Numbers numbers={numbers} />
</ul>
</div>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div>
<h1>{name}</h1>
<small>{city}</small>
</div>
);
};
// Countries component (Bileşeni)
const Countries = ({ countries }) => {
const countryList = countries.map((country) => (
<Country key={country.name} country={country} />
));
return <div>{countryList}</div>;
};
const App = () => (
<div className="container">
<div>
<h1>Countries List</h1>
<Countries countries={countries} />
</div>
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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)

@ -0,0 +1,844 @@
<div align="center">
<h1> 30 Days Of React: Class Component (Sınıf Tabanlı Bileşenler) </h1>
<a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/">
<img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social">
</a>
<a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> Ekim, 2020</small>
</sub>
</div>
[<< 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 = () => (
<header>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
<p>Asabeneh Yetayeh</p>
<small>Oct 6, 2020</small>
</div>
</header>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<Header />, 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 (
<header>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
<p>Asabeneh Yetayeh</p>
<small>Oct 7, 2020</small>
</div>
</header>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<Header />, 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 (
<header>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
<p>Asabeneh Yetayeh</p>
<small>Oct 7, 2020</small>
</div>
</header>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<Header />, 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) => <li key={tech}>{tech}</li>);
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) => <li key={tech}>{tech}</li>);
return techsFormatted;
}
}
// Main Component (Bileşeni)
// Fonksiyonel Component
const Main = () => (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList />
</ul>
</div>
</main>
);
// Main Component (Bileşeni)
// Class Component
class Main extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList />
</ul>
</div>
</main>
);
}
}
// Footer Component (Bileşeni)
// Fonksiyonel component
const Footer = () => (
<footer>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
);
// Footer Component (Bileşeni)
// Class component
class Footer extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<footer>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
);
}
}
// Ana uygulama veya üst (parent) veya kapsayıcı (container) component
// Fonksiyonel Component
const App = () => (
<div className="app">
<Header />
<Main />
<Footer />
</div>
);
// Ana uygulama veya üst (parent) veya kapsayıcı (container) component
// Class Component
class App extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="app">
<Header />
<Main />
<Footer />
</div>
);
}
}
```
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 (
<header>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
<p>Asabeneh Yetayeh</p>
<small>Oct 7, 2020</small>
</div>
</header>
);
}
}
// 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) => <li key={tech}>{tech}</li>);
return techsFormatted;
}
}
// Main Component (Bileşeni)
// Class Component
class Main extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList />
</ul>
</div>
</main>
);
}
}
// Footer Component (Bileşeni)
// Class component
class Footer extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<footer>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
);
}
}
// Ana uygulama veya üst (parent) veya kapsayıcı (container) component
// Class Component
class App extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="app">
<Header />
<Main />
<Footer />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>{this.props.data.welcome}</h1>
<h2>{this.props.data.title}</h2>
<h3>
{this.props.data.author.firstName} {this.props.data.author.lastName}
</h3>
<small>{this.props.data.date}</small>
</div>
</header>
);
}
}
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 (
<div className="app">
<Header data={data} />
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
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 (
<div className="app">
<Header data={data} />
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
// 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) => <li key={tech}>{tech}</li>);
return techsFormatted;
}
}
// Main Component (Bileşeni)
// Class Component
class Main extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList techs={this.props.techs} />
</ul>
</div>
</main>
);
}
}
// Footer Component (Bileşeni)
// Class component
class Footer extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<footer>
<div className="footer-wrapper">
<p>Copyright {this.props.date.getFullYear()}</p>
</div>
</footer>
);
}
}
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 (
<div className="app">
<Header data={data} />
<Main techs={techs} />
<Footer date={new Date()} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
<p>Asabeneh Yetayeh</p>
<small>Oct 7, 2020</small>
<button onClick={this.greetPeople}> Greet </button>
</div>
</header>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<Header />, 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 } }) => (
<div className="user-card">
<img src={image} alt={firstName} />
<h2>
{firstName}
{lastName}
</h2>
</div>
);
// Düğme component'i
const Button = ({ text, onClick, style }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
// 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) => <li key={tech}>{tech}</li>);
return techsFormatted;
}
}
// Main Component (Bileşeni)
// Class Component
class Main extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList techs={this.props.techs} />
</ul>
<UserCard user={this.props.user} />
<Button
text="Greet People"
onClick={this.props.greetPeople}
style={buttonStyles}
/>
<Button
text="Show Time"
onClick={this.props.handleTime}
style={buttonStyles}
/>
</div>
</main>
);
}
}
// Footer Component (Bileşeni)
// Class component
class Footer extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<footer>
<div className="footer-wrapper">
<p>Copyright {this.props.date.getFullYear()}</p>
</div>
</footer>
);
}
}
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 (
<div className="app">
<Header data={data} />
<Main
user={user}
techs={techs}
handleTime={this.handleTime}
greetPeople={this.greetPeople}
/>
<Footer date={new Date()} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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)

@ -0,0 +1,518 @@
<div align="center">
<h1> 30 Days Of React: State (Durum)</h1>
<a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/">
<img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social">
</a>
<a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> Ekim, 2020</small>
</sub>
</div>
[<< 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 (
<div className="App">
<h1>{count} </h1>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div className="App">
<h1>{count} </h1>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Add One
</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div className="App">
<h1>{count} </h1>
<div>
<button
onClick={() => this.setState({ count: this.state.count + 1 })}
>
Add One
</button>{" "}
<button
onClick={() => this.setState({ count: this.state.count - 1 })}
>
Minus One
</button>
</div>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div className="App">
<h1>{count} </h1>
<div>
<button className="btn btn-add" onClick={this.addOne}>
+1
</button>{" "}
<button className="btn btn-minus" onClick={this.minusOne}>
-1
</button>
</div>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<div className="App">
<h1>30 Days Of React</h1>
<div className="animal">
<img src={this.state.image} alt="animal" />
</div>
<button onClick={this.changeAnimal} class="btn btn-add">
Change
</button>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 } }) => (
<div className="user-card">
<img src={image} alt={firstName} />
<h2>
{firstName}
{lastName}
</h2>
</div>
);
// Düğme component'i
const Button = ({ text, onClick, style }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header style={this.props.styles}>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
const Count = ({ count, addOne, minusOne }) => (
<div>
<h1>{count} </h1>
<div>
<Button text="+1" onClick={addOne} style={buttonStyles} />
<Button text="-1" onClick={minusOne} style={buttonStyles} />
</div>
</div>
);
// 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) => <li key={tech}>{tech}</li>);
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 (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList techs={techs} />
</ul>
<UserCard user={user} />
<Button
text="Greet People"
onClick={greetPeople}
style={buttonStyles}
/>
<Button text="Show Time" onClick={handleTime} style={buttonStyles} />
<Button
text="Change Background"
onClick={changeBackground}
style={buttonStyles}
/>
<Count count={count} addOne={addOne} minusOne={minusOne} />
</div>
</main>
);
}
}
// Footer Component (Bileşeni)
// Class component
class Footer extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<footer>
<div className="footer-wrapper">
<p>Copyright {this.props.date.getFullYear()}</p>
</div>
</footer>
);
}
}
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 (
<div className="app">
{this.state.backgroundColor}
<Header data={data} />
<Main
user={user}
techs={techs}
handleTime={this.handleTime}
greetPeople={this.greetPeople}
changeBackground={this.changeBackground}
addOne={this.addOne}
minusOne={this.minusOne}
count={this.state.count}
/>
<Footer date={new Date()} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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)

@ -0,0 +1,783 @@
<div align="center">
<h1> 30 Days Of React: Koşullu Render (Conditional Rendering)</h1>
<a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/">
<img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social">
</a>
<a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> Ekim, 2020</small>
</sub>
</div>
[<< 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
<p>Select a country for your next holiday</p>
</div>
</header>
);
}
}
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 = <h3>Welcome to 30 Days Of React</h3>;
} else {
status = <h3>Please Login</h3>;
}
return (
<div className="app">
<Header data={data} />
{status}
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
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 = <h1>Welcome to 30 Days Of React</h1>;
text = "Logout";
} else {
status = <h3>Please Login</h3>;
text = "Login";
}
return (
<div className="app">
<Header data={data} />
{status}
<Button text={text} style={buttonStyles} onClick={this.handleLogin} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
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 ? (
<h1>Welcome to 30 Days Of React</h1>
) : (
<h3>Please Login</h3>
);
return (
<div className="app">
<Header data={data} />
{status}
<Button
text={this.state.loggedIn ? "Logout" : "Login"}
style={buttonStyles}
onClick={this.handleLogin}
/>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
const Login = () => (
<div>
<h3>Please Login</h3>
</div>
);
const Welcome = (props) => (
<div>
<h1>Welcome to 30 Days Of React</h1>
</div>
);
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 ? <Welcome /> : <Login />;
return (
<div className="app">
<Header data={data} />
{status}
<Button
text={this.state.loggedIn ? "Logout" : "Login"}
style={buttonStyles}
onClick={this.handleLogin}
/>
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// 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 (
<header style={this.props.styles}>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
const Login = () => (
<div>
<h3>Please Login</h3>
</div>
);
const Welcome = (props) => (
<div>
<h1>Welcome to 30 Days Of React</h1>
</div>
);
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 ? <Welcome /> : <Login />;
return (
<div className="app">
<Header data={data} />
{status}
<Button
text={loggedIn ? "Logout" : "Login"}
style={buttonStyles}
onClick={this.handleLogin}
/>
{techs.length === 3 && (
<p>You have all the prerequisite courses to get started React</p>
)}
{!loggedIn && (
<p>
Please login to access more information about 30 Days Of React
challenge
</p>
)}
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header style={this.props.styles}>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
const Message = ({ message }) => (
<div>
<h1>{message}</h1>
</div>
);
const Login = () => (
<div>
<h3>Please Login</h3>
</div>
);
const Welcome = (props) => (
<div>
<h1>Welcome to 30 Days Of React</h1>
</div>
);
// Düğme component'i
const Button = ({ text, onClick, style }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// TechList Component (Bileşeni)
// class tabanlı component
class TechList extends React.Component {
render() {
const { techs } = this.props;
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>);
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 ? <Welcome /> : <Login />;
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList techs={this.props.techs} />
</ul>
{techs.length === 3 && (
<p>You have all the prerequisite courses to get started React</p>
)}
<div>
<Button
text="Show Time"
onClick={handleTime}
style={buttonStyles}
/>{" "}
<Button
text="Greet People"
onClick={greetPeople}
style={buttonStyles}
/>
{!loggedIn && (
<p>
Please login to access more information about 30 Days Of React
challenge
</p>
)}
</div>
<div style={{ margin: 30 }}>
<Button
text={loggedIn ? "Logout" : "Login"}
style={buttonStyles}
onClick={handleLogin}
/>
<br />
{status}
</div>
<Message message={message} />
</div>
</main>
);
}
}
// 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 (
<footer>
<div className="footer-wrapper">
<p>Copyright {this.props.date.getFullYear()}</p>
</div>
</footer>
);
}
}
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 (
<div className="app">
<Header data={data} />
<Main
techs={techs}
handleTime={this.handleTime}
greetPeople={this.greetPeople}
loggedIn={this.state.loggedIn}
handleLogin={this.handleLogin}
message={this.state.message}
/>
<Footer date={new Date()} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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)

@ -0,0 +1,620 @@
<div align="center">
<h1> 30 Days Of React: React Proje Klasör Yapısı (Project Folder Structure)</h1>
<a class="header-badge" target="_blank" href="https://www.linkedin.com/in/asabeneh/">
<img src="https://img.shields.io/badge/style--5eba00.svg?label=LinkedIn&logo=linkedin&style=social">
</a>
<a class="header-badge" target="_blank" href="https://twitter.com/Asabeneh">
<img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/asabeneh?style=social">
</a>
<sub>Yazar:
<a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> Ekim, 2020</small>
</sub>
</div>
[<< 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ıı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 = () => <h1>Welcome to 30 Days Of React</h1>;
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 = () => <h1>Welcome to 30 Days Of React</h1>
```
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 = () => <h1>Welcome to 30 Days Of React</h1>
```
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 <h1>Welcome to 30 Days Of React</h1>
}
```
Ş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(<App />, 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 = () => <h1>Welcome to 30 Days Of React</h1>
```
```js
// src/App.js
import React from 'react
// default export, normal fonksiyon
export default function App () {
return <h1>Welcome to 30 Days Of React</h1>
}
```
```js
// src/App.js
// Çoğu durumda önerilen yöntem
import React from 'react
const App = () => <h1>Welcome to 30 Days Of React</h1>
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(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
}
}
const Country = ({
country: { name, capital, flag, languages, population, currency },
}) => {
const formatedCapital =
capital.length > 0 ? (
<>
<span>Capital: </span>
{capital}
</>
) : (
""
);
const formatLanguage = languages.length > 1 ? `Languages` : `Language`;
return (
<div className="country">
<div className="country_flag">
<img src={flag} alt={name} />
</div>
<h3 className="country_name">{name.toUpperCase()}</h3>
<div class="country_text">
<p>{formatedCapital}</p>
<p>
<span>{formatLanguage}: </span>
{languages.join(", ")}
</p>
<p>
<span>Population: </span>
{population.toLocaleString()}
</p>
<p>
<span>Currency: </span>
{currency}
</p>
</div>
</div>
);
};
// User Card Component (Bileşeni)
const UserCard = () => (
<div className="user-card">
<img src={asabenehImage} alt="asabeneh image" />
<h2>Asabeneh Yetayeh</h2>
</div>
);
// 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 = () => <div>{hexaColor()}</div>;
const Message = ({ message }) => (
<div>
<h1>{message}</h1>
</div>
);
const Login = () => (
<div>
<h3>Please Login</h3>
</div>
);
const Welcome = (props) => (
<div>
<h1>Welcome to 30 Days Of React</h1>
</div>
);
// Düğme component'i
const Button = ({ text, onClick, style }) => (
<button style={style} onClick={onClick}>
{text}
</button>
);
// TechList Component (Bileşeni)
// class tabanlı component
class TechList extends React.Component {
render() {
const { techs } = this.props;
const techsFormatted = techs.map((tech) => <li key={tech}>{tech}</li>);
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 ? <Welcome /> : <Login />;
return (
<main>
<div className="main-wrapper">
<p>Prerequisite to get started react.js:</p>
<ul>
<TechList techs={this.props.techs} />
</ul>
{techs.length === 3 && (
<p>You have all the prerequisite courses to get started React</p>
)}
<div>
<Button
text="Show Time"
onClick={handleTime}
style={buttonStyles}
/>{" "}
<Button
text="Greet People"
onClick={greetPeople}
style={buttonStyles}
/>
{!loggedIn && (
<p>
Please login to access more information about 30 Days Of React
challenge
</p>
)}
</div>
<div style={{ margin: 30 }}>
<Button
text={loggedIn ? "Logout" : "Login"}
style={buttonStyles}
onClick={handleLogin}
/>
<br />
{status}
</div>
<Message message={message} />
</div>
</main>
);
}
}
// 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 (
<footer>
<div className="footer-wrapper">
<p>Copyright {this.props.date.getFullYear()}</p>
</div>
</footer>
);
}
}
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 (
<div className="app">
{this.state.backgroundColor}
<Header data={data} />
<Main
techs={techs}
handleTime={this.handleTime}
greetPeople={this.greetPeople}
loggedIn={this.state.loggedIn}
handleLogin={this.handleLogin}
message={this.state.message}
/>
<Footer date={new Date()} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, 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 (
<header>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
<p>
{firstName} {lastName}
</p>
<small>{date}</small>
</div>
</header>
);
};
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 (
<Fragment>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</Fragment>
);
};
const RequiredSkills = () => {
return (
<ul>
<Skills />
</ul>
);
};
```
Fragment modülünü React'tan şu şekilde çıkarmak da mümkündür:
```js
import React from "react";
const Skills = () => {
return (
<React.Fragment>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</React.Fragment>
);
};
const RequiredSkills = () => {
return (
<ul>
<Skills />
</ul>
);
};
```
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 (
<>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript</li>
</>
);
};
const RequiredSkills = () => {
return (
<ul>
<Skills />
</ul>
);
};
```
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 <h1> 30 Days of React </h1>;
}
}
```
```js
import React, { Component } from "react";
// Bu önerilen yöntemdir
class App extends Component {
render() {
return <h1> 30 Days of React </h1>;
}
}
```
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)

@ -15,15 +15,21 @@
</a>
<sub>Yazar: <a href="https://www.linkedin.com/in/asabeneh/" target="_blank">Asabeneh Yetayeh</a><br>
<small> October, 2020</small></sub>
<small> Ekim, 2020</small></sub>
</div>
[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) |

Loading…
Cancel
Save