diff --git a/Turkish/15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md b/Turkish/15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md index c49f64d..aabaab2 100644 --- a/Turkish/15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md +++ b/Turkish/15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md @@ -14,7 +14,7 @@ -[<< Gün 14](../14_Gun_Bilesen_Yasam_Donguleri/14_bilesen_yasam_donguleri.md) | [Gün 16 >>](../../16_Higher_Order_Component/16_higher_order_component.md) +[<< Gün 14](../14_Gun_Bilesen_Yasam_Donguleri/14_bilesen_yasam_donguleri.md) | [Gün 16 >>](../16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md) ![30 Days of React banner](../../images/30_days_of_react_banner_day_15.jpg) @@ -447,4 +447,4 @@ _classnames_ ve _validator_ paketlerini de nasıl kullanacağınızı öğrenmey 🎉 TEBRİKLER! 🎉 -[<< Gün 14](../14_Gun_Bilesen_Yasam_Donguleri/14_bilesen_yasam_donguleri.md) | [Gün 16 >>](../../16_Higher_Order_Component/16_higher_order_component.md) +[<< Gün 14](../14_Gun_Bilesen_Yasam_Donguleri/14_bilesen_yasam_donguleri.md) | [Gün 16 >>](../16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md) diff --git a/Turkish/16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md b/Turkish/16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md new file mode 100644 index 0000000..ad86a9f --- /dev/null +++ b/Turkish/16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md @@ -0,0 +1,212 @@ +
+

30 Days Of React: Yüksek Düzey Bileşen (Higher Order Component)

+ + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
+ Ekim, 2020 +
+ +
+ +[<< Gün 15](../15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md) | [Gün 17 >>](../17_Gun_React_Router/17_react_router.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_16.jpg) + +- [Yüksek Düzey Bileşen (Higher Order Component)](#yüksek-düzey-bileşen-higher-order-component) +- [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# Yüksek Düzey Bileşen (Higher Order Component) + +Yüksek düzey bileşen (Higher Order Component) terimi, JavaScript'teki yüksek düzey fonksiyon (higher order function) kavramına benzerdir. JavaScript'te yüksek düzey fonksiyon; başka bir fonksiyonu parametre olarak alan veya başka bir fonksiyon döndüren fonksiyondur. + +Yüksek düzey fonksiyona benzer şekilde, yüksek düzey bileşen bir bileşen alır ve başka bir bileşen döndürür. +Bu tanım örneklerle daha anlamlı hale gelecektir. Daha iyi anlamak için aşağıdaki örneğe bakın. + +```js +// Yüksek Düzey Bileşen (HOC) yazmanın bir yolu +import React from 'react' +const higherOrderComponent = (Component) => { + return (props) => { + return + } +} +``` + +Çoğu zaman üçüncü taraf kütüphaneler yüksek düzey bileşen kullanır. Örneğin redux, react-router-dom ve material-ui yüksek düzey bileşen kullanır. + +```js +import React from 'react' + +const Button = ({ onClick, text, style }) => { + return ( + + ) +} + +const buttonWithStyle = (CompParam) => { + const buttonStyles = { + backgroundColor: '#61dbfb', + padding: '10px 25px', + border: 'none', + borderRadius: 5, + margin: 3, + cursor: 'pointer', + fontSize: 18, + color: 'white', + } + return (props) => { + return + } +} +const NewButton = buttonWithSuperPower(Button) + +class App extends Component { + render() { + return ( +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +buttonWithStyle yüksek düzey bileşenini bileşene ek olarak daha fazla parametre alacak şekilde geliştirelim. + +```js +import React from 'react' + +const Button = ({ onClick, text, style }) => { + return ( + + ) +} + +const buttonWithStyles = (CompParam, name = 'default') => { + const colors = [ + { + name: 'default', + backgroundColor: '#e7e7e7', + color: '#000000', + }, + { + name: 'react', + backgroundColor: '#61dbfb', + color: '#ffffff', + }, + { + name: 'success', + backgroundColor: '#4CAF50', + color: '#ffffff', + }, + { + name: 'info', + backgroundColor: '#2196F3', + color: '#ffffff', + }, + { + name: 'warning', + backgroundColor: '#ff9800', + color: '#ffffff', + }, + { + name: 'danger', + backgroundColor: '#f44336', + color: '#ffffff', + }, + ] + const { backgroundColor, color } = colors.find((c) => c.name === name) + + const buttonStyles = { + backgroundColor, + padding: '10px 45px', + border: 'none', + borderRadius: 3, + margin: 3, + cursor: 'pointer', + fontSize: '1.25rem', + color, + } + return (props) => { + return + } +} + +const NewButton = buttonWithSuperPower(Button) +const ReactButton = buttonWithSuperPower(Button, 'react') +const InfoButton = buttonWithSuperPower(Button, 'info') +const SuccessButton = buttonWithSuperPower(Button, 'success') +const WarningButton = buttonWithSuperPower(Button, 'warning') +const DangerButton = buttonWithSuperPower(Button, 'danger') + +class App extends Component { + render() { + return ( +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Yukarıdaki örnek, Yüksek Düzey Bileşenin bir kullanım durumudur. Ancak kullanım alanı yalnızca basit bir butonu şekillendirmekle sınırlı değildir. Çok daha fazla kullanım alanı vardır; bileşeni yeniden kullanmamıza ve bir bileşeni stil ve işlevsellikle geliştirmemize olanak tanır. İlerleyen bölümlerde React Router'ı ele alacağız ve HOC kullanacağız; bir bileşenin başka bir bileşeni sardığını gördüğünüzde şaşırmayacaksınız. + +# Egzersizler + +## Egzersizler: Seviye 1 + +1. Yüksek düzey fonksiyon nedir? +2. Yüksek Düzey Bileşen nedir? +3. Yüksek düzey fonksiyon ile yüksek düzey bileşen arasındaki fark nedir? +4. Yüksek düzey bileşen bir bileşeni geliştirmemizi sağlar. (Doğru mu Yanlış mı?) + +## Egzersizler: Seviye 2 + +1. Tüm input türlerini yönetebilen bir yüksek düzey bileşen oluşturun. + +## Egzersizler: Seviye 3 + +Yakında + +🎉 TEBRİKLER! 🎉 + +[<< Gün 15](../15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md) | [Gün 17 >>](../17_Gun_React_Router/17_react_router.md) diff --git a/Turkish/17_Gun_React_Router/17_react_router.md b/Turkish/17_Gun_React_Router/17_react_router.md new file mode 100644 index 0000000..7d351e3 --- /dev/null +++ b/Turkish/17_Gun_React_Router/17_react_router.md @@ -0,0 +1,1030 @@ +
+

30 Days Of React: React Router

+ + + + + Twitter Follow + + +Yazar: +Asabeneh Yetayeh
+ Ekim, 2020 +
+ +
+ +[<< Gün 16](../16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md) | [Gün 18 >>](../../18_Fetch_And_Axios/18_fetch_axios.md) + +![30 Days of React banner](../../images/30_days_of_react_banner_day_17.jpg) + +- [React Router](#react-router) + - [React Router Nedir?](#react-router-nedir) + - [BrowserRouter](#browserrouter) + - [Route](#route) + - [Switch](#switch) + - [NavLink](#navlink) + - [İç İçe Yönlendirme (Nested Routing)](#i̇ç-i̇çe-yönlendirme-nested-routing) + - [Redirect](#redirect) + - [Prompt](#prompt) +- [Egzersizler](#egzersizler) + - [Egzersizler: Seviye 1](#egzersizler-seviye-1) + - [Egzersizler: Seviye 2](#egzersizler-seviye-2) + - [Egzersizler: Seviye 3](#egzersizler-seviye-3) + +# React Router + +## React Router Nedir? + +Route veya router kelimesini daha önce duymamış olabilirsiniz ve burada tanımlamak gerekebilir. Route kelimesinin gerçek anlamı bir yol veya bir yere ulaşmanın yoludur. React'teki anlamı da gerçek anlama benzerdir. React Router, React bileşenleri arasında gezinmeyi (navigate) sağlayan bir React bileşenidir. + +Bu bölümde React router'ın nasıl kullanılacağına dair başlangıç yapacaksınız, ancak yeterince geniş bir kapsam olmayabilir. React Router'ın resmi web sitesinden öğrenmek isterseniz [buradan](https://reactrouter.com/web/guides/quick-start) erişebilirsiniz. + +Daha önce belirttiğimiz üzere React, tüm uygulamada yalnızca bir index.html sayfasının bulunduğu tek sayfalı bir uygulamadır (single page application). React Router uygulandığında, farklı bileşenler farklı mantık ve koşullara göre aynı anda veya farklı zamanlarda index.html sayfasında render edilir. React Router'ın farklı sürümleri vardır ve en son sürümü React Router 5'tir. Bu meydan okuma için React Router sürüm 4 kullanacağız. React Router paketlerini yükleyerek başlayalım. + +```js +Asabeneh@DESKTOP-KGC1AKC MINGW64 ~/Desktop/30-days-of-react$ npm install react-router-dom +``` + +Önceki günlerde oluşturduğumuz şablon kodları kullanarak basit bir yönlendirme uygulayalım. Her şeyden önce _react-router-dom_'u import edin, ardından yönlendirme için ihtiyaç duyduğumuz tüm bileşenleri react-router-dom'dan çıkarabilirsiniz. + +```js +import React from 'react' +import { + BrowserRouter, + Route, + NavLink, + Switch, + Redirect, + Prompt, + withRouter, +} from 'react-router-dom' +``` + +Her projede bu bileşenlerin tamamına ihtiyaç duymayabiliriz, ancak var olduklarını bilmek faydalıdır. + +## BrowserRouter + +BrowserRouter, uygulama route'unu sarmak için kullanılan üst bileşendir. BrowserRouter kullanarak tarayıcı geçmişine (history) erişebiliriz. Bazen Router olarak yeniden adlandırılabilir. + +```js +import React from 'react' +import { BrowserRouter as Router } from 'react-router-dom' +``` + +BrowserRouter'ı bir React uygulaması için navigasyon oluşturmakta kullanalım. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router } from 'react-router-dom' + +class App extends Component { + render() { + return ( + +
+

React Router DOM

+
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Uygulamamızı BrowserRouter veya Router ile sardık ve her zamanki gibi sorunsuz çalışıyor. Home, About, Contact, Challenge bileşenlerini oluşturalım ve farklı bileşenlere route ekleyelim. Bileşenlere ek olarak react-router-dom'dan Route bileşenini de import etmemiz gerekiyor. + +## Route + +Route bileşeni bileşenler arasında gezinmeyi sağlar. Bir bileşenden diğerine giden bir yoldur. +Route bileşeninin iki zorunlu prop'u vardır: path ve component veya render. +path prop'u bileşenin render edileceği yeri, component prop'u ise o belirli path'te render edilecek bileşeni belirtir. Bileşeninizi görmek için /home route'unu isteyin. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+ +class App extends Component { + render() { + return ( + +
+ +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Route'umuza birkaç bileşen daha ekleyelim. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+ + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Yukarıdaki örnekte görüldüğü gibi tüm route'larda eğik çizgi (/) var. Home'u genellikle yalnızca eğik çizgiyle (/) oluştururuz, o zaman home için eğik çizgiyi (/) kullanalım. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+ + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Artık / veya /about yazarak gezinmeye çalışırsanız her zaman ana sayfayı göreceksiniz. Ana sayfa route'u (/) diğer route'larda da ortak olduğundan her zaman görünür. Bunu önlemek için bir yol bulalım. Üç farklı şekilde çözebiliriz. Biri exact niteliği ile. /about/ gibi URL'nin sondaki eğik çizgiyle (/about/) bitmesini istemiyorsak, exact'e ek olarak strict niteliğini de kullanabiliriz. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+ + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +URL'nin sonda eğik çizgiyle bitmesini, örneğin (/about/), istemiyorsak exact'e ek olarak strict niteliğini kullanabiliriz. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+ + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Ana sayfanın sürekli görünmesini engellemenin diğer yolu, yönlendirme sırasını ve Switch bileşenini değiştirmektir. Bunun için home route'unu en alta yerleştirmeniz yeterlidir. + +## Switch + +Switch bileşeni yalnızca bir bileşenin render edilmesine izin verir. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { BrowserRouter as Router, Route, Switch } from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+ + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Route hazır görünüyor ama şimdiye kadar her belirli route'u manuel olarak yazarak geziniyoruz. Her belirli route'a yönlendirilmek için NavLink bileşenini kullanalım. + +## NavLink + +NavLink bileşeni her bileşene gitmemizi sağlar. Zorunlu bir to prop'u alır. NavLink, anchor etiketinin üzerindeki bir bileşendir. Bir NavLink'e tıklamak sayfa yenilenmesi yapmaz; bu, router kullanmanın en büyük avantajlarından biridir. Aşağıdaki örneğe bakın. Önce ana sayfa için bir navigasyon uygulayalım. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+
    +
  • + Ana Sayfa +
  • +
+ + + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Şimdi tüm bileşenler için navigasyonu uygulayalım. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) + +class App extends Component { + render() { + return ( + +
+
    +
  • + Ana Sayfa +
  • +
  • + Hakkında +
  • +
  • + İletişim +
  • +
  • + Meydan Okumalar +
  • +
+ + + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Route ve navigasyonumuz, route bulunduğu sürece mükemmel çalışıyor. Ancak bir route bulunamazsa son bileşene düşüyor. Bu sorunu önlemek için ayrı bir "sayfa bulunamadı" bileşeni oluşturup yönlendirmemize ekleyelim. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) +const NotFound = (props) =>

Aradığınız sayfa bulunamadı

+class App extends Component { + render() { + return ( + +
+
    +
  • + Ana Sayfa +
  • +
  • + Hakkında +
  • +
  • + İletişim +
  • +
  • + Meydan Okumalar +
  • +
+ + + + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Navigasyondan sorumlu ayrı bir bileşen oluşturalım. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni +const Challenges = (props) => ( +
+

30 Günde React Meydan Okuması

+
+) +const NotFound = (props) =>

Aradığınız sayfa bulunamadı

+const Navbar = () => ( +
    +
  • + Ana Sayfa +
  • +
  • + Hakkında +
  • +
  • + İletişim +
  • +
  • + Meydan Okumalar +
  • +
+) +class App extends Component { + render() { + return ( + +
+ + + + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +## İç İçe Yönlendirme (Nested Routing) + +React Router kullanarak basit bir navigasyon uyguladık. Şimdi route'ların iç içe nasıl yerleştirileceğini görelim. React'te iç içe route kullanmak mümkündür. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+// Challenge bileşeni + +const challenges = [ + { + name: '30 Günde Python', + description: + '30 Günde Python meydan okuması, 30 günde Python öğrenmek için adım adım bir rehberdir.', + status: 'tamamlandı', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '20 Kas 2019 - 20 Ara 2019', + slug: 'pyhton', + url: + 'https://github.com/Asabeneh/30-Days-Of-Python', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 Günde JavaScript', + description: + '30 Günde JavaScript meydan okuması, 30 günde JavaScript öğrenmek için adım adım bir rehberdir.', + status: 'tamamlandı', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '1 Oca 2020 - 30 Oca 2020', + slug: 'javascript', + url: 'https://github.com/Asabeneh/30-Days-Of-JavaScript', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 Günde React', + description: + '30 Günde React meydan okuması, 30 günde React öğrenmek için adım adım bir rehberdir.', + status: 'devam ediyor', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '1 Eki 2020 - 30 Eki 2020', + slug: 'react', + url: 'https://github.com/Asabeneh/30-Days-Of-React', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 HTML ve CSS', + description: + '30 Günde HTML ve CSS meydan okuması, 30 günde HTML ve CSS öğrenmek için adım adım bir rehberdir.', + status: 'yakında', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '', + slug: 'html-and-css', + url: '', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 ReactNative', + description: + '30 Günde ReactNative meydan okuması, 30 günde ReactNative öğrenmek için adım adım bir rehberdir.', + status: 'yakında', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '', + slug: 'reactnative', + url: '', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 Veri Analizi', + description: + '30 Günde Veri Analizi meydan okuması, 30 günde veri, veri görselleştirme ve veri analizi öğrenmek için adım adım bir rehberdir.', + status: 'yakında', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '', + slug: 'data-analysis', + url: '', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, + { + name: '30 Makine Öğrenmesi', + description: + '30 Günde Makine Öğrenmesi meydan okuması, 30 günde veri temizleme, makine öğrenmesi modelleri ve tahminler öğrenmek için adım adım bir rehberdir.', + status: 'yakında', + days: 30, + level: 'Başlangıçtan İleri Seviyeye', + duration: '', + slug: 'machine-learning', + url: '', + author: { + firstName: 'Asabeneh', + lastName: 'Yetayeh', + }, + }, +] + +const Challenge = ({ + challenge: { + name, + description, + status, + days, + level, + duration, + author: { firstName, lastName }, + }, +}) => ( +
+

{name}

+

{level}

+

+ Yazar: {firstName} {lastName} +

+ {duration && ( + <> + {' '} + {duration}
+ + )} + Gün sayısı: {days} + +

{description}

+
+) + +const Challenges = (props) => { + const path = props.location.pathname + const slug = path.split('/').slice(path.split('/').length - 1)[0] + const challenge = challenges.find((challenge) => challenge.slug === slug) + + return ( +
+

30 Günde React Meydan Okuması

+
    + {challenges.map(({ name, slug }) => ( +
  • + {name} +
  • + ))} +
+ +

Meydan okumalardan birini seçin

} + /> + } + /> +
+
+ ) +} + +const NotFound = (props) =>

Aradığınız sayfa bulunamadı

+const Navbar = () => ( +
    +
  • + Ana Sayfa +
  • +
  • + Hakkında +
  • +
  • + İletişim +
  • +
  • + Meydan Okumalar +
  • +
+) +class App extends Component { + render() { + return ( + +
+ + + + + + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Bir sonraki bölümde Prompt, Redirect ve withRouter bileşenlerini ele alacağız. + +## Redirect + +Redirect, bazı koşullara bağlı olarak bir route'u belirli bir path'e yönlendirmemize yardımcı olabilir. Örneğin, kullanıcı giriş yaptıysa panele (dashboard), aksi takdirde giriş sayfasına yönlendiririz. Yukarıdaki kod parçasına sahte bir giriş sistemi ekleyelim. Kullanıcı giriş yaptıysa meydan okuma sayfasına, aksi takdirde giriş yapmasını öneren sayfaya yönlendirilecek. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, + Redirect, +} from 'react-router-dom' + +// Home bileşeni +const Home = (props) =>

Ana Sayfaya Hoş Geldiniz

+// About bileşeni +const About = (props) =>

Hakkımızda

+// Contact bileşeni +const Contact = (props) =>

Bize Ulaşın

+ +// challenges verisi (yukarıdaki ile aynı)... + +const User = ({ match, isLoggedIn, handleLogin }) => { + const username = match.params.username + return ( +
+ {isLoggedIn ? ( + <> +

Meydan okumaya hoş geldiniz, {username}

+ Artık tüm meydan okumalarda gezinebilirsiniz
+ + ) : ( +

Meydan okumalara erişmek için lütfen giriş yapın

+ )} + +
+ ) +} + +const Welcome = ({ handleLogin, isLoggedIn }) => { + return ( +
+ {isLoggedIn ? 'Meydan okumaya hoş geldiniz' :

Lütfen giriş yapın

} + +
+ ) +} +class App extends Component { + state = { + isLoggedIn: false, + firstName: 'Asabeneh', + } + handleLogin = () => { + this.setState({ + isLoggedIn: !this.state.isLoggedIn, + }) + } + render() { + return ( + +
+ + + + + ( + + )} + /> + ( + + )} + /> + { + return this.state.isLoggedIn ? ( + + ) : ( + + ) + }} + /> + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +## Prompt + +Bazen kullanıcı bir sayfayı terk etmeye çalıştığında, tamamlanmamış görevi olduğunu bildirmek isteyebiliriz. Bunun için Prompt bileşenini kullanabiliriz. Prompt bileşeni when ve message olmak üzere iki prop alır (``). Bunu önceki kodda uygulayalım. + +Aşağıdaki kodda when parametresi olmadan Prompt uygulanmıştır, dolayısıyla tüm route'ları kontrol edecektir. + +```js +import React, { Component } from 'react' +import ReactDOM from 'react-dom' +import { + BrowserRouter as Router, + Route, + Switch, + NavLink, + Redirect, + Prompt, +} from 'react-router-dom' + +// ...bileşenler ve veri burada... + +class App extends Component { + state = { + isLoggedIn: false, + firstName: 'Asabeneh', + } + handleLogin = () => { + this.setState({ + isLoggedIn: !this.state.isLoggedIn, + }) + } + render() { + return ( + +
+ + + + + + + ( + + )} + /> + ( + + )} + /> + { + return this.state.isLoggedIn ? ( + + ) : ( + + ) + }} + /> + + + +
+
+ ) + } +} + +const rootElement = document.getElementById('root') +ReactDOM.render(, rootElement) +``` + +Koşulsuz kullanım yerine, message içinde geri çağrı (callback) fonksiyonu kullanarak kullanıcıya gerçekten çıkış yapmak isteyip istemediğini soralım. + +```js + { + return this.state.isLoggedIn && + pathname.includes('/user/Asabeneh') + ? 'Çıkış yapmak istediğinize emin misiniz?' + : true + }} +/> +``` + +# Egzersizler + +## Egzersizler: Seviye 1 + +1. React'te yönlendirme uygulamak için hangi paketi kullanırsınız? +2. react-router-dom'da varsayılan export nedir? +3. Aşağıdaki bileşenlerin kullanım amacı nedir? (Route, NavLink, Switch, Redirect, Prompt) + +## Egzersizler: Seviye 2 + +Artık React router'ı biliyorsunuz. Portföyünüzü React ile oluşturun ve navigasyon için React router kullanın. + +## Egzersizler: Seviye 3 + +Yakında + +🎉 TEBRİKLER! 🎉 + +[<< Gün 16](../16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md) | [Gün 18 >>](../../18_Fetch_And_Axios/18_fetch_axios.md) diff --git a/Turkish/readMe.md b/Turkish/readMe.md index 6108dcd..3f7f08e 100644 --- a/Turkish/readMe.md +++ b/Turkish/readMe.md @@ -38,3 +38,5 @@ | 13 | [Kontrollü ve Kontrolsüz Input](./13_Gun_Kontrollü_ve_Kontrolsüz_Input/13_kontrolsuz_input.md) | | 14 | [Bileşen Yaşam Döngüleri](./14_Gun_Bilesen_Yasam_Donguleri/14_bilesen_yasam_donguleri.md) | | 15 | [Üçüncü Taraf Paketler](./15_Gun_Üçüncü_Taraf_Paketler/15_ucuncu_taraf_paketler.md) | +| 16 | [Yüksek Düzey Bileşen](./16_Gun_Yuksek_Duzey_Bilesen/16_yuksek_duzey_bilesen.md) | +| 17 | [React Router](./17_Gun_React_Router/17_react_router.md) |