Anwendungsbeispiele für React Hooks

Anwendungsbeispiele für React Hooks

Dieser Artikel stellt zwei einfache Beispiele vor, die mit React Hooks und funktionalen Komponenten entwickelt wurden.

Ein einfaches Komponentenbeispiel

Die Button-Komponente sollte als die einfachste allgemein verwendete Basiskomponente angesehen werden. Wenn wir eine Komponente entwickeln, erwarten wir, dass ihr grundlegender Stil bis zu einem gewissen Grad variiert, sodass sie auf unterschiedliche Szenarien angewendet werden kann. Der zweite Punkt ist, dass ich bei einem meiner früheren Projekte zwar eine Funktionskomponente geschrieben habe, diese Funktionskomponente jedoch sehr starr geschrieben war, das heißt, es gab keine Möglichkeit, grundlegende Methoden daran zu binden. Das heißt, ich kann nur Methoden oder Eigenschaften schreiben, die ich bereits habe. Ich möchte eine Button-Komponente schreiben. Auch wenn ich keine onClick-Methode schreibe, möchte ich die standardmäßigen Basismethoden verwenden können, die damit einhergehen.

Der erste Punkt lässt sich leichter implementieren, indem man für unterschiedliche Klassennamen unterschiedliches CSS schreibt.

Der zweite Punkt ist etwas schwieriger zu erreichen. Wir können nicht alle Standardeigenschaften von Button erneut schreiben. Es wäre schön, wenn wir alle Standardeigenschaften importieren könnten.

Tatsächlich hat uns React bereits dabei geholfen, dies zu erreichen. React.ButtonHTMLAttributes<HTMLElement> enthält die Standard-Button-Attribute. Wir können diese Schnittstelle jedoch nicht direkt verwenden, da unsere Button-Komponente möglicherweise einige angepasste Elemente enthält. Dafür können wir Typescripts typübergreifende

Typ NativeButtonProps = MyButtonProps & React.ButtonHTMLAttributes<HTMLElement>

Darüber hinaus müssen wir auch resProps verwenden, um andere nicht benutzerdefinierte Funktionen oder Eigenschaften zu importieren.

Nachfolgend sehen Sie die konkrete Implementierung der Button-Komponente:

React von „react“ importieren
Klassennamen aus „Klassennamen“ importieren

Typ ButtonSize = "groß" | "klein"
Typ ButtonType = ‚primär‘ | ‚Standard‘ | ‚Gefahr‘

Schnittstelle BaseButtonProps {
 Klassenname?: Zeichenfolge;
 deaktiviert?: Boolesch;
 Größe?: Schaltflächengröße;
 btnTyp?: Schaltflächentyp;
 Kinder?: React.ReactNode;
}

Typ NativeButtonProps = BaseButtonProps & React.ButtonHTMLAttributes<HTMLElement>
const Button: React.FC<NativeButtonProps>= (props) => {
 Konstante {
 btnTyp,
 Klassenname,
 deaktiviert,
 Größe,
 Kinder,
 //resProps wird verwendet, um alle verbleibenden Eigenschaften abzurufen ... resProps
 } = Requisiten
 // btn, btn-lg, btn-primär
 const Klassen = Klassennamen ('btn', Klassenname, {
 [`btn-${btnType}`]: btnTyp,
 [`btn-${size}`]: Größe,
 'deaktiviert': deaktiviert
 })
 zurückkehren (
 <Schaltfläche
  Klassenname={Klassen}
  deaktiviert={deaktiviert}
  {...resProps}
 >
  {Kinder}
 </button>
 )
}

Schaltfläche.defaultProps = {
 deaktiviert: false,
 btnType: „Standard“
}

Schaltfläche „Standard exportieren“

Auf die oben beschriebene Weise können wir die onClick-Methode in unserer benutzerdefinierten Button-Komponente verwenden. Nachfolgend finden Sie Beispiele zur Verwendung der Schaltflächenkomponente:

<Button deaktiviert>Hallo</Button>
<Button btnType='primary' size='large' className="haha">Hallo</Button>
<Button btnType='Gefahr' size='klein' onClick={() => alert('haha')}>Test</Button>

Der Anzeigeeffekt ist wie folgt:

