chore(turkish): Gün 12-13 çevirisi eklendi (Formlar, Kontrolsüz Input)

pull/439/head
Samet SARIKAYA 3 months ago
parent b41fab0c57
commit f0233bd9c5

@ -111,9 +111,9 @@ JSX, JavaScript XML anlamına gelir. JSX, JavaScript kodu içinde HTML elementle
// JSX sözdizimi
// JSX ile tırnak işareti kullanmamıza gerek yoktur
const jsxElement = <h1>I am a JSX element</h1>
const welcome = <h1>Welcome to 30 Days of React Challenge</h1>
const data = <small>Oct 2, 2020</small>
const jsxElement = <h1>I am a JSX element</h1>;
const welcome = <h1>Welcome to 30 Days of React Challenge</h1>;
const data = <small>Oct 2, 2020</small>;
```
Yukarıdaki garip görünen kod, JavaScript gibi görünse de JavaScript değildir; HTML gibi görünse de tamamen bir HTML elementi değildir. JavaScript ile HTML elementlerinin bir karışımıdır. JSX, JavaScript içinde HTML kullanmamıza olanak tanır. Yukarıdaki JSX'teki HTML elementleri _h1_ ve _small_'dur.
@ -125,13 +125,13 @@ Yukarıdaki örnekte gördüğünüz gibi, JSX'in JavaScript ve HTML'e benzer bi
Bu JSX elementi yalnızca bir HTML elementine sahiptir: _h1_.
```js
const jsxElement = <h1>I am a JSX element</h1> // JS ile HTML
const jsxElement = <h1>I am a JSX element</h1>; // JS ile HTML
```
Şimdi title adlı yeni bir değişken ve _h2_ içinde content tanımlayarak daha fazla JSX elementi oluşturalım.
```js
const title = <h2>Getting Started React</h2>
const title = <h2>Getting Started React</h2>;
```
Bu JSX elementine ek HTML elementleri ekleyerek alt başlıklar ve diğer içerikler ekleyelim. Geçerli bir JSX elementi oluşturmak için her HTML elementinin bir dış HTML elementi tarafından sarılması gerekir. JSX elementimiz uygulamanın başlık kısmının neredeyse tamamını içerdiği için title değişkeninin adı da header olarak değiştirilmelidir.
@ -143,7 +143,7 @@ const header = (
<h2>Getting Started React</h2>
<h3>JavaScript Library</h3>
</header>
)
);
```
Yazar adı ve yılı görüntülemek için daha fazla element ekleyelim.
@ -157,7 +157,7 @@ const header = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
```
Gördüğünüz gibi _header_ elementi, tüm iç HTML elementlerinin üst elementidir ve JSX'in bir dış üst element tarafından sarılması gerekir. _header_ HTML elementi veya başka bir üst HTML elementi olmadan yukarıdaki JSX geçersizdir.
@ -247,7 +247,7 @@ Babel kütüphanesi belgemize bağlandı ve artık kullanabiliriz. Sonraki adım
></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
console.log(React)
console.log(React);
</script>
</body>
</html>
@ -280,14 +280,14 @@ Artık JSX ve JSX elementini biliyorsunuz. JSX elementini tarayıcıda render et
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// JSX elementi
const jsxElement = <h1>I am a JSX element</h1>
const jsxElement = <h1>I am a JSX element</h1>;
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
// ReactDOM'un render metodu var ve render metodu iki argüman alır
ReactDOM.render(jsxElement, rootElement)
ReactDOM.render(jsxElement, rootElement);
</script>
</body>
</html>
@ -321,7 +321,7 @@ Daha fazla içerik render edelim. Daha fazla içerik render etmek için JSX elem
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// JSX elementi
const header = (
@ -332,11 +332,11 @@ Daha fazla içerik render edelim. Daha fazla içerik render etmek için JSX elem
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
// ReactDOM'un render metodu var ve render metodu iki argüman alır
ReactDOM.render(header, rootElement)
ReactDOM.render(header, rootElement);
</script>
</body>
</html>
@ -359,7 +359,7 @@ const main = (
<li>JavaScript</li>
</ul>
</main>
)
);
```
Web sitesinin alt bilgi kısmı için JSX elementi.
@ -370,7 +370,7 @@ const footer = (
<footer>
<p>Copyright 2020</p>
</footer>
)
);
```
Artık üç JSX elementimiz var: header, main ve footer. Üç JSX elementinin tamamını render etmenin en iyi yolu, hepsini bir üst JSX elementi içine sarmak veya bir diziye koymaktır. Bir JSX elementini başka bir JSX elementi içine dahil etmek için süslü parantez {} kullanır ve içine JSX'in adını yazarız.
@ -385,7 +385,7 @@ const header = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
// Web sitesinin ana içerik kısmı için JSX elementi
const main = (
@ -397,14 +397,14 @@ const main = (
<li>JavaScript</li>
</ul>
</main>
)
);
// Web sitesinin alt bilgi kısmı için JSX elementi
const footer = (
<footer>
<p>Copyright 2020</p>
</footer>
)
);
// Tümünü içeren JSX elementi, bir kapsayıcı veya üst element
const app = (
@ -413,7 +413,7 @@ const app = (
{main}
{footer}
</div>
)
);
```
Şimdi her şeyi bir araya getirelim ve tarayıcıya render edelim. [Code pen'de canlı](https://codepen.io/Asabeneh/full/MWwbYWg).
@ -441,7 +441,7 @@ const app = (
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// JSX elementi, header
const header = (
@ -452,7 +452,7 @@ const app = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
// JSX elementi, main
const main = (
@ -464,14 +464,14 @@ const app = (
<li>JavaScript</li>
</ul>
</main>
)
);
// JSX elementi, footer
const footer = (
<footer>
<p>Copyright 2020</p>
</footer>
)
);
// JSX elementi, app, bir kapsayıcı veya üst element
const app = (
@ -480,11 +480,11 @@ const app = (
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
// ReactDOM'un render metodu var ve render metodu iki argüman alır
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
// veya
// ReactDOM.render([header, main, footer], rootElement)
</script>
@ -509,7 +509,7 @@ Bir JSX elementine stil eklemek için satır içi stil veya className kullanır
```js
const header = (
<header
style={{ border: '2px solid orange', color: 'black', fontSize: '18px' }}
style={{ border: "2px solid orange", color: "black", fontSize: "18px" }}
>
<h1>Welcome to 30 Days Of React</h1>
<h2>Getting Started React</h2>
@ -517,11 +517,11 @@ const header = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
// veya şu şekilde de yazabiliriz
const style = { border: '2px solid orange', color: 'black', fontSize: '18px' }
const style = { border: "2px solid orange", color: "black", fontSize: "18px" };
const header = (
<header style={style}>
@ -531,7 +531,7 @@ const header = (
<p>Asabeneh Yetayeh</p>
<small>Oct 2, 2020</small>
</header>
)
);
```
Uygulamanızı geliştirirken her şeyin yolunda gidip gitmediğini kontrol etmek için tarayıcı konsolunu açık tutmak iyi bir pratiktir.
@ -541,13 +541,13 @@ Oluşturduğumuz tüm JSX elementlerini stilleyelim: header, main ve footer. Uyg
JSX elementinde class yerine className kullanırız, çünkü class JavaScript'te ayrılmış bir sözcüktür. Benzer şekilde, label etiketinde for yerine htmlFor kullanılır. Aşağıdaki örneğe bakın.
```js
const title = <h1 className='title'>Getting Started React</h1>
const title = <h1 className="title">Getting Started React</h1>;
const inputField = (
<div>
<label htmlFor='firstname'>First Name</label>
<input type='text' id='firstname' placeholder='First Name' />
<label htmlFor="firstname">First Name</label>
<input type="text" id="firstname" placeholder="First Name" />
</div>
)
);
```
Input elementinde kullanılan id, stil amaçlı değil; label'ı input alanına bağlamak için kullanılmaktadır.
@ -581,20 +581,20 @@ Artık satır içi stil ve className kullanımını öğrendiniz. Tüm JSX eleme
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// stil
const headerStyles = {
backgroundColor: '#61DBFB',
fontFamily: 'Helvetica Neue',
backgroundColor: "#61DBFB",
fontFamily: "Helvetica Neue",
padding: 25,
lineHeight: 1.5,
}
};
// 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>
@ -602,12 +602,12 @@ Artık satır içi stil ve className kullanımını öğrendiniz. Tüm JSX eleme
<small>Oct 2, 2020</small>
</div>
</header>
)
);
// JSX elementi, main
const mainStyles = {
backgroundColor: '#F3F0F5',
}
backgroundColor: "#F3F0F5",
};
const main = (
<main style={mainStyles}>
<p>Prerequisite to get started react.js:</p>
@ -617,29 +617,29 @@ Artık satır içi stil ve className kullanımını öğrendiniz. Tüm JSX eleme
<li>JavaScript</li>
</ul>
</main>
)
);
const footerStyles = {
backgroundColor: '#61DBFB',
}
backgroundColor: "#61DBFB",
};
// JSX elementi, footer
const footer = (
<footer style={footerStyles}>
<p>Copyright 2020</p>
</footer>
)
);
// JSX elementi, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
</script>
</body>
</html>
@ -673,7 +673,7 @@ Stil nesnesi kullanmak yerine normal stil yöntemini kullanmak, yukarıdakinden
body {
height: 100%;
line-height: 1.5;
font-family: 'Montserrat';
font-family: "Montserrat";
font-weight: 300;
color: black;
}
@ -756,12 +756,12 @@ Stil nesnesi kullanmak yerine normal stil yöntemini kullanmak, yukarıdakinden
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// JSX elementi, 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>
@ -769,14 +769,14 @@ Stil nesnesi kullanmak yerine normal stil yöntemini kullanmak, yukarıdakinden
<small>Date: Oct 1, 2020</small>
</div>
</header>
)
);
// JSX elementi, 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>
@ -789,28 +789,28 @@ Stil nesnesi kullanmak yerine normal stil yöntemini kullanmak, yukarıdakinden
</ul>
</div>
</main>
)
);
// JSX elementi, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>Copyright 2020</p>
</div>
</footer>
)
);
// JSX elementi, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
</script>
</body>
</html>
@ -823,17 +823,17 @@ Stil nesnesi kullanmak yerine normal stil yöntemini kullanmak, yukarıdakinden
Şimdiye kadar JSX elementlerinde statik veriler kullandık; ancak farklı veri türlerini dinamik veri olarak da geçirebiliriz. Dinamik veriler; string, sayı, boolean, dizi veya nesne olabilir. Her veri türünü adım adım inceleyelim. JSX'e veri enjekte etmek için {} parantezini kullanırız.
```js
const welcome = 'Welcome to 30 Days Of React'
const title = 'Getting Started React'
const subtitle = 'JavaScript Library'
const authorFirstName = 'Asabeneh'
const authorLastName = 'Yetayeh'
const date = 'Oct 1, 2020'
const welcome = "Welcome to 30 Days Of React";
const title = "Getting Started React";
const subtitle = "JavaScript Library";
const authorFirstName = "Asabeneh";
const authorLastName = "Yetayeh";
const date = "Oct 1, 2020";
// JSX elementi, header
const header = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -843,7 +843,7 @@ const header = (
<small>Date: {date}</small>
</div>
</header>
)
);
```
Header JSX elementine benzer şekilde, main ve footer JSX elementlerine de veri enjeksiyonu uygulayabiliriz.
@ -853,19 +853,19 @@ Header JSX elementine benzer şekilde, main ve footer JSX elementlerine de veri
Bu bölümde yalnızca string'ler enjekte edeceğiz
```js
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 2, 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 2, 2020";
// JSX elementi, header
// JSX elementi, header
const header = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -875,25 +875,25 @@ const header = (
<small>Date: {date}</small>
</div>
</header>
)
);
```
##### JSX Elementine Sayı Enjekte Etme
```js
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 personAge = <p> {age}</p>
const yearBorn = 1820;
const currentYear = new Date().getFullYear();
const age = currentYear - yearBorn;
const personAge = <p> {age}</p>;
```
Yukarıdaki örnekte gördüğünüz gibi, aritmetik hesaplamalar ve üçlü işlemler yapmak mümkündür.
@ -903,14 +903,14 @@ Yukarıdaki örnekte gördüğünüz gibi, aritmetik hesaplamalar ve üçlü iş
Dizi örneği vermek için HTML, CSS, JavaScript'i bir diziye çevirelim ve aşağıdaki main JSX elementine enjekte edelim. Daha sonra liste render etme bölümünde daha ayrıntılı ele alacağız.
```js
const techs = ['HTML', 'CSS', 'JavaScript']
const techs = ["HTML", "CSS", "JavaScript"];
// JSX elementi, 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>
@ -919,7 +919,7 @@ const main = (
<ul>{techs}</ul>
</div>
</main>
)
);
```
##### JSX Elementine Nesne Enjekte Etme
@ -952,7 +952,7 @@ JSX'e string, sayı, boolean ve dizi verisi enjekte edebiliriz; ancak doğrudan
body {
height: 100%;
line-height: 1.5;
font-family: 'Montserrat';
font-family: "Montserrat";
font-weight: 300;
color: black;
}
@ -1034,21 +1034,21 @@ JSX'e string, sayı, boolean ve dizi verisi enjekte edebiliriz; ancak doğrudan
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
const rootElement = document.querySelector('.root')
const rootElement = document.querySelector(".root");
// JSX elementi, 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 elementi, header
const header = (
<header>
<div className='header-wrapper'>
<div className="header-wrapper">
<h1>{welcome}</h1>
<h2>{title}</h2>
<h3>{subtitle}</h3>
@ -1058,36 +1058,36 @@ JSX'e string, sayı, boolean ve dizi verisi enjekte edebiliriz; ancak doğrudan
<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 elementi, main
const techs = ['HTML', 'CSS', 'JavaScript']
const techs = ["HTML", "CSS", "JavaScript"];
// JSX elementi, 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>
@ -1098,30 +1098,30 @@ JSX'e string, sayı, boolean ve dizi verisi enjekte edebiliriz; ancak doğrudan
{personAge}
</div>
</main>
)
);
const copyRight = 'Copyright 2020'
const copyRight = "Copyright 2020";
// JSX elementi, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>{copyRight}</p>
</div>
</footer>
)
);
// JSX elementi, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
</script>
</body>
</html>
@ -1132,8 +1132,8 @@ JSX'e string, sayı, boolean ve dizi verisi enjekte edebiliriz; ancak doğrudan
Gördüğünüz gibi listeler tek satırda görünmektedir. Bu nedenle, JSX'e enjekte etmeden önce listeyi istediğimiz şekilde biçimlendirmeliyiz. Listeyi biçimlendirmek için JSX'e enjekte etmeden önce diziyi değiştirmeliyiz. _map_ kullanarak diziyi değiştirebiliriz. Bir React geliştirici olarak, fonksiyonel programlamayı (map, filter, reduce, find, some, every) çok iyi anlamalısınız. Fonksiyonel programlamayı iyi anlamıyorsanız, 1. güne bakın.
```js
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>);
```
Aşağıdaki kod örneğinde, liste artık liste elementleri içermekte ve düzgün biçimlendirilmiş durumdadır.
@ -1162,7 +1162,7 @@ Aşağıdaki kod örneğinde, liste artık liste elementleri içermekte ve düzg
body {
height: 100%;
line-height: 1.5;
font-family: 'Montserrat';
font-family: "Montserrat";
font-weight: 300;
color: black;
}
@ -1244,21 +1244,21 @@ Aşağıdaki kod örneğinde, liste artık liste elementleri içermekte ve düzg
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
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>
@ -1268,37 +1268,37 @@ Aşağıdaki kod örneğinde, liste artık liste elementleri içermekte ve düzg
<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 elementi, 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 elementi, 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>
@ -1309,30 +1309,30 @@ Aşağıdaki kod örneğinde, liste artık liste elementleri içermekte ve düzg
{personAge}
</div>
</main>
)
);
const copyRight = 'Copyright 2020'
const copyRight = "Copyright 2020";
// JSX elementi, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>{copyRight}</p>
</div>
</footer>
)
);
// JSX elementi, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
</script>
</body>
</html>
@ -1367,7 +1367,7 @@ Yukarıda gördüğünüz gibi, listeler artık düzgün biçimlendirilmiş duru
body {
height: 100%;
line-height: 1.5;
font-family: 'Montserrat';
font-family: "Montserrat";
font-weight: 300;
color: black;
}
@ -1450,21 +1450,21 @@ Yukarıda gördüğünüz gibi, listeler artık düzgün biçimlendirilmiş duru
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// HTML belgesinden root elementini almak için
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>
@ -1474,37 +1474,37 @@ Yukarıda gördüğünüz gibi, listeler artık düzgün biçimlendirilmiş duru
<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>
)
);
// 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">
<p>
Prerequisite to get started{' '}
Prerequisite to get started{" "}
<strong>
<em>react.js</em>
</strong>
@ -1515,30 +1515,30 @@ Yukarıda gördüğünüz gibi, listeler artık düzgün biçimlendirilmiş duru
{personAge}
</div>
</main>
)
);
const copyRight = 'Copyright 2020'
const copyRight = "Copyright 2020";
// JSX elementi, footer
const footer = (
<footer>
<div className='footer-wrapper'>
<div className="footer-wrapper">
<p>{copyRight}</p>
</div>
</footer>
)
);
// JSX elementi, app
const app = (
<div className='app'>
<div className="app">
{header}
{main}
{footer}
</div>
)
);
// JSX elementini ReactDOM paketi kullanarak render ediyoruz
ReactDOM.render(app, rootElement)
ReactDOM.render(app, rootElement);
</script>
</body>
</html>

