Obiectivele sunt un mecanism foarte important pentru transmiterea atributelor numai de citire pentru componentele React. Aceste atribute sunt de obicei necesare pentru a fi de anumite tipuri sau forme pentru a putea fi utilizate corespunzator in componenta.
Daca o recuzita este transmisa unei componente intr-un tip sau o forma care nu este de asteptat, este posibil ca componenta sa nu se comporte asa cum ati dorit. Astfel, o modalitate excelenta de imbunatatire a componentelor React este validarea recuzita.
Acest ghid presupune ca aveti deja cunostinte elementare despre React si este destinat dezvoltatorilor care folosesc React pentru orice perioada de timp. Cu toate acestea, daca sunteti inca nou in reactie, puteti afla mai multe despre asta din documentele sale.
Luati in considerare urmatorul cod:
import Reacteaza din „reactioneaza”; import ReactDOM din „reac-dom”; function PercentageStat ({label, score = 0, total = Math.max (1, score)}) {return (<div> <h6> {label} </h6> <span> {Math.round (punctaj / total * 100)}% </span> </div>)} functie App () {return (<div> <h1> Populatie masculina </h1> <div> <PercentageStat label = “Class 1” total = {360} scor = {203} /> <PercentageStat label = “Class 2” total = {206} /> <PercentageStat label = “Class 3” score = {107} /> <PercentageStat label = “Class 4” /> </div> </div>)} const rootElement = document.getElementById („radacina”); ReactDOM.render (<App />, rootElement);
In fragmentul de mai sus, este creata o componenta numita PercentageStat. Este nevoie de trei elemente de recuzita pentru redarea corecta: eticheta, punctaj si total. Valorile implicite sunt setate pentru scor si recuzita totala in cazul in care nu sunt furnizate. In cele din urma, PercentageStat este redat de patru ori in componenta App, fiecare cu elemente de recuzita diferite.
Urmatoarea captura de ecran arata cum va arata aplicatia (cu unele stiluri Bootstrap):
Observati, pe baza utilizarii, ca propulsorul pentru eticheta este de asteptat sa fie un sir. In aceeasi ordine de idei, scorul si totalul trebuie sa fie valori numerice, deoarece sunt utilizate pentru calcularea procentului. De asemenea, observati ca totalul este de asteptat sa nu fie niciodata 0, deoarece este utilizat ca divizor.
Iata un alt fragment de cod care arata o aplicatie modificata care reda componentele PercentageStat cu recuzita nevalida:
functie App () {return (<div> <h1> Populatie masculina </h1> <div> <PercentageStat label = “Class 1” total = “0” score = {203} /> <PercentageStat label = “Clasa 2” total = {0} /> <PercentageStat label = “Class 3” score = {f => f} /> <PercentageStat label = “Class 4” total = {{}} score = “0” /> </div> </div>)}
Urmatoarea captura de ecran arata cum arata acum vizualizarea aplicatiei:
Validarea recuzita
Dupa cum s-a demonstrat in sectiunea precedenta, motivele pentru validarea elementelor de recolta ale componentelor sunt evidente. Se pot folosi cateva tehnici pentru a asigura verificarea si validarea corecta a tipului aplicatiei React.
O optiune viabila ar fi sa folositi extensii JavaScript, cum ar fi Flow sau TypeScript, pentru a adauga verificarea tipului la intreaga aplicatie.
propTypes
React ofera un mecanism intern pentru adaugarea verificarii tipului la componente. Componentele cu reactie utilizeaza o proprietate speciala numita PropTypes pentru a configura verificarea tipului.
/ ** * COMPONENTE FUNCTIONALE * / functie ReactComponent (recuzita) {// … implementati render logica aici} ReactComponent.propTypes = {// … definitii de tip aici} / ** * COMPONENTE DE CLASA: METODA 1 * / class ReactComponent extinde React.Component {// … componenta body body here} ReactComponent.propTypes = {// … definitii de tip aici} / ** * COMPONENTE DE CLASA: METODA 2 * Folosind sintaxa proprietatilor clasei ‘static’ * / class ReactComponent extinde React.Component {// … componenta corpul clasei aici static propTypes = {// … definitii tip prop aici aici}}
Cand recuzitele sunt transmise catre o componenta React, acestea sunt verificate in functie de definitiile de tip configurate in proprietatea propTypes. Atunci cand o valoare nevalida este trecuta pentru o recuzita, un avertisment este afisat pe consola JavaScript.
Daca optiunile de recuzita implicite sunt setate pentru componenta React, valorile sunt rezolvate pentru prima data inainte de verificarea tipului impotriva tipurilor de tipuri. Prin urmare, valorile implicite sunt de asemenea supuse definitiilor de tip prop.
Retineti ca verificarea tipului tip PropTip se intampla doar in modul de dezvoltare, permitandu-va sa prindeti erori in aplicatia React in timpul dezvoltarii. Din motive de performanta, acesta nu este declansat in mediul de productie.
PropTypes
Inainte de React 15.5.0, o utilitate numita PropTypes a fost disponibila ca parte a pachetului React, care a furnizat o multime de validatori pentru configurarea definitiilor de tip pentru recuzita pentru componente. Poate fi accesat cu React.PropTypes.
Cu toate acestea, in versiunile ulterioare ale React, acest utilitar a fost mutat intr-un pachet separat numit prop-types, deci trebuie sa il adaugati ca dependenta pentru proiectul dvs. pentru a avea acces la utilitatea PropTypes:
npm instalati tipuri de prop – salvare
Poate fi importat in fisierele proiectului dupa cum urmeaza:
importati PropTypes din „tipuri de prop”;
Pentru a afla mai multe despre modul in care puteti utiliza tipuri de recuzita, despre cum difera de utilizarea React.PropTypes si despre toate validatoarele disponibile, consultati citirea documentatiei sale.
Validatoare disponibile
Tipuri de baza
Dupa cum am mentionat in sectiunea anterioara, utilitarul PropTypes exporta o multime de validatori pentru configurarea definitiilor de tip. Iata validatorii pentru tipurile de date de baza:
- PropTypes.any: Prop-ul poate fi de orice tip de date
- PropTypes.bool: Prop-ul ar trebui sa fie un boolean
- PropTypes.number: Prop-ul ar trebui sa fie un numar
- PropTypes.string: Prop-ul ar trebui sa fie un sir
- PropTypes.func: Prop-ul ar trebui sa fie o functie
- PropTypes.array: Prop-ul ar trebui sa fie un tablou
- PropTypes.object: Prop-ul ar trebui sa fie un obiect
- PropTypes.symbol: Prop-ul ar trebui sa fie un simbol
Component.propTypes = {anyProp: PropTypes.any, booleanProp: PropTypes.bool, numberProp: PropTypes.number, stringProp: PropTypes.string, functionProp: PropTypes.func}
Tipuri rentabile
PropTypes exporta, de asemenea, urmatoarele validatoare pentru a se asigura ca valoarea transmisa unui prop poate fi redata de React.
- PropTypes.node: Prop-ul ar trebui sa fie orice poate fi redat de React – un numar, sir, element sau tablou (sau fragment) care contine aceste tipuri
- PropTypes.element: Prop-ul trebuie sa fie un element React
Component.propTypes = {nodeProp: PropTypes.node, elementProp: PropTypes.element}
O utilizare obisnuita a validatorului PropTypes.element este asigurarea faptului ca o componenta are un singur copil. Daca componenta nu are copii sau mai multi copii, pe consola JavaScript este afisat un avertisment.
Component.propTypes = {children: PropTypes.element.isRequired}
Tipuri de instanta
In cazurile in care doriti ca un prop sa fie o instanta a unei anumite clase JavaScript, puteti utiliza validatorul PropTypes.instanceOf. Astfel se foloseste instanta JavaScript de baza a operatorului.
Component.propTypes = {personProp: PropTypes.instanceOf (persoana)}
Mai multe tipuri
PropTypes exporta, de asemenea, validatori care pot permite un set limitat de valori sau mai multe seturi de tipuri de date pentru un prop. Aici sunt ei:
- PropTypes.oneOf: Prop-ul este limitat la un set specificat de valori, tratandu-l ca pe un enumer
- PropTypes.oneOfType: Prop-ul trebuie sa fie unul dintr-un set specificat de tipuri, comportandu-se ca o uniune de tipuri
Component.propTypes = {enumProp: PropTypes.oneOf ([adevarat, fals, 0, ‘Necunoscut’]), unionProp: PropTypes.oneOfType ([PropType.bool, PropType.number, PropType.string, PropType.instanceOf (persoana)] )}
Tipuri de colectare
In afara de validatorii de tipPropTypes.array si PropTypes.object, PropTypes ofera si alte alte validatoare pentru validarea mai bine ajustata a tablourilor si obiectelor.
Aici sunt ei:
PropTypes.arrayOf
PropTypes.arrayOf poate fi utilizat pentru a va asigura ca propul este un tablou in care toate elementele se potrivesc cu tipul specificat.
Component.propTypes = {peopleArrayProp: PropTypes.arrayOf (PropTypes.instanceOf (persoana)), multipleArrayProp: PropTypes.arrayOf (PropTypes.oneOfType ([PropType.number, PropType.string]))}}
PropTypes.objectOf
PropTypes.objectOf poate fi utilizat pentru a se asigura ca propul este un obiect in care toate valorile proprietatii se potrivesc cu tipul specificat.
Component.propTypes = {booleanObjectProp: PropTypes.objectOf (PropTypes.bool), multipleObjectProp: PropTypes.objectOf (PropTypes.oneOfType ([PropType.func, PropType.number, PropType.string) PropType
PropTypes.shape
PropTypes.shape poate fi utilizat atunci cand este necesara o validare mai detaliata a unui obiect de prop. Se asigura ca prop-ul este un obiect care contine un set de chei specificate cu valori ale tipurilor specificate.
Component.propTypes = {profileProp: PropTypes.shape ({id: PropTypes.number, nume complet: PropTypes.string, sex: PropTypes.oneOf ([‘M’, ‘F’]), data nasterii: PropTypes.instanceOf (Data), isAuthor: PropTypes.bool})}
PropTypes.exact
Pentru potrivirea stricta (sau exacta) a obiectelor, puteti utiliza PropTypes.exact dupa cum urmeaza:
Component.propTypes = {subjectScoreProp: PropTypes.exact ({subiect: PropTypes.oneOf ([‘Maths’, ‘Arts’, ‘Science’]), punctaj: PropTypes.number})}
Tipuri obligatorii
Validatoarele PropTypes vazute pana acum permit ca optiunea sa fie optionala. Cu toate acestea, puteti face lant este solicitat la orice validator pentru a va asigura ca un avertisment este afisat ori de cate ori prop-ul nu este furnizat.
Component.propTypes = {requireAnyProp: PropTypes.any.isRequired, necesareFunctionProp: PropTypes.func.isRequired, ObligatoriuSingleElementProp: PropTypes.element.isRequired, necesarPersonProp: PropTypes.instanceOf (Persoana). , ‘Scrieti]].
Validatoare personalizate
De cele mai multe ori, poate fi necesar sa definiti o logica de validare personalizata pentru recuzita de componente – de exemplu, asigurandu-va ca un pop este trecut o adresa de e-mail valida. prop-tipuri va permite sa definiti functii de validare personalizate care pot fi utilizate pentru verificarea tipurilor de recuzita.
Validatoare de baza personalizate
Functia de validare personalizata are trei argumente:
- recuzita: obiect care contine toate popi transmise componentei
- propName: numele prop-ului care trebuie validat
- componentName: numele componentei
Ar trebui sa returneze un obiect de eroare daca validarea esueaza. Eroarea nu trebuie aruncata. De asemenea, console.warn nu trebuie utilizat in functia de validare personalizata.
const isEmail = function (popi, propName, componentName) {const regex = / ^ ((([^ <> () [] \.,;: s @ “] + (. [^ <> () [] \)). ,;:… s @ “] +) *) | (” + “)) @ (([[0-9] {1,3} [0-9] {1,3} [0-9] {1,3} [0-9] {1,3}]) |. (. ([a-zA-Z-0-9] +) + [a-zA-Z] {2}))) ? $ /; if (! regex.test (props [propName])) {return new Error (`Prop nonvalid ‘$ {propName}` trecut la `$ {componentName}`. Asteptat o adresa de e-mail valida.`); }} Component.propTypes = {email: isEmail, nume complet: PropTypes.string, data: PropTypes.instanceOf (Data)}
Functiile de validare personalizate pot fi, de asemenea, utilizate cu PropTypes.
porno sora frate http://newhavenvillage.net/__media__/js/netsoltrademark.php?d=adult66.net/
porno xxxn http://eventrentalcareers.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno cu femei violate http://kuwaitisation.com/__media__/js/netsoltrademark.php?d=adult66.net/
actori porno http://opalconcepts.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/amatori
porno batran http://ascontrerallc.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/anal
filme porno rusoaice http://mrsimonthompson.co.uk/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/asiatice
gils porno http://iotronics.biz/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/beeg
filme porno senzuale http://blowingmoneyfast.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/blonde
filme porno big as http://grandcanyonskybridge.co.uk/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brazzers
porno pe centura http://herlacrosse.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brunete
porno homosexuali http://flos-filet.biz/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/chaturbate
filme porno taboo http://raod.eu/__media__/js/netsoltrademark.php?d=adult66.net/bruneta-matura-fututa-tare-in-cur-de-un-un-tanar-cu-pula-mare
porno educativo.com http://trevorvernon.com/__media__/js/netsoltrademark.php?d=adult66.net/mireasa-sexy-e-fututa-chiar-la-nunta-ei-obligata-sa-fac-sex-oral
filme porno mama si fiul http://bandagbridgestone.com/__media__/js/netsoltrademark.php?d=adult66.net/lesbiene-date-cu-ulei-se-mangaie-si-se-filmeaza-in-timp-ce-se-joaca-cu-vibratoarele
segvente porno http://wthr13nbcnews.com/__media__/js/netsoltrademark.php?d=adult66.net/doggystyle-sex-cu-un-cuplu-de-adolescenti-care-fac-sex-pe-canapea
canale porno http://incomecreator.net/__media__/js/netsoltrademark.php?d=adult66.net/ii-face-sex-oral-prietenei-ei-apoi-o-fute-pana-are-un-orgasm-perfect
porno 18 http://decarokaplen.com/__media__/js/netsoltrademark.php?d=adult66.net/filmulete-porno-cu-ejaculari-si-orgasme
poze porno hd http://jllfamily.net/__media__/js/netsoltrademark.php?d=adult66.net/sex-in-trei-cu-doua-bunaciuni-amatoare-si-un-obsedat-dupa-sex
filme porno fete http://elitemodellook.biz/__media__/js/netsoltrademark.php?d=adult66.net/blonda-matura-care-e-visul-oricarui-barbat-face-sex-oral-fiului-vitreg
filme porno cu chinezoaice http://www.rabbitsplus.com/__media__/js/netsoltrademark.php?d=adult66.net/negresa-cu-fundul-mare-e-fututa-hard-de-doi-barbati-necunoscuti
oneOfType. Iata un exemplu simplu folosind functia de validare personalizata isEmail din fragmentul de cod anterior:
Component.propTypes = {email: PropTypes.oneOfType ([isEmail, PropTypes.shape ({adresa: isEmail})])}
Componenta va fi valabila in ambele scenarii:
<Componenta email = “[email protected]” /> <Componenta email = {{adresa: ‘[email protected]’}} />
Validatoare si colectii personalizate
Functiile de validare personalizate pot fi, de asemenea, folosite cu PropTypes.arrayOf si PropTypes.objectOf. Cand este utilizat in acest fel, functia de validare personalizata va fi apelata pentru fiecare cheie din tablou sau obiect.
Cu toate acestea, functia de validare personalizata va lua cinci argumente in loc de trei.
- propValue: tabloul sau obiectul in sine
- cheie: cheia articolului curent din iteratie
- componentName: numele componentei
- locatie: locatia datelor validate. De obicei este „prop”
- propFullName: numele complet rezolvat al elementului curent in curs de validare. Pentru un tablou, acesta va fi array [index]. Pentru un obiect, acesta va fi obiect.key
Iata o versiune modificata a functiei de validare personalizata isEmail pentru utilizare cu tipuri de colectie:
const isEmail = functie (propValue, cheie, componentName, locatie, propFullName) {const regex = / ^ ((([^ <> () [] \.,;: s @ “] + (. [^ <> ()) . [] \,;: s @ “] +) *) | (” + “)) @ (([[0-9] {1,3} [0-9] {1,3} [… 0-9] {1,3} [0-9] {1,3}]) |. (. ([a-zA-Z-0-9] +) + [a-zA-Z] {2, }))) $ /?; if (! regex.test (propValue [key])) {return new Error (`Invalida prop` $ {propFullName} `trecut la` $ {componentName} `. Asteptam o adresa de e-mail valida.`); }} Component.propTypes = {e-mailuri: PropTypes.arrayOf (isEmail)}
Validatoare personalizate cu scop general
Tinand cont de tot ceea ce ati aflat despre functiile de validare personalizate, puteti merge mai departe si puteti crea validatoare personalizate pentru toate scopurile care pot fi utilizate ca validatori autonomi si, de asemenea, cu tipuri de colectie.
O usoara modificare a functiei de validare personalizata isEmail o va face un validator universal, asa cum se arata in fragmentul de cod urmator:
const isEmail = functie (propValue, cheie, componentName, locatie, propFullName) {// Obtineti numele de propiere rezolvat bazat pe utilizarea validatorului const prop = (locatie && propFullName)? propFullName: cheie; const regex = / ^ ((([^ <> () [] \.,;: s @ “] + (. [^ <> () [] \.,;: s @”] +) *) | ( “+”)) @ (([[0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] { ? 1,3}]) | (. ([a-zA-Z-0-9] +) + [a-zA-Z] {2}))) $ /; if (! regex.test (propValue [cheie])) {return new Error (`Invalid prop` $ {prop}` trecut la `$ {componentName}`. Asteptat o adresa de e-mail valida.`); }} Component.propTypes = {email: PropTypes.oneOfType ([isEmail, PropTypes.shape ({adresa: isEmail})]), e-mailuri: PropTypes.arrayOf (isEmail)}
Validarea procentajului stat
Pentru a completa acest ghid, urmatorul fragment de cod adauga tipuri de sugestii la componenta PercentageStat pe care am revizuit-o in sectiunea de inceput.
import Reacteaza din „reactioneaza”; importati PropTypes din „tipuri de prop”; // Functia componenta PercentageStat PercentageStat ({eticheta, punctaj = 0, total = Math.max (1, punctaj)}) {return (<div> <h6> {label} </h6> <span> {Math.round (punctaj / total * 100)}% </span> </div>)} // Verifica daca o valoare este numerica // Fie un numar finit, fie o functie de sir numeric esteNumeric (valoare) {const regex = / ^ (\ + | -) ((\ d * \ \ d +.?) | (\ d + \ \ d *.?)) $ /?; Numar de returnare.isFinite (valoare) || ((typeof value === “string”) && regex.test (valoare)); } // Verifica daca valoarea este nula // Valoarea este transformata pentru prima data intr-o functie numerica esteNonZero (valoare) {return + valoare! == 0; } // Preia functiile de testare ca argumente si returneaza o functie de validare personalizata. // Fiecare functie transmisa ca argument este de asteptat sa ia un argument de valoare // se asteapta sa accepte o valoare si sa returneze un Boolean daca trece validarea. // Toate testele trebuie sa treaca pentru ca validatorul personalizat sa fie marcat ca trecut. functie validatedType (… validatori) {functie returnare (popi, propName, componentName) {const value = props [propName]; const valid = validators.every (validator => {if (typeof validator === “functie”) {const rezultat = validator (valoare); return (typeof rezultat === “boolean”) && rezultat;} return fals;} ); if (! valid) {return new Error (`Prop \ nevalabil \` $ {propName} \ `trecut la \` $ {componentName} \ `. Validarea a esuat. ‘); }}} // Setati tipurile de tipuri pentru componenta PercentageStat.propTypes = {label: PropTypes.string.isRequired, score: validatedType (isNumeric), total: validatedType (isNumeric,
Validati Reactioneaza recuzitele componentelor in productie
Depurarea aplicatiilor React poate fi dificila, mai ales atunci cand exista o stare complexa. Daca sunteti interesat in monitorizarea si urmarirea starii Redux pentru toti utilizatorii dvs. in productie, incercati LogRocket.
LogRocket este ca un DVR pentru aplicatii web, inregistrand literalmente tot ce se intampla pe site-ul tau. In loc sa ghiciti de ce se intampla probleme, puteti agrega si raporta in ce stare a fost cererea dvs. atunci cand a aparut o problema.
Pachetul intermediar LogRocket Redux adauga un strat suplimentar de vizibilitate in sesiunile dvs. de utilizator. LogRocket inregistreaza toate actiunile si de la magazinele Redux.
Modernizati modul de depanare a aplicatiilor React – incepeti monitorizarea gratuit.
Concluzie
In acest ghid, am vazut cum pot fi utilizate tipurile de recuza pentru a imbunatati componentele React si a va asigura ca sunt utilizate asa cum este de asteptat.
Daca doriti sa aflati mai multe despre validarea accesoriilor componente din React, puteti consulta acest ghid.
Bucurati-va de codificare …