In diesem Code haben wir ein neues npm-Paket namens classnames eingeführt. Informationen zur spezifischen Verwendung finden Sie unter GitHub Classnames. Damit lässt sich die Erweiterung von className problemlos implementieren. Ein einfaches Anwendungsbeispiel lautet wie folgt:

Klassennamen('foo', 'Bar'); // => 'foo Bar'
Klassennamen('foo', {bar: true}); // => 'foo bar'
Klassennamen ({'foo-bar': true}); // => 'foo-bar'
Klassennamen({ 'foo-bar': false }); // => ''
Klassennamen({ foo: true }, { bar: true }); // => 'foo bar'
Klassennamen({ foo: true, bar: true }); // => 'foo bar'

// viele Argumente verschiedener Typen
Klassennamen('foo', {bar: true, duck: false}, 'baz', {quux: true}); // => 'foo bar baz quux'

// andere falsche Werte werden einfach ignoriert
Klassennamen (null, falsch, „Balken“, nicht definiert, 0, 1, { baz: null }, „“); // => „Balken 1“

Durch die Verwendung von Klassennamen können Sie Button problemlos personalisierte Attribute hinzufügen. Sie können sehen, dass in der HTML-Ausgabe der Komponente hahaclassName vorhanden ist:

<button class="btn haha ​​​​btn-primary btn-lg">Hallo</button>

Gleichzeitig löst die obige Codemethode auch das Problem, dass benutzerdefinierte Komponenten keine Standardeigenschaften und -methoden verwenden können.

Komplexerer Fall von Eltern-Kind-Komponenten

Als nächstes zeigen wir Ihnen, wie Sie Funktionskomponenten verwenden, um eine Menüfunktion zu vervollständigen. Dieses Menü fügt zwei Funktionsmodi hinzu: horizontaler Modus und vertikaler Modus. Klicken Sie auf ein Menüdetail und verwenden Sie dieses Detail als untergeordnete Komponente.

Natürlich erfordert die Menüfunktion nicht, dass die übergeordnete Komponente Daten an die untergeordnete Komponente übergibt (die untergeordnete Komponente bezieht sich auf die Menüdetails). Um zu lernen und zu demonstrieren, wie Daten der übergeordneten Komponente an die untergeordnete Komponente übergeben werden, fügen wir diese Funktion zwangsweise hinzu. Es ist etwas überflüssig, ich hoffe, dass es jeder versteht.

Zunächst wird die Funktionsbeschreibung der übergeordneten und untergeordneten Komponenten vorgestellt. „Menu“ ist die übergeordnete Komponente, „MenuItem“ ist jedes einzelne kleine Menü und „SubMenu“ enthält ein Dropdown-Menü, auf das geklickt werden kann.

Die folgende Abbildung zeigt, wie es nach der Erweiterung aussieht:

Die allgemeine Codestruktur ist wie folgt:

<Menü defaultIndex={'0'} onSelect={(index) => {alert(index)}} mode="vertical" defaultOpenSubMenus={['2']}>
 <Menüpunktindex={'0'}>
 cooler Link
 </Menüpunkt>
 <Menüpunktindex={'1'}>
 cooler Link 2
 </Menüpunkt>
 <Untermenü Titel="Dropdown">
 <Menüpunktindex={'3'}>
  Dropdown 1
 </Menüpunkt>
 <Menüpunktindex={'4'}>
  Dropdown 2
 </Menüpunkt>
 </Untermenü>
 <Menüpunktindex={'2'}>
 cooler Link 3
 </Menüpunkt>
</Menü>

In dieser Komponente haben wir useState verwendet. Da dabei Daten von der übergeordneten Komponente an die untergeordnete Komponente übergeben werden, haben wir außerdem useContext verwendet (Daten von der übergeordneten Komponente an die untergeordnete Komponente übergeben bedeutet, die Indexdaten der übergeordneten Komponente an die untergeordnete Komponente zu übergeben). Darüber hinaus demonstrieren wir auch die Verwendung von benutzerdefiniertem onSelect zur Implementierung der onClick-Funktionalität (falls Sie es nicht schaffen, React-Generika einzuführen, oder nicht wissen, welche React-Generika Sie einführen sollen, können Sie zur Abhilfe benutzerdefinierte verwenden).

So schreiben Sie onSelect

