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
Methode 1: Setzen Sie das schreibgeschützte Attrib...
Inhaltsverzeichnis Implementierung der Statusfrei...
In diesem Artikelbeispiel wird der spezifische Co...
Gegeben: Ein Array [1,8,5,4,3,9,2], schreiben Sie...
Die Frontend-Entwicklungsabteilung wächst, die Mi...
Inhaltsverzeichnis Funktionsdefinitionsmethode Fu...
Informationen zur Bedienung finden Sie hier in de...
Einführung react-i18next ist ein leistungsstarkes...
Inhaltsverzeichnis 1. Grundlagen 2. Problembeschr...
Inhaltsverzeichnis Speicher-Engine Von MySQL unte...
Haftungsausschluss: Mit dieser Methode zum Zurück...
Absolute Positionierungsmethode: (1) Stellen Sie ...
Inhaltsverzeichnis 1. Warum Redux 2. Redux-Datenf...
In diesem Artikel wird der spezifische Code von j...
Wenn Sie MySQL kennen, werden Sie feststellen, da...