reactjs - Kuinka tämä komponentti renderöi lapsensa?
Opiskelen react-accessible-accordionin koodia, enkä ymmärrä, miten se renderöi lapsensa.
Tiedostosta Accordion.tsx:
export default class Accordion extends React.Component<AccordionProps> {
// ... defaults
renderAccordion = (accordionContext: AccordionContext): JSX.Element => {
const {
preExpanded,
allowMultipleExpanded,
allowZeroExpanded,
onChange,
...rest
} = this.props;
return <div data-accordion-component="Accordion" {...rest} />;
};
render(): JSX.Element {
return (
<Provider
preExpanded={this.props.preExpanded}
allowMultipleExpanded={this.props.allowMultipleExpanded}
allowZeroExpanded={this.props.allowZeroExpanded}
onChange={this.props.onChange}
>
<Consumer>{this.renderAccordion}</Consumer>
</Provider>
);
}
}
Tämä komponentti hyväksyy muutaman tason sisäkkäisiä lapsia. Tarkemmin sanottuna, en ymmärrä, miten ne välitetään alaspäin.
Voin nähdä, että komponentti levittää loput propsit itse sulkeutuvaan Accordion-div-elementtiin... Miten tuo mekanismi onnistuu renderöimään useita lapsitasoja?
Vastaus #1
React-konteksti Consumer odottaa funktiota lapsenaan sisällön renderöimiseksi. Tässä esimerkissä tätä funktiota viitataan nimellä this.renderAccordion:
<Consumer>{this.renderAccordion}</Consumer>
Mikä renderöi lapset {...rest} levitysattribuuteissa:
const {
preExpanded,
allowMultipleExpanded,
allowZeroExpanded,
onChange,
...rest
} = this.props;
return <div data-accordion-component="Accordion" {...rest} />;
Koodi ...rest sisältää children-elementit this.props-kohteesta (ja voit itse asiassa renderöidä children-elementtejä attribuuttina, kuten <div children={ <p>Hei!</p> } />) purkamisassignmentin yhteydessä -- toisin sanoen const { ...rest }=this.props sisältää this.props.children.
Vastaus #2
On Provider tarjoamaan ja Consumer renderöimään lapsikomponentteja, koska propsit levitetään Consumeriin ja children on Accordiann prop.
Tässä käytetään kuluttajaa
Yksittäisille komponenteille, kuten AccordianItem, tämä käyttää Provider-komponenttia määrittämään komponentit, jotka on tarkoitettu renderoitaviksi.