Damit onSelect später im riesigen Code-Ozean nicht schwer zu finden ist, finden Sie hier ein einfaches Beispiel zum Schreiben von onSelect. Beispielsweise verwenden wir onSelect in der Menükomponente und die Verwendung sieht genauso aus wie bei onClick:

<Menü bei Auswahl={(index) => {alert(index)}}>

In dieser speziellen Menükomponente kann die Methode onSelect wie folgt geschrieben werden:

Typ SelectCallback = (selectedIndex: Zeichenfolge) => void

Schnittstelle MenuProps {
 beiAuswahl?: SelectCallback;
}

Die Methode zur Implementierung von handleClick kann wie folgt geschrieben werden:

 const handleClick = (Index: Zeichenfolge) => {
 // onSelect ist ein Union-Typ, der existieren kann oder nicht, daher müssen wir entscheiden, ob (onSelect) {
  bei Auswahl(Index)
 }
 }

Wenn Sie dieses onSelect an die untergeordnete Komponente weitergeben möchten, verwenden Sie einfach onSelect: handleClick, um es zu binden. (Vielleicht haben Sie es nicht so gut verstanden, und ich weiß auch nicht, wie ich es schreiben soll. Später folgt eine Gesamtanalyse des Codes, und wenn Sie ihn gemeinsam lesen, ist er möglicherweise leichter zu verstehen.)

Reagieren.Kinder

Bevor der spezifische Code erläutert wird, gibt es noch einige kleine Wissenspunkte, einer davon ist React.Children.

React.Children bietet Hilfsmethoden für die Arbeit mit der undurchsichtigen Datenstruktur this.props.children.

Warum müssen wir React.Children verwenden? Dies liegt daran, dass beim Übergeben von Daten der übergeordneten Komponente an die untergeordneten Komponenten die untergeordneten Komponenten möglicherweise zweimal durchlaufen oder weiter verarbeitet werden müssen. Wir können jedoch nicht garantieren, ob Unterkomponenten vorhanden sind oder nicht, bzw. ob eine, zwei oder mehr vorhanden sind.

Für this.props.children gibt es drei mögliche Werte: Wenn die aktuelle Komponente keine untergeordneten Knoten hat, ist sie undefiniert; wenn ein untergeordneter Knoten vorhanden ist, ist der Datentyp ein Objekt; wenn mehrere untergeordnete Knoten vorhanden sind, ist der Datentyp ein Array. Seien Sie daher vorsichtig im Umgang mit this.props.children[1].

React bietet eine Hilfsmethode React.Children zum Verarbeiten von this.props.children. Wir können React.Children.map verwenden, um über untergeordnete Knoten zu iterieren, ohne uns darum kümmern zu müssen, ob der Datentyp von this.props.children undefiniert oder ein Objekt[1] ist.

Wenn es also übergeordnete und untergeordnete Komponenten gibt und wir die untergeordneten Komponenten weiter verarbeiten müssen, können wir React.Children verwenden, um sie zu durchlaufen, sodass aufgrund von Änderungen am Typ von this.props.children keine Fehler auftreten.

React.cloneElement

React.Children tritt möglicherweise häufig zusammen mit React.cloneElement auf. Daher müssen wir auch React.cloneElement einführen.

Bei der Entwicklung komplexer Komponenten müssen wir den untergeordneten Komponenten häufig je nach Bedarf verschiedene Funktionen oder Anzeigeeffekte hinzufügen. React-Elemente selbst sind unveränderliche Objekte. props.children sind eigentlich nicht die untergeordneten Elemente selbst, sondern nur der Deskriptor der untergeordneten Elemente. Wir können keine seiner Eigenschaften ändern und können nur seinen Inhalt lesen. Daher ermöglicht uns React.cloneElement, seine Elemente zu kopieren und neue Props zu ändern oder hinzuzufügen, um unsere Ziele zu erreichen [2].

Beispielsweise müssen wir manchmal untergeordnete Elemente weiter verarbeiten, aber da das React-Element selbst unveränderlich ist, müssen wir es zur weiteren Verarbeitung klonen. Wir hoffen, dass die Unterkomponenten dieser Menükomponente nur von zwei Typen sein können: MenuItem oder SubMenu. Wenn es sich um andere Typen handelt, wird eine Warnmeldung ausgegeben. Im Einzelnen lässt sich der Code grob wie folgt schreiben:

wenn (Anzeigename === 'Menüelement' || Anzeigename === 'Untermenü') {
 // Klonen und ein neues React-Element mit dem Element als Beispiel zurückgeben. Der erste Parameter ist das geklonte Beispiel. return React.cloneElement(childElement, {
 index: index.toString()
 })
} anders {
 console.error("Warnung: Das Menü hat ein untergeordnetes Element, das keine MenuItem-Komponente ist")
}

So übergeben Sie Daten übergeordneter Komponenten an untergeordnete Komponenten

Der Kontext wird verwendet, um Daten übergeordneter Komponenten an untergeordnete Komponenten zu übergeben. Wenn Sie mit Context nicht vertraut sind, können Sie das offizielle Dokument Context zu Rate ziehen. In der übergeordneten Komponente erstellen wir Context über createContext und in der untergeordneten Komponente erhalten wir Context über useContext.

Indexdatentransfer

Die Hauptvariable zum Implementieren der Datenübertragung zwischen übergeordneten und untergeordneten Komponenten in der Menükomponente ist der Index.

Abschließend wird der komplette Code angehängt. Zuerst kommt die übergeordnete Komponente Menü:

importiere React, { useState, createContext } von 'react'
Klassennamen aus „Klassennamen“ importieren
importiere { MenuItemProps } aus './menuItem'

Typ MenuMode = "horizontal" | "vertikal"
Typ SelectCallback = (selectedIndex: Zeichenfolge) => void

Exportschnittstelle MenuProps {
 defaultIndex?: string; // Welche Menüunterkomponente wird zum Hervorheben von className verwendet?: string;
 Modus?: Menümodus;
 Stil?: React.CSSProperties;
 onSelect?: SelectCallback; // Das Klicken auf ein Untermenü kann einen Rückruf auslösen defaultOpenSubMenus?: string[]; 
}

// Bestimmen Sie den Datentyp, der von der übergeordneten Komponente an die untergeordnete Komponente übergeben wird Schnittstelle IMenuContext {
 Index: Zeichenfolge;
 beiAuswahl?: SelectCallback;
 Modus?: Menümodus;
 defaultOpenSubMenus?: string[]; // Daten müssen an Kontext übergeben werden
}

//Erstellen Sie einen Kontext, der an die untergeordnete Komponente übergeben wird
// Allgemeine Einschränkung, da der Index der einzugebende Wert ist. Schreiben Sie hier also einen Standardanfangswert. export const MenuContext = createContext<IMenuContext>({index: '0'})

const Menü: React.FC<MenuProps> = (props) => {
 const { Klassenname, Modus, Stil, untergeordnete Elemente, Standardindex, bei Auswahl, standardmäßig geöffnete Untermenüs} = Eigenschaften
 // Es sollte nur ein MenuItem im aktiven Status sein. Verwenden Sie useState, um seinen Status zu steuern. const [ currentActive, setActive ] = useState(defaultIndex)
 const classes = classNames('menu-demo', className, {
 'menu-vertikal': Modus === 'vertikal',
 „Menü horizontal“: Modus === „horizontal“
 })

 // handleClick definieren, um die Änderung des aktiven Zustands nach dem Klicken auf menuItem zu implementieren const handleClick = (index: string) => {
 setActive(index)
 // onSelect ist ein Union-Typ, der existieren kann oder nicht, daher müssen wir entscheiden, ob (onSelect) {
  bei Auswahl(Index)
 }
 }

 // Wenn Sie auf eine Unterkomponente klicken, lösen Sie die Funktion onSelect aus und ändern Sie die Hervorhebungsanzeige const passedContext: IMenuContext = {
 // currentActive ist vom Typ String | undefined und Index ist vom Typ Number, daher müssen wir die folgende Entscheidung treffen, um den Typindex weiter zu klären: currentActive ? currentActive : '0',
 onSelect: handleClick, // Rückruffunktion, ob beim Klicken auf eine Unterkomponente der Modus ausgelöst werden soll: Modus,
 Standardmäßige offene Untermenüs,
 }

 const renderChildren = () => {
 returniere React.Children.map(Kinder, (Kind, Index) => {
  // child enthält viele Typen. Um den Typ zu erhalten, den wir für intelligente Eingabeaufforderungen benötigen, müssen wir die Typbehauptung const childElement = child as React.FunctionComponentElement<MenuItemProps> verwenden.
  const { Anzeigename } = untergeordnetesElement.Typ
  wenn (Anzeigename === 'Menüelement' || Anzeigename === 'Untermenü') {
  // Klonen und ein neues React-Element mit dem Element als Beispiel zurückgeben. Der erste Parameter ist das geklonte Beispiel. return React.cloneElement(childElement, {
   index: index.toString()
  })
  } anders {
  console.error("Warnung: Das Menü hat ein untergeordnetes Element, das keine MenuItem-Komponente ist")
  }
 })
 }
 zurückkehren (
 <ul Klassenname={Klassen} Stil={Stil}>
  <MenuContext.Provider-Wert={passedContext}>
  {renderChildren()}
  </MenuContext.Provider>
 </ul>
 )
}

