React'te Props ve PropTypes'ta Ustalaşma

Yayınlanan: 2022-03-10
Hızlı özet ↬ Props ve PropTypes, React bileşenleri arasında bilgi aktarmak için önemli bir mekanizmadır ve biz burada onları ayrıntılı olarak inceleyeceğiz. Bu eğitici, size aksesuarlar, propları geçirme ve erişme ve props kullanan herhangi bir bileşene bilgi aktarma ile ilgili ayrıntıları tanıtacaktır. Ancak, PropType'ları kullanarak props aracılığıyla aldığımız verileri doğrulamak her zaman iyi bir uygulamadır. Böylece, PropType'ları React'e nasıl entegre edeceğinizi de öğreneceksiniz.

Sahne ve PropTypes kafanızı karıştırıyor mu? Yalnız değilsin. Size aksesuarlar ve PropType'lar hakkında her konuda rehberlik edeceğim. React uygulamaları geliştirirken hayatınızı önemli ölçüde kolaylaştırabilirler. Bu eğitici, size aksesuarlar, propları geçirme ve erişme ve props kullanan herhangi bir bileşene bilgi aktarma ile ilgili ayrıntıları tanıtacaktır.

React uygulamaları oluşturmak, kullanıcı arayüzünü birkaç bileşene ayırmayı içerir; bu, verileri bir bileşenden diğerine aktarmamız gerekeceği anlamına gelir. Proplar, React bileşenleri arasında bilgi aktarmak için önemli bir mekanizmadır ve biz onları detaylı olarak inceleyeceğiz. Bileşenlerin doğru veri türünü kullanmasını ve doğru verileri iletmesini sağladığından, PropType'lara bakmadan bu makale eksik kalacaktır.

PropTypes'ı kullanarak props olarak aldığımız verileri doğrulamak her zaman iyi bir uygulamadır. Ayrıca PropType'ları React'e entegre etmeyi, PropTypes ile tip kontrolü yapmayı ve defaultProps kullanmayı öğreneceksiniz. Bu öğreticinin sonunda, props ve PropType'ları nasıl etkili bir şekilde kullanacağınızı anlayacaksınız. React'in nasıl çalıştığına dair temel bilgilere sahip olmanız önemlidir.

Props'u Anlamak

React, props (özelliklerin kısaltması) adı verilen şeyleri kullanarak bileşenlere bilgi aktarmamızı sağlar. React birkaç bileşen içerdiğinden, aksesuarlar aynı verileri onlara ihtiyaç duyan bileşenler arasında paylaşmayı mümkün kılar. Tek yönlü veri akışını kullanır (ebeveyn-çocuk bileşenleri). Bununla birlikte, bir geri arama işleviyle, bir alt öğeden bir üst bileşene sahne öğelerini geri iletmek mümkündür.

Bu veriler farklı biçimlerde olabilir: sayılar, dizgiler, diziler, işlevler, nesneler, vb. Herhangi bir HTML etiketinde nitelik bildirebileceğimiz gibi, herhangi bir bileşene props iletebiliriz. Aşağıdaki koda bir göz atın:

 <PostList posts={postsList} />

Bu snippet'te, PostList adlı bir bileşene posts adlı bir destek gönderiyoruz. Bu destek {postsList} değerine sahiptir. Verilere nasıl erişileceğini ve veri aktarılacağını çözelim.

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

Propları Geçmek ve Erişmek

Bu öğreticiyi ilginç kılmak için, kullanıcıların adlarının ve gönderilerinin bir listesini gösteren bir uygulama oluşturalım. Uygulama demosu aşağıda gösterilmiştir:

David Adeneye tarafından kaleme [Geçme ve Aksesuarlara Erişim](https://codepen.io/smashingmag/pen/MWyKQpd) bakın.

David Adeneye'nin Kalem Geçirme ve Sahneye Erişme bölümüne bakın.

Uygulama, bileşen koleksiyonlarından oluşur: bir App bileşeni, bir PostList bileşeni ve bir Post bileşeni .

Gönderi listesi, content ve kullanıcının name gibi verileri gerektirecektir. Verileri şu şekilde oluşturabiliriz:

 const postsList = [ { id: 1, content: "The world will be out of the pandemic soon", user: "Lola Lilly", }, { id: 2, content: "I'm really exited I'm getting married soon", user: "Rebecca Smith", }, { id: 3, content: "What is your take on this pandemic", user: "John Doe", }, { id: 4, content: "Is the world really coming to an end", user: "David Mark", }, ];

Bundan sonra, verileri çekmek için App bileşenine ihtiyacımız var, İşte o bileşenin temel yapısı:

 const App = () => { return ( <div> <PostList posts={postsList} /> </div> ); };

Burada, PostList (birazdan oluşturacağımız) bir destek olarak bir dizi gönderi gönderiyoruz. Üst bileşen olan PostList , alt bileşene ( Post ) posts props olarak geçirilecek olan postsList içindeki verilere erişecektir. Hatırlarsanız, uygulamamız ilerledikçe oluşturacağımız üç bileşenden oluşuyor.

PostList oluşturalım:

 class PostList extends React.Component { render() { return ( <React.Fragment> <h1>Latest Users Posts</h1> <ul> {this.props.posts.map((post) => { return ( <li key={post.id}> <Post {...post} /> </li> ); })} </ul> </React.Fragment> ); } }

PostList bileşeni, posts destek olarak alacaktır. Daha sonra, gönderilen her öğeyi (daha sonra modelleyeceğiz) bir Post bileşeni olarak döndürmek için posts prop, this.props.posts arasında döngü yapacaktır. Ayrıca, yukarıdaki snippet'te key kullanımına dikkat edin. React'te yeni olanlar için anahtar, listemizdeki her öğeye atanan benzersiz bir tanımlayıcıdır ve öğeleri ayırt etmemizi sağlar. Bu durumda, anahtar her gönderinin id . Aynı id sahip iki öğe olma şansı yoktur, bu nedenle bu amaç için kullanmak için iyi bir veri parçasıdır.

Bu arada, kalan özellikler Post bileşenine props olarak iletilir ( <Post {...post} /> ).

Öyleyse, Post bileşenini oluşturalım ve içindeki aksesuarlardan yararlanalım:

 const Post = (props) => { return ( <div> <h2>{props.content}</h2> <h4>username: {props.user}</h4> </div> ); };

Post bileşenini, PostList bileşeni için yaptığımız gibi bir sınıf bileşeni olarak tanımlamak yerine, işlevsel bir bileşen olarak inşa ediyoruz. Bunu, this.props ile bir sınıf bileşeninde onlara nasıl eriştiğimize kıyasla, işlevsel bir bileşendeki aksesuarlara nasıl erişeceğinizi göstermek için yaptım . Bu işlevsel bir bileşen olduğundan, props kullanarak değerlere erişebiliriz .

Artık sahne donanımlarını nasıl geçeceğimizi ve bunlara nasıl erişeceğimizi ve ayrıca bir bileşenden diğerine nasıl bilgi aktaracağımızı öğrendik. Şimdi sahne öğelerinin işlevlerle nasıl çalıştığını düşünelim.

Props Üzerinden Fonksiyonları Geçirme

Önceki bölümde, bir veri dizisini bir bileşenden diğerine props olarak geçirdik. Peki ya bunun yerine işlevlerle çalışıyorsak? React, bileşenler arasında işlevler geçirmemizi sağlar. Bu, bir ana bileşende alt bileşeninden bir durum değişikliğini tetiklemek istediğimizde kullanışlı olur. Props değişmez olması gerekiyordu; bir pervanenin değerini değiştirmeye çalışmamalısınız. Bunu, ana bileşen olan onu ileten bileşende yapmanız gerekir.

Bir tıklama olayını dinleyen ve uygulamanın durumunu değiştiren basit bir demo uygulaması oluşturalım. Uygulamanın durumunu farklı bir bileşende değiştirmek için, işlevimizi, durumunun değişmesi gereken bileşene aktarmamız gerekir. Bu sayede alt bileşenimizde durum değiştirebilen bir fonksiyona sahip olacağız.

Kulağa biraz karmaşık mı geliyor? Bir düğmeye tıklayarak durumu değiştiren ve bir parça hoş geldiniz bilgisi veren basit bir React uygulaması oluşturdum:

David Adeneye tarafından kaleme [Props in React'te Geçme İşlevi](https://codepen.io/smashingmag/pen/WNwrMEY) konusuna bakın.

David Adeneye tarafından yazılan React'te Props aracılığıyla Kalem Geçirme İşlevine bakın.

Yukarıdaki demoda iki bileşenimiz var. Bunlardan biri, uygulamanın durumunu ve durumu ayarlama işlevini içeren ana bileşen olan App bileşenidir. ChildComponent , bu senaryodaki alt öğe olacaktır ve görevi, durum değiştiğinde karşılama bilgisini sunmaktır.

Bunu koda ayıralım:

 class App extends React.Component { constructor(props) { super(props); this.state = { isShow: true, }; } toggleShow = () => { this.setState((state) => ({ isShow: !state.isShow })); }; render() { return ( <div> <ChildComponent isShow={this.state.isShow} clickMe={this.toggleShow} /> </div> ); } }

Durumumuzu true olarak ayarladığımıza ve durumu değiştirme yönteminin App bileşeninde oluşturulduğuna dikkat edin. render() işlevinde, uygulamanın durumunu, prop isShow olarak ChildComponent bileşenine iletiriz. Ayrıca toggleShow() işlevini clickMe adlı bir destek olarak iletiyoruz.

Bunu, şuna benzeyen ChildComponent kullanacağız:

 class ChildComponent extends React.Component { clickMe = () => { this.props.clickMe(); }; render() { const greeting = "Welcome to React Props"; return ( <div style={{ textAlign: "center", marginTop: "8rem" }}> {this.props.isShow ? ( <h1 style={{ color: "green", fontSize: "4rem" }}>{greeting}</h1> ) : null} <button onClick={this.clickMe}> <h3>click Me</h3> </button> </div> ); } }

Yukarıdaki en önemli şey, App bileşeninin bir işlevi ChildComponent destek olarak aktarmasıdır. clickMe() işlevi ChildComponent öğesindeki tıklama işleyicisi için kullanılırken ChildComponent ChildComponent mantığını bilmez - yalnızca düğme tıklandığında işlevi tetikler. Durum, fonksiyon çağrıldığında değiştirilir ve durum değiştiğinde, durum tekrar bir prop olarak aktarılır. Bizim durumumuzdaki çocuk gibi etkilenen tüm bileşenler yeniden oluşturulacaktır.

Uygulamanın durumunu, isShow bir destek olarak ChildComponent , çünkü onsuz, durum güncellendiğinde greeting görüntülemek için yukarıdaki mantığı yazamayız.

Şimdi fonksiyonlara baktık, şimdi doğrulamaya dönelim. PropTypes kullanarak props aracılığıyla aldığımız verileri doğrulamak her zaman iyi bir uygulamadır. Şimdi buna dalalım.

Tepkideki PropType'lar Nelerdir?

PropType'lar, bileşenlerin doğru veri tipini kullanmasını ve doğru verileri iletmesini ve bileşenlerin doğru tipte propları kullanmasını ve alıcı bileşenlerin doğru tipte propları almasını sağlayan bir mekanizmadır.

Bunu bir evcil hayvan mağazasına teslim edilen bir köpek yavrusu gibi düşünebiliriz. Evcil hayvan dükkanı domuz, aslan, kurbağa veya kertenkele istemiyor - köpek yavrusu istiyor. PropType'lar, evcil hayvan mağazasına başka bir tür hayvanın değil, doğru veri türünün (yavru köpek) teslim edilmesini sağlar.

Yukarıdaki bölümde, props kullanarak herhangi bir bileşene nasıl bilgi aktarılacağını gördük. Props'u doğrudan bileşene bir öznitelik olarak geçirdik ve ayrıca bileşenin dışından props geçtik ve onları o bileşende kullandık. Ancak, aksesuarlar aracılığıyla bileşenimizde ne tür değerler elde ettiğimizi veya her şeyin hala çalıştığını kontrol etmedik.

Bir bileşende aldığımız verileri sahne araçları aracılığıyla doğrulayıp doğrulamamak tamamen bize bağlı. Ancak karmaşık bir uygulamada, bu verileri doğrulamak her zaman iyi bir uygulamadır.

PropType'ları Kullanma

PropType'lardan faydalanmak için, komut satırında aşağıdaki kodu çalıştırarak paketi npm veya Yarn üzerinden uygulamamıza bağımlılık olarak eklememiz gerekiyor. npm için:

 npm install --save prop-types

Ve İplik için:

 yarn add prop-types

PropType'ları kullanmak için öncelikle prop-types paketinden PropType'ları içe aktarmamız gerekir:

 import PropTypes from 'prop-types';

Kullanıcıların gönderilerini listeleyen uygulamamızda ProType'ları kullanalım. Post bileşeni için nasıl kullanacağımız aşağıda açıklanmıştır:

 Post.proptypes = { id: PropTypes.number, content: PropTypes.string, user: PropTypes.string }

Burada PropTypes.string ve PropTypes.number , alınan propların doğru tipte olduğundan emin olmak için kullanılabilen prop doğrulayıcılardır. Yukarıdaki kodda, id bir sayı olduğunu, content ve user ise string olduğunu bildiriyoruz.

Ayrıca, PropType'lar hataları yakalamada faydalıdır. Ve isRequired kullanarak geçiş sahnelerini zorlayabiliriz:

 Post.proptypes = { id: PropTypes.number.isRequired, content: PropTypes.string.isRequired, user: PropTypes.string.isRequired }

PropType'ların çok sayıda doğrulayıcısı vardır. İşte en yaygın olanlardan bazıları:

 Component.proptypes = { stringProp: PropTypes.string, // The prop should be a string numberProp: PropTypes.number, // The prop should be a number anyProp: PropTypes.any, // The prop can be of any data type booleanProp: PropTypes.bool, // The prop should be a function functionProp: PropTypes.func // The prop should be a function arrayProp: PropTypes.array // The prop should be an array }

React'in belgelerinde kontrol edebileceğiniz daha fazla tür mevcuttur].

Varsayılan Sahne

Props kullanarak bazı varsayılan bilgileri bileşenlerimize iletmek istiyorsak, React bunu defaultProps adlı bir şeyle yapmamızı sağlar. PropType'ların isteğe bağlı olduğu durumlarda (yani isRequired ), defaultProps ayarlayabiliriz. Varsayılan aksesuarlar, hiçbir şeyin geçmemesi durumunda sahne öğelerinin bir değeri olmasını sağlar. İşte bir örnek:

 Class Profile extends React.Component{ // Specifies the default values for props static defaultProps = { name: 'Stranger' }; // Renders "Welcome, Stranger": render() { return <h2> Welcome, {this.props.name}<h2> } }

Burada, ana bileşen tarafından belirtilmemesi durumunda this.props.name öğesinin bir değeri olduğundan emin olmak için defaultProps kullanılacaktır. Profile sınıfına herhangi bir ad aktarılmazsa, geri dönmek için varsayılan Stranger özelliğine sahip olacaktır. Bu, hiçbir prop geçirilmediğinde herhangi bir hatayı önler. Her isteğe bağlı PropType için her zaman defaultProps kullanmanızı tavsiye ederim.

Çözüm

Umarım bu eğitimde çalışmaktan zevk almışsınızdır. Umarım, size props ve propType'ların React uygulamaları oluşturmak için ne kadar önemli olduğunu göstermiştir, çünkü onlar olmadan, etkileşimler gerçekleştiğinde bileşenler arasında veri iletemezdik. Bunlar, React'in etrafında tasarlandığı bileşen odaklı ve durum yönetimi mimarisinin temel bir parçasıdır.

PropType'lar, bileşenlerin doğru veri tipini kullanmasını ve doğru verileri iletmesini ve bileşenlerin doğru tipte propları kullanmasını ve alıcı bileşenlerin doğru tipte propları almasını sağlamak için bir bonustur.

Herhangi bir sorunuz varsa, bunları aşağıdaki yorumlar bölümünde bırakabilirsiniz; her birini yanıtlamaktan ve sizinle herhangi bir sorun üzerinde çalışmaktan memnuniyet duyacağım.

Referanslar

  • "React'te Düşünmek", React Docs
  • “Liste ve Anahtarlar”, React Docs
  • “PropTypes ile Tip Kontrolü”, React Docs
  • "React'teki Bileşenlere Props Nasıl Geçirilir", Robin Wieruch