@ -14,7 +14,7 @@
</div>
[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../../11_Day_Events/11_events.md)
[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../11_Gun_Olaylar/11_olaylar.md)
![30 Days of React banner](../../images/30_days_of_react_banner_day_10.jpg)
@ -65,8 +65,8 @@ Yukarıdaki kod parçasında App component'i bulunmaktadır. App component'ini k
```js
// src/App.js
import React from 'react'
const App = () => <h1>Welcome to 30 Days Of React</h1>
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.
@ -75,20 +75,20 @@ Named export yapmak için _let_ veya _const_'tan önce sadece _export_ anahtar k
```js
// src/App.js
import React from 'react'
import React from "react";
// ok fonksiyonunda named export
export const App = () => <h1>Welcome to 30 Days Of React</h1>
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'
import React from "react";
// normal fonksiyonda named export, function declaration
export function App() {
return <h1>Welcome to 30 Days Of React</h1>
return <h1>Welcome to 30 Days Of React</h1>;
}
```
@ -108,27 +108,27 @@ Named export'u gördük; şimdi default export ile uygulayalım. Bunu iki şekil
```js
// src/App.js
import React from 'react'
import React from "react";
// ok fonksiyonunda default export
const App = () => <h1>Welcome to 30 Days Of React</h1>
export default App
const App = () => <h1>Welcome to 30 Days Of React</h1>;
export default App;
```
```js
// src/App.js
import React from 'react'
import React from "react";
// default export, normal fonksiyon
export default function App() {
return <h1>Welcome to 30 Days Of React</h1>
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
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:
@ -473,7 +473,15 @@ src içinde components dizini oluşturalım; components içinde header dizini ol
// src/components/header/Header.js
import React from "react";
const Header = ({ data: { welcome, title, subtitle, author: { firstName, lastName }, date } }) => {
const Header = ({
data: {
welcome,
title,
subtitle,
author: { firstName, lastName },
date,
},
}) => {
return (
<header>
<div className="header-wrapper">
@ -616,4 +624,4 @@ Yakında
🎉 TEBRİKLER! 🎉
[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../../11_Day_Events/11_events.md)
[<< Gün 9](../09_Gun_Kosullu_Render/09_kosullu_render.md) | [Gün 11 >>](../11_Gun_Olaylar/11_olaylar.md)

@ -0,0 +1,239 @@
<div align="center">
<h1> 30 Days Of React: Olaylar (Events)</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 10](../10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md) | [Gün 12 >>](../12_Gun_Formlar/12_formlar.md)
![30 Days of React banner](../../images/30_days_of_react_banner_day_8.jpg)
- [Olaylar (Events)](#olaylar-events)
- [Olay (Event) Nedir?](#olay-event-nedir)
- [Egzersizler](#egzersizler)
- [Egzersizler: Seviye 1](#egzersizler-seviye-1)
- [Egzersizler: Seviye 2](#egzersizler-seviye-2)
- [Egzersizler: Seviye 3](#egzersizler-seviye-3)
# Olaylar (Events)
## Olay (Event) Nedir?
Bir olay (event), bir yazılım tarafından tanınan bir eylem veya oluşumdur. Olayı daha iyi anlamak için bilgisayar kullanırken yaptığımız günlük aktiviteleri düşünebiliriz: bir düğmeye tıklamak, bir görsel üzerinde fareyi gezdirmek, klavyeye basmak, fare tekerleğini kaydırmak vb. Bu bölümde yalnızca bazı fare ve klavye olaylarına odaklanacağız. React belgeleri [events (olaylar)](https://reactjs.org/docs/handling-events.html) hakkında zaten ayrıntılı bir not içermektedir.
React'te olay yönetimi (event handling), saf JavaScript kullanarak DOM öğeleri üzerindeki olay yönetimine çok benzer. React'te olay yönetimi ile saf JavaScript arasındaki bazı sözdizimi farklılıkları şunlardır:
- React olayları, küçük harf yerine camelCase kullanılarak isimlendirilir.
- JSX ile olay işleyiciye (event handler) bir string yerine bir fonksiyon geçirilir.
Olay yönetimini anlamak için bazı örneklere bakalım.
HTML'de olay yönetimi:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>30 Days Of React App</title>
</head>
<body>
<button>onclick="insanlariSelamla()">İnsanları Selamla</button>
<script>
const insanlariSelamla = () => {
alert('30 Günde React Meydan Okumasına Hoş Geldiniz')
}
</script>
</body>
</html>
```
React'te ise biraz farklıdır:
```js
import React from 'react'
// fonksiyonel component ise
const App = () => {
const insanlariSelamla = () => {
alert('30 Günde React Meydan Okumasına Hoş Geldiniz')
}
return <button onClick={insanlariSelamla}> </button>
}
```
```js
import React, { Component } from 'react'
// fonksiyonel component ise
class App extends Component {
insanlariSelamla = () => {
alert('30 Günde React Meydan Okumasına Hoş Geldiniz')
}
render() {
return <button onClick={this.insanlariSelamla}> </button>
}
}
```
HTML ve React olayları arasındaki bir diğer fark, React'te varsayılan davranışı engellemek için `false` döndürememenizdir. `preventDefault`'u açıkça çağırmanız gerekir. Örneğin, saf HTML'de yeni bir sayfanın açılmasını engellemek için şunlar yazılabilir:
Saf HTML:
```html
<a href="#" onclick="console.log('Bağlantıya tıklandı.'); return false">
Bana tıkla
</a>
```
Ancak React'te şu şekilde olabilir:
```js
import React, { Component } from 'react'
// fonksiyonel component ise
class App extends Component {
handleClick = () => {
alert('30 Günde React Meydan Okumasına Hoş Geldiniz')
}
render() {
return (
<a href='#' onClick={this.handleClick}>
Bana tıkla
</a>
)
}
}
```
Olay yönetimi çok geniş bir konudur ve bu meydan okumada en yaygın olay türlerine odaklanacağız. Aşağıdaki fare ve klavye olaylarını kullanabiliriz:
_onMouseMove, onMouseEnter, onMouseLeave, onMouseOut, onClick, onKeyDown, onKeyPress, onKeyUp, onCopy, onCut, onDrag, onChange, onBlur, onInput, onSubmit_
Birkaç fare ve klavye olayını daha uygulayalım:
```js
// index.js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
state = {
firstName: '',
message: '',
key: '',
}
handleClick = (e) => {
// e bir olay nesnesi verir
// e'nin değerini console.log(e) ile kontrol edin
this.setState({
message: 'Olaylar dünyasına hoş geldiniz',
})
}
// fare her hareket ettiğinde tetiklenir
handleMouseMove = (e) => {
this.setState({ message: 'fare hareket ediyor' })
}
// input alanı değer değiştirdiğinde değeri almak için
handleChange = (e) => {
this.setState({
firstName: e.target.value,
message: e.target.value,
})
}
// input alanına basıldığında klavye tuş kodunu almak için
// input ve textarea ile çalışır
handleKeyPress = (e) => {
this.setState({
message:
`${e.target.value} tuşuna basıldı ve tuş kodu: ` + e.charCode,
})
}
// Blur, fare bir input alanından ayrıldığında gerçekleşir
handleBlur = (e) => {
this.setState({ message: 'Input alanı odak kaybetti (blur)' })
}
// Bu olay bir metin kopyalama sırasında tetiklenir
handleCopy = (e) => {
this.setState({
message: '30 Günde React\'i ticari amaçlarla kullanmak yasaktır',
})
}
render() {
return (
<div>
<h1>Olaylar Dünyasına Hoş Geldiniz</h1>
<button onClick={this.handleClick}>Bana Tıkla</button>
<button onMouseMove={this.handleMouseMove}>Fareyi üzerime getir</button>
<p onCopy={this.handleCopy}>
Bu metni kopyalayarak telif hakkı iznini kontrol edin
</p>
<p>{this.state.message}</p>
<label htmlFor=''> onKeyPress Olayı Testi: </label>
<input type='text' onKeyPress={this.handleKeyPress} />
<br />
<label htmlFor=''> onBlur Olayı Testi: </label>
<input type='text' onBlur={this.handleBlur} />
<form onSubmit={this.handleSubmit}>
<div>
<label htmlFor='firstName'>Ad: </label>
<input
onChange={this.handleChange}
name='firstName'
value={this.state.value}
/>
</div>
<div>
<input type='submit' value='Gönder' />
</div>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
// JSX öğesini ReactDOM paketi ile render ediyoruz
ReactDOM.render(<App />, rootElement)
```
# Egzersizler
## Egzersizler: Seviye 1
1. Olay (event) nedir?
2. HTML öğe olayı ile React olayı arasındaki fark nedir?
3. En az 4 klavye olayı yazın.
4. En az 8 fare olayı yazın.
5. En yaygın fare ve klavye olayları nelerdir?
6. Input öğesine özgü bir olay yazın.
7. Form öğesine özgü bir olay yazın.
8. Body üzerinde fare hareket ederken görüntü alanının (viewport) koordinatlarını gösterin.
9. onInput, onChange ve onBlur arasındaki fark nedir?
10. onSubmit olayı nereye yerleştirilir?
## Egzersizler: Seviye 2
Aşağıdakini onMouseEnter olayını kullanarak uygulayın:
![onMouseEnter olayı](../../images/react_event_on_mouse_enter.gif)
## Egzersizler: Seviye 3
Yakında
🎉 TEBRİKLER! 🎉
[<< Gün 10](../10_Gun_Proje_Klasor_Yapisi/10_proje_klasor_yapisi.md) | [Gün 12 >>](../12_Gun_Formlar/12_formlar.md)

@ -0,0 +1,949 @@
<div align="center">
<h1> 30 Days Of React: Formlar (Forms)</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 11](../11_Gun_Olaylar/11_olaylar.md) | [Gün 13 >>](../13_Gun_Kontrollü_ve_Kontrolsüz_Input/13_kontrolsuz_input.md)
![30 Days of React banner](../../images/30_days_of_react_banner_day_12.jpg)
- [Formlar (Forms)](#formlar-forms)
- [Input Alanından Veri Almak](#input-alanından-veri-almak)
- [Formdan Birden Fazla Input Verisi Almak](#formdan-birden-fazla-input-verisi-almak)
- [Farklı Input Alan Türlerinden Veri Almak](#farklı-input-alan-türlerinden-veri-almak)
- [Form Doğrulama (Validation)](#form-doğrulama-validation)
- [Doğrulama Nedir?](#doğrulama-nedir)
- [Doğrulamanın Amacı Nedir?](#doğrulamanın-amacı-nedir)
- [Doğrulama Türleri](#doğrulama-türleri)
- [Egzersizler](#egzersizler)
- [Egzersizler: Seviye 1](#egzersizler-seviye-1)
- [Egzersizler: Seviye 2](#egzersizler-seviye-2)
- [Egzersizler: Seviye 3](#egzersizler-seviye-3)
# Formlar (Forms)
Form, kullanıcıdan veri toplamak için kullanılır. Zaman zaman bir kâğıt üzerinde ya da bir web sitesinde bilgilerimizi doldurmak için form kullanırız. Kayıt olmak, giriş yapmak veya bir işe başvurmak için farklı form alanlarını doldurarak verilerimizi uzak bir veritabanına göndeririz. Bir formu doldururken basit metin, e-posta, parola, telefon, tarih, onay kutusu (checkbox), radyo düğmesi, seçim kutusu ve metin alanı gibi farklı form alanlarıyla karşılaşırız. HTML5, oldukça fazla alan türü sunmaktadır. Aşağıdaki mevcut HTML5 input türlerine göz atabilirsiniz.
```html
<input type="text" />
<input type="number" />
<input type="range" />
<input type="email" />
<input type="password" />
<input type="tel" />
<input type="checkbox" />
<input type="radio" />
<input type="color" />
<input type="url" />
<input type="image" />
<input type="file" />
<input type="hidden" />
<input type="date" />
<input type="datetime-local" />
<input type="month" />
<input type="week" />
<input type="time" />
<input type="reset" />
<input type="search" />
<input type="submit" />
<input type="button" />
```
Formdan veri almak için kullanılan diğer HTML alanları arasında textarea ve seçenekli select öğesi yer alır.
```html
<textarea>Lütfen yorumunuzu yazın ...</textarea>
<select name="country">
<option value="">Ülkenizi seçin</option>
<option value="finland">Finlandiya</option>
<option value="sweden">İsveç</option>
<option value="denmark">Danimarka</option>
<option value="norway">Norveç</option>
<option value="iceland">İzlanda</option>
</select>
```
Artık bir formdan veri almak için ihtiyaç duyduğumuz alanların çoğunu biliyorsunuz. Metin tipinde bir input ile başlayalım. Bir önceki günde farklı olay türlerini gördük; bugün ise bir input alanının verisi değiştiğinde tetiklenen _onChange_ olay türüne odaklanacağız. Input alanı varsayılan olarak girilen veriyi hafızada tutar; ancak bu bölümde bunu state kullanarak kontrol edecek ve kontrollü (controlled) bir input uygulayacağız. Kontrolsüz (uncontrolled) input'u ayrı bir bölümde ele alacağız.
## Input Alanından Veri Almak
Şimdiye kadar input alanından herhangi bir veri almadık. Şimdi bir input alanından nasıl veri alacağımızı öğrenme zamanı. Kontrollü bir input'tan veri alabilmek için bir input alanına, olay dinleyicisine (onChange) ve state'e ihtiyacımız var. Aşağıdaki örneğe bakın. Input etiketinin altındaki h1 öğesi, input'a yazdığımız şeyi gösterir. Canlı [demo](https://codepen.io/Asabeneh/full/OJVpyqm)'ya bakabilirsiniz.
Input öğesinin value, name, id, placeholder, type ve olay işleyicisi gibi birçok niteliği (attribute) vardır. Buna ek olarak, bir label ile input alanını input alanının id'si ve etiketin htmlFor'u aracılığıyla ilişkilendirebiliriz. Label ve input ilişkilendirildiğinde, etikete tıklandığında input'a odaklanır. Aşağıdaki örneğe bakın.
```js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
// state tanımlama
// başlangıç state'i
state = {
firstName: '',
}
handleChange = (e) => {
const value = e.target.value
this.setState({ firstName: value })
}
render() {
/*
state değerine erişim ve
bu değer input'un value niteliğine enjekte edilecek
*/
const firstName = this.state.firstName
return (
<div className='App'>
<label htmlFor='firstName'>Ad: </label>
<input
type='text'
id='firstName'
name='firstName'
placeholder='Ad'
value={firstName}
onChange={this.handleChange}
/>
<h1>{this.state.firstName}</h1>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
Kullanıcı bilgilerini yönetmek için genellikle form kullanırız. Form bölümüne geçerek form öğesini kullanalım.
## Formdan Birden Fazla Input Verisi Almak
Bu bölümde kullanıcı bilgilerini toplayan küçük bir form geliştireceğiz. Kullanıcımız bir öğrencidir. Kullanıcı bilgilerini toplamak için üst (parent) bir form öğesi ve belirli sayıda input öğesi kullanacağız. Bunlara ek olarak form için (onSubmit) ve input'lar için (onChange) olay dinleyicilerimiz olacak. Aşağıdaki örneğe bakın, yorumları da incelemeye çalışın. Canlı [demo](https://codepen.io/Asabeneh/full/eYNvJda)'ya da bakabilirsiniz.
```js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
// başlangıç state'ini tanımlama
state = {
firstName: '',
lastName: '',
country: '',
title: '',
}
handleChange = (e) => {
/*
name ve value'yu şu şekilde alabiliriz: e.target.name, e.target.value
ya da e.target'tan name ve value'yu destructure edebiliriz
const name = e.target.name
const value = e.target.value
*/
const { name, value } = e.target
// bir nesnede anahtar olarak değişken adı kullanmak için [değişkenadı]
// name, input öğelerinin name niteliğine atıfta bulunur
this.setState({ [name]: value })
}
handleSubmit = (e) => {
/*
e.preventDefault()
form öğesinin varsayılan davranışını durdurur
özellikle sayfanın yenilenmesini engeller
*/
e.preventDefault()
/*
burası backend api'ye bağlandığımız ve
verinin veritabanına gönderildiği yerdir
*/
console.log(this.state)
}
render() {
// state'i destructure ederek state değerine erişim
const { firstName, lastName, title, country } = this.state
return (
<div className='App'>
<h3>Öğrenci Ekle</h3>
<form onSubmit={this.handleSubmit}>
<div>
<input
type='text'
name='firstName'
placeholder='Ad'
value={firstName}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='lastName'
placeholder='Soyad'
value={lastName}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='country'
placeholder='Ülke'
value={country}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='title'
placeholder='Ünvan'
value={title}
onChange={this.handleChange}
/>
</div>
<button class='btn btn-success'>Gönder</button>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
Yukarıdaki form yalnızca metin türlerini işlemektedir, ancak farklı input alanı türleri de mevcuttur. Tüm farklı input alanı türlerini işleyen başka bir form yapalım.
## Farklı Input Alan Türlerinden Veri Almak
```js
// index.js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
const options = [
{
value: '',
label: '-- Ülke Seçin --',
},
{
value: 'Finland',
label: 'Finlandiya',
},
{
value: 'Sweden',
label: 'İsveç',
},
{
value: 'Norway',
label: 'Norveç',
},
{
value: 'Denmark',
label: 'Danimarka',
},
]
// seçenekleri JSX option listesine (dizisine) eşleme
const selectOptions = options.map(({ value, label }) => (
<option value={value}> {label}</option>
))
class App extends React.Component {
// state tanımlama
state = {
firstName: '',
lastName: '',
email: '',
country: '',
tel: '',
dateOfBirth: '',
favoriteColor: '',
weight: '',
gender: '',
file: '',
bio: '',
skills: {
html: false,
css: false,
javascript: false,
},
}
handleChange = (e) => {
/*
name ve value'yu şu şekilde alabiliriz: e.target.name, e.target.value
ya da e.target'tan name ve value'yu destructure edebiliriz
const name = e.target.name
const value = e.target.value
*/
const { name, value, type, checked } = e.target
/*
[değişkenadı] — belirli bir değişkende saklanan değeri nesne için anahtar olarak kullanabiliriz; bu durumda state için bir anahtar
*/
if (type === 'checkbox') {
this.setState({
skills: { ...this.state.skills, [name]: checked },
})
} else if (type === 'file') {
console.log(type, 'buraya bakın')
this.setState({ [name]: e.target.files[0] })
} else {
this.setState({ [name]: value })
}
}
handleSubmit = (e) => {
/*
e.preventDefault()
form öğesinin varsayılan davranışını durdurur
özellikle sayfanın yenilenmesini engeller
*/
e.preventDefault()
const {
firstName,
lastName,
email,
tel,
dateOfBirth,
favoriteColor,
weight,
country,
gender,
bio,
file,
skills,
} = this.state
const formattedSkills = []
for (const key in skills) {
console.log(key)
if (skills[key]) {
formattedSkills.push(key.toUpperCase())
}
}
const data = {
firstName,
lastName,
email,
tel,
dateOfBirth,
favoriteColor,
weight,
country,
gender,
bio,
file,
skills: formattedSkills,
}
/*
burası backend api'ye bağlandığımız ve
verinin veritabanına gönderildiği yerdir
*/
console.log(data)
}
render() {
// state'i destructure ederek state değerine erişim
const {
firstName,
lastName,
email,
tel,
dateOfBirth,
favoriteColor,
weight,
country,
gender,
bio,
} = this.state
return (
<div className='App'>
<h3>Öğrenci Ekle</h3>
<form onSubmit={this.handleSubmit}>
<div className='row'>
<div className='form-group'>
<label htmlFor='firstName'>Ad </label>
<input
type='text'
name='firstName'
value={firstName}
onChange={this.handleChange}
placeholder='Ad'
/>
</div>
<div className='form-group'>
<label htmlFor='lastName'>Soyad </label>
<input
type='text'
name='lastName'
value={this.state.lastName}
onChange={this.handleChange}
placeholder='Soyad'
/>
</div>
<div className='form-group'>
<label htmlFor='email'>E-posta </label>
<input
type='email'
name='email'
value={email}
onChange={this.handleChange}
placeholder='E-posta'
/>
</div>
</div>
<div className='form-group'>
<label htmlFor='tel'>Telefon </label>
<input
type='tel'
name='tel'
value={tel}
onChange={this.handleChange}
placeholder='Tel'
/>
</div>
<div className='form-group'>
<label htmlFor='dateOfBirth'>Doğum tarihi </label>
<input
type='date'
name='dateOfBirth'
value={dateOfBirth}
onChange={this.handleChange}
placeholder='Doğum Tarihi'
/>
</div>
<div className='form-group'>
<label htmlFor='favoriteColor'>En Sevdiğiniz Renk</label>
<input
type='color'
id='color'
name='color'
value={favoriteColor}
onChange={this.handleChange}
placeholder='En Sevdiğiniz Renk'
/>
</div>
<div className='form-group'>
<label htmlFor='weight'>Kilo </label>
<input
type='number'
id='weight'
name='weight'
value={weight}
onChange={this.handleChange}
placeholder='Kg cinsinden kilo'
/>
</div>
<div>
<label htmlFor='country'>Ülke</label> <br />
<select name='country' onChange={this.handleChange} id='country'>
{selectOptions}
</select>
</div>
<div>
<p>Cinsiyet</p>
<div>
<input
type='radio'
id='female'
name='gender'
value='Female'
onChange={this.handleChange}
checked={gender === 'Female'}
/>
<label htmlFor='female'>Kadın</label>
</div>
<div>
<input
id='male'
type='radio'
name='gender'
value='Male'
onChange={this.handleChange}
checked={gender === 'Male'}
/>
<label htmlFor='male'>Erkek</label>
</div>
<div>
<input
id='other'
type='radio'
name='gender'
value='Other'
onChange={this.handleChange}
checked={gender === 'Other'}
/>
<label htmlFor='other'>Diğer</label>
</div>
</div>
<div>
<p>Becerilerinizi seçin</p>
<div>
<input
type='checkbox'
id='html'
name='html'
onChange={this.handleChange}
/>
<label htmlFor='html'>HTML</label>
</div>
<div>
<input
type='checkbox'
id='css'
name='css'
onChange={this.handleChange}
/>
<label htmlFor='css'>CSS</label>
</div>
<div>
<input
type='checkbox'
id='javascript'
name='javascript'
onChange={this.handleChange}
/>
<label htmlFor='javascript'>JavaScript</label>
</div>
</div>
<div>
<label htmlFor='bio'>Biyografi</label> <br />
<textarea
id='bio'
name='bio'
value={bio}
onChange={this.handleChange}
cols='120'
rows='10'
placeholder='Kendinizden bahsedin ...'
/>
</div>
<div>
<input type='file' name='file' onChange={this.handleChange} />
</div>
<div>
<button>Gönder</button>
</div>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
## Form Doğrulama (Validation)
## Doğrulama Nedir?
Doğrulama, bu durumda verinin geçerliliğini veya doğruluğunu kontrol etme ya da kanıtlama eylemi veya sürecidir.
## Doğrulamanın Amacı Nedir?
Doğrulamanın temel amacı, kullanıcılardan istenen veriyi elde etmektir. Bunun yanı sıra kötü niyetli kullanıcıları ve verileri engellemek amacıyla da kullanılır.
## Doğrulama Türleri
Doğrulama, istemci tarafında (client side) veya sunucu tarafında (server side) yapılabilir. Şu anda bir ön yüz teknolojisi olan React kullanıyoruz ve istemci tarafı doğrulaması uyguluyoruz. Doğrulama, HTML5'in yerleşik doğrulaması kullanılarak veya JavaScript (düzenli ifadeler / regular expression) kullanılarak uygulanabilir.
Aşağıdaki kod parçasında ilk alana bir doğrulama uygulanmıştır. Nasıl çalıştığını anlamaya çalışın. Input odaklanılmadığında geçerliliği kontrol etmek için onBlur olayı kullanılmıştır.
```js
// index.js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
const options = [
{
value: '',
label: '-- Ülke Seçin --',
},
{
value: 'Finland',
label: 'Finlandiya',
},
{
value: 'Sweden',
label: 'İsveç',
},
{
value: 'Norway',
label: 'Norveç',
},
{
value: 'Denmark',
label: 'Danimarka',
},
]
// seçenekleri JSX option listesine (dizisine) eşleme
const selectOptions = options.map(({ value, label }) => (
<option value={value}> {label}</option>
))
class App extends Component {
// state tanımlama
state = {
firstName: '',
lastName: '',
email: '',
country: '',
tel: '',
dateOfBirth: '',
favoriteColor: '',
weight: '',
gender: '',
file: '',
bio: '',
skills: {
html: false,
css: false,
javascript: false,
},
touched: {
firstName: false,
lastName: false,
},
}
handleChange = (e) => {
/*
name ve value'yu şu şekilde alabiliriz: e.target.name, e.target.value
ya da e.target'tan name ve value'yu destructure edebiliriz
const name = e.target.name
const value = e.target.value
*/
const { name, value, type, checked } = e.target
/*
[değişkenadı] — belirli bir değişkende saklanan değeri nesne için anahtar olarak kullanabiliriz; bu durumda state için bir anahtar
*/
if (type === 'checkbox') {
this.setState({
skills: { ...this.state.skills, [name]: checked },
})
} else if (type === 'file') {
this.setState({ [name]: e.target.files[0] })
} else {
this.setState({ [name]: value })
}
}
handleBlur = (e) => {
const { name, value } = e.target
this.setState({ touched: { ...this.state.touched, [name]: true } })
}
validate = () => {
// Hata geri bildirimlerini toplamak ve formda göstermek için nesne
const errors = {
firstName: '',
}
if (
(this.state.touched.firstName && this.state.firstName.length < 3) ||
(this.state.touched.firstName && this.state.firstName.length > 12)
) {
errors.firstName = 'Ad 2 ile 12 karakter arasında olmalıdır'
}
return errors
}
handleSubmit = (e) => {
/*
e.preventDefault()
form öğesinin varsayılan davranışını durdurur
özellikle sayfanın yenilenmesini engeller
*/
e.preventDefault()
const {
firstName,
lastName,
email,
country,
gender,
tel,
dateOfBirth,
favoriteColor,
weight,
bio,
file,
skills,
} = this.state
const formattedSkills = []
for (const key in skills) {
console.log(key)
if (skills[key]) {
formattedSkills.push(key.toUpperCase())
}
}
const data = {
firstName,
lastName,
email,
country,
gender,
tel,
dateOfBirth,
favoriteColor,
weight,
bio,
file,
skills: formattedSkills,
}
/*
burası backend api'ye bağlandığımız ve
verinin veritabanına gönderildiği yerdir
*/
console.log(data)
}
render() {
// state'i destructure ederek state değerine erişim
// formdaki noValidate niteliği HTML5'in yerleşik doğrulamasını devre dışı bırakır
const { firstName } = this.validate()
return (
<div className='App'>
<h3>Öğrenci Ekle</h3>
<form onSubmit={this.handleSubmit} noValidate>
<div className='row'>
<div className='form-group'>
<label htmlFor='firstName'>Ad </label>
<input
type='text'
name='firstName'
value={this.state.firstName}
onChange={this.handleChange}
onBlur={this.handleBlur}
placeholder='Ad'
/> <br />
<small>{firstName}</small>
</div>
<div className='form-group'>
<label htmlFor='lastName'>Soyad </label>
<input
type='text'
name='lastName'
value={this.state.lastName}
onChange={this.handleChange}
placeholder='Soyad'
/>
</div>
<div className='form-group'>
<label htmlFor='email'>E-posta </label>
<input
type='email'
name='email'
value={this.state.email}
onChange={this.handleChange}
placeholder='E-posta'
/>
</div>
</div>
<div className='form-group'>
<label htmlFor='tel'>Telefon </label>
<input
type='tel'
name='tel'
value={this.state.tel}
onChange={this.handleChange}
placeholder='Tel'
/>
</div>
<div className='form-group'>
<label htmlFor='dateOfBirth'>Doğum tarihi </label>
<input
type='date'
name='dateOfBirth'
value={this.state.dateOfBirth}
onChange={this.handleChange}
placeholder='Doğum Tarihi'
/>
</div>
<div className='form-group'>
<label htmlFor='favoriteColor'>En Sevdiğiniz Renk</label>
<input
type='color'
id='favoriteColor'
name='favoriteColor'
value={this.state.favoriteColor}
onChange={this.handleChange}
placeholder='En Sevdiğiniz Renk'
/>
</div>
<div className='form-group'>
<label htmlFor='weight'>Kilo </label>
<input
type='number'
id='weight'
name='weight'
value={this.state.weight}
onChange={this.handleChange}
placeholder='Kg cinsinden kilo'
/>
</div>
<div>
<label htmlFor='country'>Ülke</label> <br />
<select name='country' onChange={this.handleChange} id='country'>
{selectOptions}
</select>
</div>
<div>
<p>Cinsiyet</p>
<div>
<input
type='radio'
id='female'
name='gender'
value='Female'
onChange={this.handleChange}
checked={this.state.gender === 'Female'}
/>
<label htmlFor='female'>Kadın</label>
</div>
<div>
<input
id='male'
type='radio'
name='gender'
value='Male'
onChange={this.handleChange}
checked={this.state.gender === 'Male'}
/>
<label htmlFor='male'>Erkek</label>
</div>
<div>
<input
id='other'
type='radio'
name='gender'
value='Other'
onChange={this.handleChange}
checked={this.state.gender === 'Other'}
/>
<label htmlFor='other'>Diğer</label>
</div>
</div>
<div>
<p>Becerilerinizi seçin</p>
<div>
<input
type='checkbox'
id='html'
name='html'
onChange={this.handleChange}
/>
<label htmlFor='html'>HTML</label>
</div>
<div>
<input
type='checkbox'
id='css'
name='css'
onChange={this.handleChange}
/>
<label htmlFor='css'>CSS</label>
</div>
<div>
<input
type='checkbox'
id='javascript'
name='javascript'
onChange={this.handleChange}
/>
<label htmlFor='javascript'>JavaScript</label>
</div>
</div>
<div>
<label htmlFor='bio'>Biyografi</label> <br />
<textarea
id='bio'
name='bio'
value={this.state.bio}
onChange={this.handleChange}
cols='120'
rows='10'
placeholder='Kendinizden bahsedin ...'
/>
</div>
<div>
<input type='file' name='file' onChange={this.handleChange} />
</div>
<div>
<button>Gönder</button>
</div>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
# Egzersizler
## Egzersizler: Seviye 1
1. Formun önemi nedir?
2. Kaç tane input türü biliyorsunuz?
3. Bir input öğesinin en az dört niteliğini (attribute) belirtin.
4. htmlFor'un önemi nedir?
5. Örnekte verilmemiş bir input türü varsa onu yazın.
6. Kontrollü (controlled) input nedir?
7. Kontrollü bir input yazmak için neye ihtiyaç duyarsınız?
8. Bir input alanındaki değişiklikleri dinlemek için hangi olay türünü kullanırsınız?
9. İşaretlenmiş (checked) bir checkbox'ın değeri nedir?
10. onChange, onBlur, onSubmit'i ne zaman kullanırsınız?
11. Submit işleyici metodunun içine e.preventDefault() yazmanın amacı nedir?
12. React'te veriler nasıl bağlanır (data binding)? İlk input alanı örneği React'te veri bağlamadır.
13. Doğrulama (validation) nedir?
14. Bir input değiştiğinde dinlemek için hangi olay türünü kullanırsınız?
15. Bir input'u doğrulamak için hangi olay türlerini kullanırsınız?
## Egzersizler: Seviye 2
1. Yukarıda verilen formu doğrulayın (daha sonra bir gif görseli veya video sağlanacaktır). Önce herhangi bir kütüphane kullanmadan doğrulamayı deneyin, ardından [validator.js](https://www.npmjs.com/package/validator) ile deneyin.
## Egzersizler: Seviye 3
Yakında ..
🎉 TEBRİKLER! 🎉
[<< Gün 11](../11_Gun_Olaylar/11_olaylar.md) | [Gün 13 >>](../13_Gun_Kontrollü_ve_Kontrolsüz_Input/13_kontrolsuz_input.md)

@ -0,0 +1,177 @@
<div align="center">
<h1> 30 Days Of React: Kontrolsüz Bileşen (Uncontrolled Component)</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 12](../12_Gun_Formlar/12_formlar.md) | [Gün 14 >>](../../14_Day_Component_Life_Cycles/14_component_life_cycles.md)
![30 Days of React banner](../../images/30_days_of_react_banner_day_13.jpg)
- [Kontrolsüz Bileşenler (Uncontrolled Components)](#kontrolsüz-bileşenler-uncontrolled-components)
- [Kontrolsüz Input'tan Veri Almak](#kontrolsüz-inputtan-veri-almak)
- [Formdan Birden Fazla Input Verisi Almak](#formdan-birden-fazla-input-verisi-almak)
- [Egzersizler](#egzersizler)
- [Egzersizler: Seviye 1](#egzersizler-seviye-1)
# Kontrolsüz Bileşenler (Uncontrolled Components)
Bir önceki gün meydan okumada kontrollü (controlled) input'ları ele aldık. React'te çoğu zaman, [React'in resmi belgelerinde](https://reactjs.org/docs/uncontrolled-components.html) önerildiği şekilde kontrollü input'lar kullanılır.
Kontrolsüz bir bileşen yazmak için, her state güncellemesi için bir olay işleyicisi yazmak yerine, DOM'dan form değerlerini almak amacıyla bir ref kullanabilirsiniz. Kontrolsüz input'ta, geleneksel HTML form veri yönetimine benzer şekilde input alanlarından veri alırız.
Kontrolsüz bileşen örneği:
## Kontrolsüz Input'tan Veri Almak
```js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
firstName = React.createRef()
handleSubmit = (e) => {
e.preventDefault()
console.log(this.firstName.current.value)
}
render() {
return (
<div className='App'>
<form onSubmit={this.handleSubmit}>
<label htmlFor='firstName'>Ad: </label>
<input
type='text'
id='firstName'
name='firstName'
placeholder='Ad'
ref={this.firstName}
/>
<button type='submit'>Gönder</button>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
## Formdan Birden Fazla Input Verisi Almak
DOM'dan birden fazla input verisi alabiliriz. DOM'u doğrudan hedeflemiyoruz; React, ref kullanarak DOM'dan veri alıyor.
```js
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class App extends Component {
firstName = React.createRef()
lastName = React.createRef()
country = React.createRef()
title = React.createRef()
handleSubmit = (e) => {
// form öğesinin varsayılan davranışını, özellikle sayfanın yenilenmesini durdurur
e.preventDefault()
console.log(this.firstName.current.value)
console.log(this.lastName.current.value)
console.log(this.title.current.value)
console.log(this.country.current.value)
const data = {
firstName: this.firstName.current.value,
lastName: this.lastName.current.value,
title: this.title.current.value,
country: this.country.current.value,
}
// burası backend api'ye bağlandığımız ve veriyi veritabanına gönderdiğimiz yerdir
console.log(data)
}
render() {
return (
<div className='App'>
<h3>Öğrenci Ekle</h3>
<form onSubmit={this.handleSubmit}>
<div>
<input
type='text'
name='firstName'
placeholder='Ad'
ref={this.firstName}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='lastName'
placeholder='Soyad'
ref={this.lastName}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='country'
placeholder='Ülke'
ref={this.country}
onChange={this.handleChange}
/>
</div>
<div>
<input
type='text'
name='title'
placeholder='Ünvan'
ref={this.title}
onChange={this.handleChange}
/>
</div>
<button className='btn btn-success'>Gönder</button>
</form>
</div>
)
}
}
const rootElement = document.getElementById('root')
ReactDOM.render(<App />, rootElement)
```
Çoğu zaman kontrolsüz input yerine kontrollü input kullanılır. DOM üzerindeki bir öğeyi hedeflemek istediğinizde, o öğenin içeriğini almak için ref kullanırsınız. Saf JavaScript kullanarak DOM'a doğrudan dokunmayın. Bir React uygulaması geliştirirken DOM'u doğrudan değiştirmeyin; çünkü React'in DOM manipülasyonunu yönetmek için kendi yolu vardır.
# Egzersizler
## Egzersizler: Seviye 1
1. Kontrollü (controlled) input nedir?
2. Kontrolsüz (uncontrolled) input nedir?
3. React'te belirli bir HTML öğesinin içeriğini nasıl alırsınız?
4. React'te DOM'a doğrudan dokunmak neden iyi bir fikir değildir?
5. React'te en sık ne kullanılır? Kontrollü mu yoksa kontrolsüz input mu?
6. Kontrolsüz input yazmak için neye ihtiyaç duyarsınız?
7. Kontrolsüz input yazmak için state gerekli midir?
8. Kontrolsüz input'u ne zaman kullanırsınız?
9. Kontrollü input'u ne zaman kullanırsınız?
10. Form input alanlarını doğrulamak için kontrollü mu yoksa kontrolsüz input mu kullanırsınız?
🎉 TEBRİKLER! 🎉
[<< Gün 12](../12_Gun_Formlar/12_formlar.md) | [Gün 14 >>](../../14_Day_Component_Life_Cycles/14_component_life_cycles.md)

@ -33,3 +33,6 @@
| 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) |
| 11 | [Olaylar](./11_Gun_Olaylar/11_olaylar.md) |
| 12 | [Formlar](./12_Gun_Formlar/12_formlar.md) |
| 13 | [Kontrollü ve Kontrolsüz Input](./13_Gun_Kontrollü_ve_Kontrolsüz_Input/13_kontrolsuz_input.md) |

Loading…
Cancel
Save