Menü.defaultProps = {
 Standardindex: '0',
 Modus: 'horizontal',
 Standardmäßig werden Untermenüs geöffnet: []
}

Standardmenü exportieren

Dann die MenuItem-Unterkomponente:

React von „react“ importieren
importiere { useContext } von 'react'
Klassennamen aus „Klassennamen“ importieren
importiere { MenuContext } aus './menu'

Schnittstelle MenuItemProps exportieren {
 Index: Zeichenfolge;
 deaktiviert?: Boolesch;
 Klassenname?: Zeichenfolge;
 Stil?: React.CSSProperties;
}

const MenuItem: React.FC<MenuItemProps> = (props) => {
 const { index, deaktiviert, Klassenname, Stil, untergeordnete Elemente } = Requisiten
 const Kontext = useContext(MenüKontext)
 const classes = classNames('Menüelement', className, {
 'is-disabled': deaktiviert,
 // Implementieren Sie die spezifische Logik zum Hervorheben von „is-active“: context.index === index
 })
 const handleClick = () => {
 // Nach der Deaktivierung kann onSelect nicht mehr verwendet werden. Da der Index optional ist, existiert er möglicherweise nicht. Sie müssen typeof verwenden, um eine Entscheidung zu treffen, ob (context.onSelect && !disabled && (typeof index === 'string')) {
  Kontext.beiAuswahl(Index)
 }
 }
 zurückkehren (
 <li Klassenname = {Klassen} Stil = {Stil} beiKlick = {HandleClick}>
  {Kinder}
 </li>
 )
}

MenuItem.displayName = "Menüelement"
Standard-Menüelement exportieren

Und schließlich die Unterkomponente SubMenu:

importiere React, { useContext, FunctionComponentElement, useState } von 'react'
Klassennamen aus „Klassennamen“ importieren
importiere { MenuContext } aus './menu'
importiere { MenuItemProps } aus './menuItem'

Exportschnittstelle SubMenuProps {
 Index?: Zeichenfolge;
 Titel: Zeichenfolge;
 Klassenname?: Zeichenfolge
}

