కంపోనెంట్కు Props పాస్ చేయడం
React కంపోనెంట్లు props ను ఒకదానితో ఒకటి కమ్యూనికేట్ చేసుకునేందుకు ఉపయోగిస్తాయి. ప్రతి పేరెంట్ కంపోనెంట్ దాని చైల్డ్ కంపోనెంట్లకు props ద్వారా కొంత సమాచారం పాస్ చేయవచ్చు. Props మీకు HTML ఆట్రిబ్యుట్లను గుర్తు చేయవచ్చు, కానీ మీరు వాటి ద్వారా ఆబ్జెక్ట్లు, అర్రేలు, ఫంక్షన్లు వంటి ఏదైనా జావాస్క్రిప్ట్ విలువలను పాస్ చేయవచ్చు.
You will learn
- ఎలా props ను ఒక కంపోనెంట్కు పాస్ చేయాలి
- ఎలా props ను ఒక కంపోనెంట్లో చదవాలి
- props కోసం డిఫాల్ట్ విలువలు ఎలా స్పెసిఫై చేయాలి props
- కొంత JSX ను కంపోనెంట్కు ఎలా పాస్ చేయాలి
- ఎలా props కాలక్రమంలో మారతాయి
తెలిసిన props
Props అనేవి మీరు JSX ట్యాగ్కు పాస్ చేసే సమాచారం. ఉదాహరణకు, className
, src
, alt
, width
, మరియు height
ఇవి మీరు <img>
ట్యాగ్కు పాస్ చేయగల props:
function Avatar() { return ( <img className="avatar" src="https://i.imgur.com/1bX5QH6.jpg" alt="Lin Lanying" width={100} height={100} /> ); } export default function Profile() { return ( <Avatar /> ); }
మీరు <img>
ట్యాగ్కు పాస్ చేయగల props ముందే నిర్ణయించినవి (ReactDOM దీనికి అనుగుణంగా ఉంటుంది HTML ప్రమాణం). మీరు ఏవైనా ప్రాప్లను మీ స్వంత భాగాలకు పాస్ చేయవచ్చు, ఉదాహరణకు <Avatar>
, వాటిని అనుకూలీకరించడానికి (to customize them). ఇలా చేయండి!
కంపోనెంట్కు props పాస్ చేయడం
ఈ కోడ్లో, Profile
కంపోనెంట్ తన చైల్డ్ కంపోనెంట్ అయిన Avatar
కు ఎలాంటి props ని పాస్ చేయడంలేదు:
export default function Profile() {
return (
<Avatar />
);
}
మీరు Avatar
కు రెండు రకాలుక props ఇవ్వవచ్చు.
స్టెప్ 1: చైల్డ్ కంపోనెంట్కు props పాస్ చేయండి.
మొదట, Avatar
కు కొన్ని props పాస్ చేయండి. ఉదాహరణకు, రెండు props పాస్ చేద్దాం: person
(an object) మరియు size
(a number):
export default function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}
ఇప్పుడు మీరు ఈ props ను Avatar
కంపోనెంట్ లో చదవచ్చు.
స్టెప్ 2: చైల్డ్ కంపోనెంట్ లో props ను చదవండి.
మీరు ఈ props ను function Avatar
తర్వాత నేరుగా ({
మరియు })
లో కమాలతో వేరు చేసిన person, size
పేర్లను జాబితా చేయడం ద్వారా చదవచ్చు. ఇది మీకు Avatar
కోడ్ లో వేరియబుల్ వంటి వాటిని ఉపయోగించడానికి అనుమతిస్తుంది.
function Avatar({ person, size }) {
// person and size are available here
}
Avatar
లో person
మరియు size
props ను ఉపయోగించి రెండరింగ్ కోసం కొంత లాజిక్ జోడించండి, అంతే మీ పని పూర్తవుతుంది.
ఇప్పుడు మీరు Avatar
ను వివిధ props తో అనేక రకాలుగా రెండర్ చేయడానికి కాన్ఫిగర్ చేయవచ్చు. వాల్యూ మార్చి ప్రయత్నించండి!
import { getImageUrl } from './utils.js'; function Avatar({ person, size }) { return ( <img className="avatar" src={getImageUrl(person)} alt={person.name} width={size} height={size} /> ); } export default function Profile() { return ( <div> <Avatar size={100} person={{ name: 'Katsuko Saruhashi', imageId: 'YfeOqp2' }} /> <Avatar size={80} person={{ name: 'Aklilu Lemma', imageId: 'OKS67lh' }} /> <Avatar size={50} person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }} /> </div> ); }
Props మీకు పేరెంట్ మరియు చైల్డ్ కంపోనెంట్లను స్వతంత్రంగా ఆలోచించడానికి అనుమతిస్తాయి. ఉదాహరణకు, మీరు Profile
లో person
లేదా size
props ను మార్చవచ్చు, కానీ Avatar
అవి ఎలా ఉపయోగిస్తుందో గురించి ఆలోచించాల్సిన అవసరం లేదు. అదేవిధంగా, మీరు Avatar
ఈ props ను ఎలా ఉపయోగిస్తుందో మార్చవచ్చు, Profile
ను చూడకుండా.
మీరు props ను “knobs” లాగా అనుకోవచ్చు, వాటిని మీరు సర్దుబాటు చేయవచ్చు. ఇవి ఫంక్షన్లకు ఆర్గుమెంట్లు ఎంత ముఖ్యమో, అదే పాత్ర పోషిస్తాయి—వాస్తవానికి, props మీ కంపోనెంట్కు కలిగే ఏకైక ఆర్గుమెంట్! React కంపోనెంట్ ఫంక్షన్లు ఒకే ఆర్గుమెంట్, అంటే props
ఆబ్జెక్ట్ను స్వీకరిస్తాయి:
function Avatar(props) {
let person = props.person;
let size = props.size;
// ...
}
సాధారణంగా, మీకు మొత్తం props
ఆబ్జెక్ట్ అవసరం ఉండదు, కాబట్టి మీరు దానిని విడగొట్టి సొంతంగా props గా ఉపయోగిస్తారు.
prop డిఫాల్ట్ వాల్యూ స్పెసిఫై చేయడం
మీరు prop కి డిఫాల్ట్ వాల్యూ ఇచ్చి, ఎలాంటి వాల్యూ నిర్దేశించకుండా వదిలేస్తే అది డిఫాల్ట్ వాల్యూ పడ్డప్పుడు, మీరు డీస్ట్రక్చరింగ్ ద్వారా =
డిఫాల్ట్ వాల్యూ పరమేటర్ తర్వాత పెట్టి ఇది చేయవచ్చు:
function Avatar({ person, size = 100 }) {
// ...
}
ఇప్పుడు, ఏదైనా size
prop లేకుండా <Avatar person={...} />
రెండర్ అయితే, size
వాల్యూ 100
గా సెట్ అవుతుంది.
డిఫాల్ట్ వాల్యూ మాత్రమే size
prop మిస్సయితే లేదా size={undefined}
పాస్ చేసినప్పుడు ఉపయోగించబడుతుంది. కానీ మీరు size={null}
లేదా size={0}
పాస్ చేస్తే, డిఫాల్ట్ వాల్యూ ఉపయోగించబడదు.
JSX స్ప్రెడ్ సింటాక్స్ ద్వారా props ఫార్వర్డ్ చేయడం
కొన్నిసార్లు, props ఇవ్వడం చాలా బోర్ కొడుతుంది:
function Profile({ person, size, isSepia, thickBorder }) {
return (
<div className="card">
<Avatar
person={person}
size={size}
isSepia={isSepia}
thickBorder={thickBorder}
/>
</div>
);
}
తరుచుగా వాడే కోడ్లో ఎలాంటి తప్పు లేదు—అది మరింత స్పష్టంగా చదవగలిగేది కావచ్చు. కానీ కొన్నిసార్లు మీరు సంక్షిప్తతకు విలువ ఇస్తారు. కొన్ని కంపోనెంట్లు తమ props ను అన్ని చైల్డ్లకు ఫార్వర్డ్ చేస్తాయి, ఉదాహరణకు, ఈ Profile
లో Avatar
props పాస్ చేసిన విధానం. అవి తమ props ను నేరుగా ఉపయోగించకపోతే, మరింత కొద్దిపాటి “స్ప్రెడ్” సింటాక్స్ ఉపయోగించడం సరైనది కావచ్చు:
function Profile(props) {
return (
<div className="card">
<Avatar {...props} />
</div>
);
}
ఇది Profile
లోని అన్ని props లను వాటి పేర్లను లేకుండా Avatar
కు ఫార్వర్డ్ చేస్తుంది.
స్ప్రెడ్ సింటాక్స్ను లిమిటెడ్ కా ఉపయోగించండి. మీరు దాన్ని ప్రతి ఇతర కంపోనెంట్లో ఉపయోగిస్తే, దాంట్లో ఏదో పొరపాటు ఉంది. ఇది తరచుగా మీ కంపోనెంట్లను విడిగ, చిల్డ్రన్ను JSX గా పాస్ చేయాలని చూస్తుంది. దీని గురించి మరింత తరువాత తెలుసుకుందాం!
JSX ని చిల్డ్రన్గా పాస్ చేయడం
బిల్ట్-ఇన్ బ్రౌజర్ ట్యాగ్లను నెస్టింగ్ చేయడం సాధారణ ప్రాక్టీస్:
<div>
<img />
</div>
కొన్నిసార్లు మీరు మీ సొంత కంపోనెంట్లను కూడా అదే విధంగా నెస్ట్ చేయాలని కోరుకుంటారు:
<Card>
<Avatar />
</Card>
మీరు JSX ట్యాగ్లో కంటెంట్ను నెస్ట్ చేస్తే, పేర్ెంట్ కంపోనెంట్ ఆ కంటెంట్ను children
అనే prop లో స్వీకరిస్తుంది. ఉదాహరణకు, కింద ఇచ్చిన Card
కంపోనెంట్ <Avatar />
ను children
prop గా స్వీకరిస్తుంది మరియు దాన్ని ఒక రేపర్ల div
లో రెండర్ చేస్తుంది:
import Avatar from './Avatar.js'; function Card({ children }) { return ( <div className="card"> {children} </div> ); } export default function Profile() { return ( <Card> <Avatar size={100} person={{ name: 'Katsuko Saruhashi', imageId: 'YfeOqp2' }} /> </Card> ); }
<Card>
లోని <Avatar>
ను కొన్ని టెక్స్ట్తో మార్చి ప్రయత్నించండి, అప్పుడు Card
కంపోనెంట్ ఎలాంటి నెస్టెడ్ కంటెంట్ను అయినా ఎలా ర్యాప్ చేయగలదో మీరు గమనించవచ్చు. దాని లోపల ఏమి రెండర్ అవుతుందో “తెలుసుకోవాల్సిన” అవసరం దీనికి లేదు. మీరు చాలా చోట్ల ఈ సౌకర్యవంతమైన పాటర్న్ చూస్తారు.
children
prop ఉన్న ఒక కాంపోనెంట్ను దాని పేరెంట్ కాంపోనెంట్ల ద్వారా ఆర్బిట్రరీ JSX తో “నింపగల” “రంధ్రం” కలిగి ఉన్నట్లు మీరు అనుకోవచ్చు. మీరు తరచుగా విజువల్ రేపర్ల కోసం children
prop ఉపయోగిస్తారు: ప్యానెల్లు, గ్రిడ్లు మొదలైనవి.
Illustrated by Rachel Lee Nabors
Props కాలక్రమేణా ఎలా మారుతాయో
కింద ఇచ్చిన Clock
కంపోనెంట్ దాని పేర్ెంట్ కంపోనెంట్ నుండి రెండు ప్రాప్స్ని స్వీకరిస్తుంది: color
మరియు time
. (పేర్ెంట్ కంపోనెంట్ కోడ్ను మినహాయించారు, ఎందుకంటే అది state ను ఉపయోగిస్తుంది, దానిపై మనం ఇప్పుడే చర్చించటం లేదు.)
కింద ఉన్న సెలెక్ట్ బాక్స్లో రంగును మార్చి చూడండి:
export default function Clock({ color, time }) { return ( <h1 style={{ color: color }}> {time} </h1> ); }
ఈ ఉదాహరణ ఒక కంపోనెంట్ సమయం గడిచేకొద్దీ వేర్వేరు props పొందవచ్చు అని చూపిస్తుంది. Props ఎప్పుడూ స్థిరంగా ఉండవు! ఇక్కడ, time
prop ప్రతి సెకనుకు మారుతుంది, మరియు color
ప్రాప్ మీరు మరో రంగును ఎంచుకున్నప్పుడు మారుతుంది. Props ఒక కంపోనెంట్ యొక్క డేటాను ఎప్పుడైనా ప్రతిబింబిస్తాయి, మొదట్లో మాత్రమే కాదు.
అయితే, props ఇమ్మ్యుటబుల్—ఇది కంప్యూటర్ సైన్స్ లో “మార్చలేనిది” అనే అర్థం కలిగిన పదం. ఒక కంపోనెంట్ దాని props మార్చాల్సినప్పుడు (ఉదాహరణకు, యూజర్ చర్య లేదా కొత్త డేటాకు ప్రతిస్పందనగా), అది దాని పేరెంట్ కంపోనెంట్ props వేరే props-కొత్త ఆబ్జెక్ట్ను పంపించమని “ఆరాధించాలి”! దాని పాత props తరువాత దూరంగా వేయబడతాయి, మరియు చివరికి జావాస్క్రిప్ట్ ఇంజిన్ వాటి ద్వారా తీసుకున్న మెమరీని తిరిగి స్వీకరిస్తుంది.
”Props మార్చడానికి ప్రయత్నించకండి”. మీరు యూజర్ ఇన్పుట్ (ఎంచుకున్న రంగును మార్చడం వంటి) కి స్పందించాల్సినప్పుడు, మీరు “state సెట్ చేయాలి”, దానిపై మీరు State: A Component’s Memory. లో తెలుసుకోవచ్చు
Recap
- Props పంపించడానికి, వాటిని JSX లో జోడించండి, మీరు HTML అట్రిబ్యూషన్లతో చేసినట్లే.
- Props ను చదవడానికి,
function Avatar({ person, size })
డెస్ట్రక్చరింగ్ సింటాక్స్ ఉపయోగించండి. - మీరు
size = 100
వంటి డిఫాల్ట్ వాల్యూ స్పెసిఫై చేయవచ్చు, ఇది లేకపోతే మరియుundefined
props కోసం ఉపయోగించబడుతుంది. - మీరు
<Avatar {...props} />
JSX స్ప్రెడ్ సింటాక్స్తో అన్ని props ఫార్వర్డ్ చేయవచ్చు, కానీ దీనిని ఎక్కువగా ఉపయోగించకండి! <Card><Avatar /></Card>
వంటి నెస్టెడ్ JSXCard
కంపోనెంట్ యొక్కchildren
prop కనిపిస్తుంది.- Props సమయానికి చదవడానికి మాత్రమే స్నాప్షార్ట్: ప్రతి రెండరింగ్ ఒక కొత్త props వెర్షన్ను అందిస్తుంది.
- మీరు props మార్చలేరు. మీరు ఇంటరాక్టివిటీ అవసరమైనప్పుడు, state సెట్ చేయాల్సి ఉంటుంది.
Challenge 1 of 3: కంపోనెంట్ను ఎక్స్ట్రాక్ట్ చేయండి
ఈ Gallery
కంపోనెంట్లో రెండు ప్రొఫైళ్లకు సంబంధించిన చాలా సమానమైన మార్కప్ ఉంది. డుప్లికేషన్ను తగ్గించేందుకు దీని నుండి ఒక Profile
కంపోనెంట్ను ఎక్స్ట్రాక్ట్ చేయండి. దీనికి ఏమి props పంపాలనేది మీరు నిర్ణయించుకోవాలి.
import { getImageUrl } from './utils.js'; export default function Gallery() { return ( <div> <h1>Notable Scientists</h1> <section className="profile"> <h2>Maria Skłodowska-Curie</h2> <img className="avatar" src={getImageUrl('szV5sdG')} alt="Maria Skłodowska-Curie" width={70} height={70} /> <ul> <li> <b>Profession: </b> physicist and chemist </li> <li> <b>Awards: 4 </b> (Nobel Prize in Physics, Nobel Prize in Chemistry, Davy Medal, Matteucci Medal) </li> <li> <b>Discovered: </b> polonium (chemical element) </li> </ul> </section> <section className="profile"> <h2>Katsuko Saruhashi</h2> <img className="avatar" src={getImageUrl('YfeOqp2')} alt="Katsuko Saruhashi" width={70} height={70} /> <ul> <li> <b>Profession: </b> geochemist </li> <li> <b>Awards: 2 </b> (Miyake Prize for geochemistry, Tanaka Prize) </li> <li> <b>Discovered: </b> a method for measuring carbon dioxide in seawater </li> </ul> </section> </div> ); }