Da wir die Wartung einiger Projekte selbst übernehmen müssen, wurde der Technologie-Stack des Teams kürzlich von Vue auf React umgestellt. Als React-Neuling und weil ich immer gerne neue Dinge durch Quellcode lerne, habe ich mich entschieden, die Verwendung von React durch das Lesen des Quellcodes des berühmten Projekts antd zu erlernen. Beim Lesen des Quellcodes stellte ich fest, dass viele Komponenten die API React.cloneElement verwendeten. Obwohl ich anhand des Namens erraten konnte, was es tat, kannte ich seine spezifische Funktion nicht. Dann las ich die offizielle Dokumentation, in der die Funktion klar beschrieben wurde, uns jedoch nicht gesagt wurde, in welchen Szenarien wir es verwenden müssen. Daher habe ich einige Verwendungsszenarien basierend auf der Beschreibung im Dokument zusammengefasst, mit der Verwendung des Quellcodes kombiniert und mich an Google und Stackoverflow orientiert. Die Rolle von cloneElementReact.cloneElement( Element, [Requisiten], [...Kinder] ) Schauen Sie sich zunächst die offizielle Dokumentation dieser API an:
Um zusammenzufassen:
AnwendungsszenarienGemäß der obigen Definition können wir diese API nach Bedarf in verschiedenen Szenarien verwenden. Neue Requisiten hinzufügen Wenn wir eine gemeinsame Komponente erstellen, möchten wir jedem untergeordneten Element gemäß der internen Logik unterschiedliche Klassennamen hinzufügen. Zu diesem Zeitpunkt können wir den Angenommen, wir haben eine Timeline-Komponente, mit der wir bei Bedarf mehrere const MyTimeline = () => { zurückkehren ( <Zeitleiste> <TimelineItem>01.06.2020</TimelineItem> <TimelineItem>08.06.2020</TimelineItem> <TimelineItem>05.07.2020</TimelineItem> </Zeitleiste> ) } // Innerhalb der Zeitleiste könnte die Logik wie folgt aussehen: „import class from 'classnames';“ const Timeline = Requisiten => { // ... // ... const itemCount = React.children.count(props.children); const items = React.children.map(props.children, (item, index) => { returniere React.cloneElement(item, { Klassenname: Klasse ([ Artikel.Eigenschaften.Klassenname, "Zeitleistenelement", Index === Anzahl – 1? 'letztes Timeline-Element': '' ]) }) } return <div className={'timeline'}>{ Elemente }</div> } Zusätzlich zum Hinzufügen von Klasse Switch erweitert React.Component { rendern() { zurückkehren ( <RouterContext.Verbraucher> {Kontext => { invariant(context, "Sie sollten <Switch> nicht außerhalb eines <Routers> verwenden"); const Standort = this.props.location || Kontext.Standort; Lass das Element übereinstimmen; // Wir verwenden React.Children.forEach anstelle von React.Children.toArray().find() // hier, weil toArray Schlüssel zu allen untergeordneten Elementen hinzufügt und wir nicht wollen // um ein Unmounten/Remounten für zwei <Route>s auszulösen, die dasselbe rendern // Komponente unter verschiedenen URLs. React.Children.fürEach(this.props.children, Kind => { wenn (match == null und React.isValidElement(child)) { Element = Kind; const Pfad = Kind.props.Pfad || Kind.props.von; Übereinstimmung = Pfad ? matchPath(Standort.Pfadname, { ...child.props, Pfad }) : Kontext.Übereinstimmung; } }); Revanche React.cloneElement(Element, {Standort, berechnete Übereinstimmung: Übereinstimmung}) : null; }} </RouterContext.Consumer> ); } } Ereignisse, die Requisiten verändern Angenommen, wir haben eine Tab-Komponente, die mehrere const Tab = props => { const { beim Klicken } = Requisiten; const tabPanes = React.children.map(props.children, (tabPane, index) => { const paneClick = () => { beiKlick und beiKlick(Index); tabPane.props?.onClick(); } returniere React.cloneElement(tabPane, { bei Klick: Fensterklick, }) }) return <div>{ Tabulatortasten }</div> } Benutzerdefinierter Stil Beim Erstellen einer Komponente namens // Der Einfachheit halber werden Mausereignisse hier weggelassen. const FollowMouse = props => { const { Inhalt } = Requisiten; const customContent = React.isValidElement ? Inhalt : <span>{ Inhalt }</span> const getOffset = () => { zurückkehren { Position: 'absolut', Spitze: ..., links: ..., } } const renderContent = React.cloneElement(custonContent, { Stil: { …getOffset() } }) return <div>{ renderContent() }</div> } Schlüssel hinzufügen Wenn wir eine Liste von Elementen erstellen, können wir jedem Knoten über const ComponentButton = Eigenschaften => { const { addonAfter, untergeordnete Elemente } = Requisiten; const button = <button key='button'>{ untergeordnete Elemente }</button> const-Liste = [Schaltfläche, Add-onAfter? React.cloneElement(AddonAfter, {Schlüssel: 'Button-Addon'}: null) zurück <div>{ Liste } <div> } Zusammenfassen Bei der Entwicklung komplexer Komponenten fügen wir den untergeordneten Komponenten häufig je nach Bedarf verschiedene Funktionen oder Anzeigeeffekte hinzu. Das Dank des leistungsstarken Kombinationsmodus von React ist dies natürlich nicht auf Oben finden Sie den detaillierten Inhalt der ausführlichen Erläuterung zur Verwendung von React.cloneElement. Weitere Informationen zur Verwendung von React.cloneElement finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: Detaillierte Erklärung der binären und varbinären Datentypen in MySQL
1. Führen Sie zuerst die Select-Anweisung aus, um...
Inhaltsverzeichnis 1. Laden Sie die MySQL-MSI-Ver...
Ich habe gesehen, dass die Taobao-Webseite Import ...
Inhaltsverzeichnis Überblick So teilen Sie Daten ...
Dieser Artikel beschreibt die Linux-Dateiverwaltu...
Inhaltsverzeichnis Hintergrund 1. Was ist DNS-Pre...
MySQL ist einfach zu installieren, schnell und ve...
1. Problemeinführung Nehmen Sie ein Szenario an, ...
Perfekte Lösung für das skalierbare Spaltenproble...
Methode 1: Verwenden Sie das Dienstprogramm lsb_r...
Nach dem Docker-Lauf ist der Status immer „Beende...
Datensicherung und -wiederherstellung Teil 3, Det...
Heute habe ich die MySQL-Datenbank erneut auf mei...
Laufumgebung, Idea2020-Version, Tomcat10, beim Au...
Inhaltsverzeichnis Linux - Dateideskriptor, Datei...