const SubMenu: React.FC<SubMenuProps> = ({ index, title, children, className }) => {
 const Kontext = useContext(MenüKontext)
 // Als nächstes werden wir einige Methoden eines String-Arrays verwenden. Machen Sie also zuerst eine Typbehauptung und behaupten Sie sie als String-Array-Typ const openedSubMenus = context.defaultOpenSubMenus as Array<string>
 //Mithilfe von „include“ ermitteln, ob ein Index vorhanden ist
 const isOpened = (Index und Kontext.Modus === 'vertikal') ? openedSubMenus.includes(Index) : false
 const [ menuOpen, setOpen ] = useState(isOpened) // isOpened gibt true oder false zurück, was ein dynamischer Wert ist const classes = classNames('menu-item submenu-item', className, {
 „ist aktiv“: Kontext.index === Index
 })
 // Wird verwendet, um das Dropdown-Menü anzuzeigen oder auszublenden const handleClick = (e: React.MouseEvent) => {
 e.preventDefault()
 setOpen(!menuOpen)
 }
 let-Timer: beliebig
 // Mit Toggle wird bestimmt, ob geöffnet oder geschlossen werden soll const handleMouse = (e: React.MouseEvent, toggle: boolean) => {
 Zeitüberschreitung löschen(Timer)
 e.preventDefault()
 Timer = setzeTimeout(()=> {
  setOpen(Umschalten)
 }, 300)
 }
 // Ternärer Ausdruck, vertikal const clickEvents = context.mode === 'vertical' ? {
 bei Klick: Klick verarbeiten
 } : {}
 const hoverEvents = Kontext.Modus === 'horizontal' ? {
 beiMauseingabe: (e: React.MouseEvent) => { handleMouse(e, true) },
 beimMauslassen: (e: React.MouseEvent) => { handleMouse(e, false) },
 } : {}

 // Wird verwendet, um den Inhalt des Dropdown-Menüs zu rendern // Gibt zwei Werte zurück, der erste ist das untergeordnete Element, der zweite ist der Index, dargestellt durch i const renderChildren = () => {
 const subMenuClasses = classNames('Menü-Untermenü', {
  'Menü geöffnet': Menü öffnen
 })
 // Mit der folgenden Funktion wird implementiert, dass es im Untermenü nur MenuItems geben kann
 const childrenComponent = React.Children.map(children, (child, i) => {
  const childElement = child als FunctionComponentElement<MenuItemProps>
  wenn (childElement.type.displayName === 'MenuItem') {
  returniere React.cloneElement(childElement, {
   Index: `${index}-${i}`
  })
  } anders {
  console.error("Warnung: SubMenu hat ein untergeordnetes Element, das keine MenuItem-Komponente ist")
  }
 })
 zurückkehren (
  <ul Klassenname={Untermenüklassen}>
  {Kinderkomponente}
  </ul>
 )
 }
 zurückkehren (
 // Operator erweitern, Funktionalität im Inneren hinzufügen, mit der Maus darüberfahren <li key={index} className={classes} {...hoverEvents}>
  <div className="Untermenü-Titel" {...clickEvents}>
  {Titel}
  </div>
  {renderChildren()}
 </li>
 )
}

SubMenu.displayName = "Untermenü"
Standard-Untermenü exportieren

Verweise

  • React.Children-Nutzung
  • Verwendung von React.cloneElement

Oben sind die Einzelheiten des Anwendungsbeispiels von React Hook aufgeführt. Weitere Informationen zur Verwendung von React Hook finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • 5 Dinge, die beim Schreiben von React-Komponenten mit Hooks zu beachten sind
  • Einführungstutorial zu React Hooks
  • Beispielcode für die Entwicklung einer H5-Formularseite basierend auf React-Hooks und der Konfiguration der Zarm-Komponentenbibliothek
  • Mehr als 100 Zeilen Code zur Implementierung von React Drag Hooks
  • Einführung und Verwendungstutorial zum Hook in React
  • Detaillierte Erklärung zur Verwendung von React Hooks zum Anfordern und Rendern von Daten
  • Detaillierte Erklärung zur Verwendung von React-Hooks
  • Implementierung und Ursprung von React Hooks sowie detaillierte Erläuterung der damit gelösten Probleme
  • So führen Sie Unit-Tests für React-Hooks durch
  • React verwendet Hooks, um die Zustandsbindung gesteuerter Komponenten zu vereinfachen
  • Häufige Verwendung von Hooks in React

<<:  Mysql 5.6 fügt eine Methode zum Ändern von Benutzername und Passwort hinzu

>>:  Nginx verwendet ctx, um Datenfreigabe- und Kontextänderungsfunktionen zu realisieren

Artikel empfehlen

Zukunftsweisendes Allround-Webdesign: Progressive Enhancement

<br />Original: Progressive Enhancement vers...

Vue+js: Klicken Sie auf den Pfeil, um die Bilder zu wechseln

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erläuterung der Nginx-Prozessverwaltungs- und Neuladeprinzipien

Prozessstrukturdiagramm Nginx ist eine Multiproze...

vue + tp5 realisiert eine einfache Anmeldefunktion

In diesem Artikelbeispiel wird der spezifische Co...

12 nützliche Array-Tricks in JavaScript

Inhaltsverzeichnis Array-Deduplizierung 1. from()...

Implementierungsbeispiel für den Bildupload mit Vue+Element+Springboot

Vor kurzem hatte ich zufällig Kontakt mit dem Pro...

Globale Aufrufimplementierung von Vue2.x Picker auf mobilen Endgeräten

Inhaltsverzeichnis Was ist die Picker-Komponente ...

CSS zum Erzielen eines Chat-Blaseneffekts

1. Rendern JD-Effekt Simulationseffekt 2. Grundsa...