Kupitisha Props kwa Component

Components (vipengele) za React hutumia props kuwasiliana na kila mmoja. Kila component-mzazi inaweza kupitisha taarifa fulani kwa components zake za mtoto kwa kuzipa props. Props zinaweza kukukumbusha sifa za HTML, lakini unaweza kupitisha thamani yoyote ya JavaScript kupitia kwao, ikijumuisha objects, arrays (safu), na functions.

You will learn

  • Jinsi ya kupitisha props kwa component
  • Jinsi ya kusoma props kutoka kwa component
  • Jinsi ya kubainisha thamani chaguo-msingi kwa props
  • Jinsi ya kupitisha JSX fulani kwa component
  • Jinsi props zinavyobadilika baada ya muda

Props zinazofahamika

Props ni taarifa unazopitisha kwa tagi ya JSX. Kwa mfano, className, src, alt, width, na height ni baadhi ya props unazoweza kupitisha kwa <img>:

function Avatar() {
  return (
    <img
      className="avatar"
      src="https://react.dev/images/docs/scientists/1bX5QH6.jpg"
      alt="Lin Lanying"
      width={100}
      height={100}
    />
  );
}

export default function Profile() {
  return (
    <Avatar />
  );
}

Props unazoweza kupitisha kwa tagi ya <img> zimebainishwa mapema (ReactDOM inafuata kiwango cha HTML). Lakini unaweza kupitisha props zozote kwa components zako mwenyewe, kama vile <Avatar>, ili kuzibinafsisha. Hivi ndivyo unavyofanya!

Kupitisha props kwa component

Katika msimbo huu, component ya Profile haipitishi props zozote kwa component yake ya mtoto, Avatar:

export default function Profile() {
return (
<Avatar />
);
}

Unaweza kuipa Avatar props fulani kwa hatua mbili.

Hatua ya 1: Pitisha props kwa component-mtoto

Kwanza, pitisha props fulani kwa Avatar. Kwa mfano, hebu tupitishe props mbili: person (object), na size (namba):

export default function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}

Note

Kama mabano-viungo mawili baada ya person= yanakuchanganya, kumbuka kuwa ni object tu ndani ya mabano-viungo ya JSX.

Sasa unaweza kusoma props hizi ndani ya component ya Avatar.

Hatua ya 2: Soma props ndani ya component-mtoto

Unaweza kusoma props hizi kwa kuorodhesha majina yao person, size yakitenganishwa na koma ndani ya ({ na }) mara tu baada ya function Avatar. Hili hukuruhusu kuzitumia ndani ya msimbo wa Avatar, kama ambavyo ungefanya na kigezo.

function Avatar({ person, size }) {
// person na size zinapatikana hapa
}

Ongeza mantiki fulani kwa Avatar inayotumia props za person na size kwa ku-render, nawe umemaliza.

Sasa unaweza kusanidi Avatar ili i-render kwa njia nyingi tofauti kwa props tofauti. Jaribu kubadilisha thamani!

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 hukuruhusu kufikiria kuhusu components za mzazi na mtoto kwa kujitegemea. Kwa mfano, unaweza kubadilisha props za person au size ndani ya Profile bila kulazimika kufikiria jinsi Avatar inavyozitumia. Vivyo hivyo, unaweza kubadilisha jinsi Avatar inavyotumia props hizi, bila kuangalia Profile.

Unaweza kufikiria props kama “vifundo” (knobs) unavyoweza kurekebisha. Hutimiza jukumu lilelile ambalo hoja (arguments) hutimiza kwa functions—kwa hakika, props ndicho pekee kilicho hoja kwa component yako! Functions za components za React hukubali hoja moja tu, object ya props:

function Avatar(props) {
let person = props.person;
let size = props.size;
// ...
}

Kwa kawaida hauhitaji object nzima ya props yenyewe, hivyo unaipasua (destructure) kuwa props mahususi.

Pitfall

Usisahau jozi ya mabano-viungo { na } ndani ya ( na ) unapotangaza props:

function Avatar({ person, size }) {
// ...
}

Sintaksia hii inaitwa “destructuring” na inalingana na kusoma sifa kutoka kwa kigezo cha function:

function Avatar(props) {
let person = props.person;
let size = props.size;
// ...
}

Kubainisha thamani chaguo-msingi kwa prop

Kama unataka kuipa prop thamani chaguo-msingi ya kurejea pale ambapo hakuna thamani iliyobainishwa, unaweza kufanya hivyo kwa destructuring kwa kuweka = na thamani chaguo-msingi mara tu baada ya kigezo:

function Avatar({ person, size = 100 }) {
// ...
}

Sasa, kama <Avatar person={...} /> ita-render bila prop ya size, size itawekwa kuwa 100.

Thamani chaguo-msingi hutumika tu kama prop ya size haipo au kama unapitisha size={undefined}. Lakini kama unapitisha size={null} au size={0}, thamani chaguo-msingi haitatumika.

Kupeleka props kwa sintaksia ya JSX spread

Wakati mwingine, kupitisha props kunakuwa na marudio mengi sana:

function Profile({ person, size, isSepia, thickBorder }) {
return (
<div className="card">
<Avatar
person={person}
size={size}
isSepia={isSepia}
thickBorder={thickBorder}
/>
</div>
);
}

Hakuna ubaya wowote kwa msimbo wenye marudio—unaweza kuwa unaosomeka zaidi. Lakini wakati mwingine unaweza kuthamini ufupi. Baadhi ya components hupeleka props zao zote kwa watoto wao, kama ambavyo Profile hii inavyofanya na Avatar. Kwa sababu hazitumii yoyote kati ya props zao moja kwa moja, inaweza kuwa na maana kutumia sintaksia fupi zaidi ya “spread”:

function Profile(props) {
return (
<div className="card">
<Avatar {...props} />
</div>
);
}

Hili hupeleka props zote za Profile kwa Avatar bila kuorodhesha kila jina lao.

Tumia sintaksia ya spread kwa kiasi. Kama unaitumia kwenye kila component nyingine, kuna kitu hakiko sawa. Mara nyingi, hili huashiria kuwa unapaswa kugawanya components zako na kupitisha children kama JSX. Zaidi kuhusu hilo baadaye!

Kupitisha JSX kama children

Ni jambo la kawaida kupachika tagi za kivinjari zilizojengwa ndani:

<div>
<img />
</div>

Wakati mwingine utataka kupachika components zako mwenyewe kwa njia ileile:

<Card>
<Avatar />
</Card>

Unapopachika maudhui ndani ya tagi ya JSX, component-mzazi itapokea maudhui hayo katika prop iitwayo children. Kwa mfano, component ya Card iliyo hapa chini itapokea prop ya children iliyowekwa kuwa <Avatar /> na kui-render ndani ya div ya kufunika:

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>
  );
}

Jaribu kubadilisha <Avatar> iliyo ndani ya <Card> na maandishi fulani ili kuona jinsi component ya Card inavyoweza kufunika maudhui yoyote yaliyopachikwa. Haihitaji “kujua” kile kinachо-render ndani yake. Utaona mpangilio huu unaonyumbulika katika sehemu nyingi.

Unaweza kufikiria component yenye prop ya children kama iliyo na “shimo” linaloweza “kujazwa” na components zake za mzazi kwa JSX yoyote. Mara nyingi utatumia prop ya children kwa vifuniko vya kuonekana: paneli, gridi, n.k.

A puzzle-like Card tile with a slot for "children" pieces like text and Avatar

Illustrated by Rachel Lee Nabors

Jinsi props zinavyobadilika baada ya muda

Component ya Clock iliyo hapa chini hupokea props mbili kutoka kwa component yake ya mzazi: color na time. (Msimbo wa component-mzazi umeachwa kwa sababu unatumia state (hali), ambayo hatutaingia ndani yake bado.)

Jaribu kubadilisha rangi kwenye sanduku la kuchagua lililo hapa chini:

export default function Clock({ color, time }) {
  return (
    <h1 style={{ color: color }}>
      {time}
    </h1>
  );
}

Mfano huu unaonyesha kuwa component inaweza kupokea props tofauti baada ya muda. Props si tuli kila wakati! Hapa, prop ya time hubadilika kila sekunde, na prop ya color hubadilika unapochagua rangi nyingine. Props huakisi data ya component wakati wowote, badala ya mwanzoni tu.

Hata hivyo, props ni immutable—neno kutoka sayansi ya kompyuta linalomaanisha “isiyoweza kubadilika”. Wakati component inahitaji kubadilisha props zake (kwa mfano, kama jibu kwa mwingiliano wa mtumiaji au data mpya), itabidi “iiombe” component yake ya mzazi ipitishe props tofauti—object mpya! Props zake za zamani kisha zitatupwa kando, na hatimaye injini ya JavaScript itarudisha kumbukumbu iliyochukuliwa nazo.

Usijaribu “kubadilisha props”. Unapohitaji kujibu mwingiliano wa mtumiaji (kama kubadilisha rangi iliyochaguliwa), utahitaji “set state”, ambayo unaweza kujifunza kuihusu katika State: Kumbukumbu ya Component.

Recap

  • Kupitisha props, ziongeze kwenye JSX, kama ambavyo ungefanya na sifa za HTML.
  • Kusoma props, tumia sintaksia ya destructuring ya function Avatar({ person, size }).
  • Unaweza kubainisha thamani chaguo-msingi kama size = 100, ambayo hutumika kwa props zisizopo na za undefined.
  • Unaweza kupeleka props zote kwa sintaksia ya JSX spread ya <Avatar {...props} />, lakini usiitumie kupita kiasi!
  • JSX iliyopachikwa kama <Card><Avatar /></Card> itaonekana kama prop ya children ya component ya Card.
  • Props ni picha za mnepo za kusoma-tu (read-only) kwa wakati fulani: kila render hupokea toleo jipya la props.
  • Huwezi kubadilisha props. Unapohitaji mwingiliano, utahitaji kuweka state.

Challenge 1 of 3:
Toa component

Component hii ya Gallery ina markup inayofanana sana kwa profaili mbili. Toa component ya Profile kutoka kwake ili kupunguza marudio. Utahitaji kuchagua props gani za kuipitisha.

import { getImageUrl } from './utils.js';

export default function Gallery() {
  return (
    <div>
      <h1>Wanasayansi Maarufu</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>Taaluma: </b>
            mwanafizikia na mwanakemia
          </li>
          <li>
            <b>Tuzo: 4 </b>
            (Tuzo ya Nobel ya Fizikia, Tuzo ya Nobel ya Kemia, Nishani ya Davy, Nishani ya Matteucci)
          </li>
          <li>
            <b>Aligundua: </b>
            polonium (elementi ya kemikali)
          </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>Taaluma: </b>
            mwanajiokemia
          </li>
          <li>
            <b>Tuzo: 2 </b>
            (Tuzo ya Miyake ya jiokemia, Tuzo ya Tanaka)
          </li>
          <li>
            <b>Aligundua: </b>
            mbinu ya kupima kaboni dioksidi katika maji ya bahari
          </li>
        </ul>
      </section>
    </div>
  );
}