Render props
Analogiškai, kaip SLOT paternas, tik sudėtingesnis. Komponentai turi daug atsakomybės. Bet mes negalime panaudoti SLOT, nes vaikiniai komponentai priklausomi nuo local state. Mes galime naudoti vaikinių komponentai per propsus strategiją. Galime paimti ne React komponentą, bet STATE giją, kurie piešia vaikinius komponentus.
Buvo:
graph TD; APP-->ComponentA; STATE-->ComponentA; ComponentA-->ComponentB;
Tapo:
graph TD; APP-->ComponentA; STATE-->ComponentA; APP-->ComponentB;
Render props perduodami
Pavyzdys
SLOT komponentai nesusieti, JSX perduodami per props. TracksTable ir TracksDayHeadCell nesusieti.
<TracksTable tableContainerRef={tableContainerRef} days={getVisibleDays().map((day) => ( <TracksDayHeadCell key={day} day={day} selectedMonth={selectedMonth} selectedYear={selectedYear} currentDayRef={currentDayRef} getweekday={getWeekday} /> ))}
Modifikakuojame vaiką:
- dabar grąžina reactnode
days: (ref: React. RefObject<HTMLTableCellElement>) => React.ReactNode;irchildren: React.ReactNode; - iškviečiame perduotą funkciją
{days(currentDayRef)}
export function TracksTable({ days, children, }:{ days: (ref: React. RefObject<HTMLTableCellElement>) => React.ReactNode; children: React.ReactNode; }) { ... return ( <div className={styles.tableContainer) ref={tableContainerRef}> <table className={styles table}> <thead> <tr> <th>Task</th> {days(currentDayRef)} <th>Total</th> </tr> </thead> <tbody>{children}</tbody>1,0x </table> </div>
Dabar render props - renderinimui perduodamas lokalus state/props
<TracksTable days (currentDayRef) => getVisibleDays().map((day) => ( <TracksDayHeadCell key={day} day={day} selectedMonth={selectedMonth} selectedYear={selectedYear} currentDayRef={currentDayRef} getWeekday={getWeekday} /> )) } >
Pavyzdys
graph TD; OP(["Outside props"])-->FNC; IP(["Inside props"])-->FNC; FNC-->Component;
- render props
renderTask={(task) => ( - render props
getDayTracks(day, task)
renderTask={(task) => ( <TracksTaskRow getTaskTotal={getTaskTotal} task={task} days={getVisibleDays().map((day) => ( <TracksCell day={day} task={task} getDayTracks={getDayTracks} handleCellClick={handleCellClick} tracks={getDayTracks(day, task).map((track) => <TableTrack key={track.id} track={track} actions={ <TracksActions track={track} handleUpdateTrack={handleUpdateTrack} handleDeleteTrack={handleDeleteTrack} /> ))} /> ))}
Pliusai
- Tas pats, kas su SLOT
- Leidzia
inkapsuliuotiSTATE
Minusai
- Sunku suprasti kodą
- Sunku
juniorprogramuotojams
Svarbu
- naudoti atsargiai, kartais lengviau pakeisti į
localglobal state