Beispielcode für die Entwicklung einer H5-Formularseite basierend auf React-Hooks und der Konfiguration der Zarm-Komponentenbibliothek

Beispielcode für die Entwicklung einer H5-Formularseite basierend auf React-Hooks und der Konfiguration der Zarm-Komponentenbibliothek

Vor kurzem habe ich React Hooks in Kombination mit der Zarm-Komponentenbibliothek verwendet, um eine große Anzahl von H5-Formularseiten basierend auf der JS-Objektkonfiguration zu entwickeln. Wie wir alle wissen, sind die Funktionen von h5-Formularen nichts anderes als das Sammeln, Überprüfen, Senden und Echo-Bearbeiten von Formulardaten. Normalerweise wird die Anordnung in einer Zeile und einer Spalte von oben nach unten angezeigt. Daher haben wir von Anfang an überlegt, eine konfigurierbare Seitengenerierungslösung zu kapseln. Derzeit werden viele Projekte basierend auf dieser Konfiguration entwickelt und gestartet. Lassen Sie uns die Ideen und die Umsetzung teilen.

Anwendungsszenarien

Jede h5-Seite, die ein Formular enthält (verwenden Sie die zarm-Bibliothek oder passen Sie Ihre eigene Bibliothek an)

Ziel

  • Einfache und prägnante Code-Implementierung
  • Konfigurationsbasiert
  • Neueinsteiger können schnell und ohne Lernkosten loslegen
  • Für erfahrene Benutzer leicht erweiterbar und wartbar

Vor dem Schreiben habe ich auf einige Lösungen auf dem Markt verwiesen. Die meisten von ihnen definieren eine Reihe von Formaten durch Definieren des JSON-Schemas. Beispielsweise definiert Alibabas Form-Render das Formular durch das JSON-Schema, verfügt über eine visuelle Editorkonfiguration, exportiert JSON-Dateien, dynamisches Rendering usw. Hier werden wir Ali Form-Render als Beispiel nehmen und über einige seiner Mängel sprechen (Informationen zu seinen Vorteilen finden Sie auf der offiziellen Website für Werbung).

Einige Mängel der Form-Darstellung oder Ideen

1. Mein Ziel ist h5. Form-remder ist derzeit nur eine PC-Backend-Formularkonfigurationslösung, die Antd- und Fusion-Themen bereitstellt und h5 standardmäßig nicht unterstützt.

2.form-render unterstützt erweiterte Komponenten. Es verwaltet intern eine Zuordnungstabelle, die die Zuordnungsbeziehung zwischen Datentypen und Komponenten abbildet. Beispielsweise ist die Zuordnungsbeziehung zwischen den Datentypen des Antd-Themas und den Antd-Komponenten wie folgt. Wenn ich meine eigene h5-Komponentenbibliothek habe/ein Drittunternehmen sie einheitlich verwendet, muss ich die Erweiterung selbst konfigurieren, was mühsam ist.

// Beispielsweise sieht die Zuordnung unter antd wie folgt aus:
exportiere const Zuordnung = {
 Standard: „Eingabe“,
 Zeichenfolge: "Eingabe",
 Array: "Liste",
 Boolesch: 'Kontrollkästchen',
 Ganzzahl: 'Zahl',
 Nummer: 'Nummer',
 Objekt: "Karte",
 html: "html",
 'string:upload': 'hochladen',
 'Zeichenfolge:Datum': 'Datum',
 'Zeichenfolge:Datum/Uhrzeit': 'Datum',
 'Zeichenfolge:Zeit': 'Datum',
 'string:textarea': 'Textbereich',
 'Zeichenfolge:Farbe': 'Farbe',
 'Zeichenfolge:Bild': 'Eingabe',
 'Zeichenfolge: E-Mail': 'Eingabe',
 'Zeichenfolge: URL': 'URL',
 'Bereich:Datum': 'Datumsbereich',
 'Bereich:Datum/Uhrzeit': 'Datumsbereich',
 '*?enum': 'auswählen',
 'Array?enum': 'Kontrollkästchen',
};

Wenn Sie JSON-Schema-basierte Tools wie Form-Render verwendet/entwickelt haben, gibt es eine Anforderung, die schwieriger zu handhaben ist, wie z. B. die Verknüpfungsverarbeitung von Formularfeldern. Form-Render bietet eine begrenzte Anzahl von Verknüpfungsattributen, wie z. B. ui:options, ui:disabled, ui:hidden usw. Auf diese Weise müssen Sie sich neben der Beherrschung der von Form-Render definierten Datentypen, der Zuordnung von Datentyp-Theme-Komponenten und verschiedener mit Komponenten verknüpfter Attribute auch zusätzliche Verknüpfungsattribute merken. Es ist nichts anderes als das Erlernen der Komplexität einer neuen Programmiersprache, daher ist eine visuelle Schnittstelle erforderlich, die beim Bearbeiten hilft.

importiere React, { useState } von 'react';
importiere FormRender aus „form-render/lib/antd“;

const schema = {
 Typ: "Objekt",
 Eigenschaften:
 wählen: {
  Titel: 'Single Choice',
  Typ: "Zeichenfolge",
  Aufzählung: ['a', 'b'],
  enumNames: () => ['Eingabefeld anzeigen', 'Eingabefeld ausblenden'],
  'ui:disabled': (formData, rootValue) => rootValue.input1.length > 5,
  'ui:widget': 'Radio',
 },
 Eingabe1: {
  Titel: 'Eingabefeld',
  Beschreibung: 'Versuchen Sie, mehr als 5 Zeichen einzugeben',
  Typ: "Zeichenfolge",
  'ui:hidden': (Formulardaten, Stammwert) => Formulardaten.select === 'b',
 },
 },
};

const Demo1 = () => {
 const [formData, setFormData] = useState({});
 zurückkehren (
 <FormRender schema={schema} formData={formData} onChange={setFormData} />
 );
};

Standard-Demo1 exportieren;

4. Diese JSON-Konfiguration eignet sich für Nicht-Entwickler, um schnell Formularfunktionen zu erstellen, aber nicht für Entwickler, um Erweiterungen zu entwickeln. Ich möchte beispielsweise einen gemischten Text und ein Bild zwischen zwei Eingabefeldern einfügen. (Eine benutzerdefinierte Komponente entwickeln, um sie separat zu mounten?)

Javascript-Objektlösung

Daher können Lösungen wie Ali Form-Render, die JSON-Konfigurationen verwenden, um dynamisches Rendering zu erreichen, die Überlebenskriterien von Programmierern nicht erfüllen: einfach, schnell, bahnbrechend und Win-Win. Wenn JSON durch ein JavaScript-Objekt ersetzt wird, sind die Konfigurations- und Erweiterungsmöglichkeiten anders. Hier verwenden wir immer noch die Gesamtidee von Form-Render, ändern aber den Typ von Zeichenfolge, Zahl, Boolescher Wert, Array, Objekt, HTML und anderen Datentypen in Funktion. Eine Funktion ist eine React-Komponente, wie die Eingabekomponente von antd-mobile und zarm. Da dieser Artikel auf zarm basiert, basiert das Folgende auf zarm (gilt auch für mobile/PC-Terminals von Drittanbietern wie antd-mobile und vue), beispielsweise die folgende Konfiguration

importiere React, { useState, useEffect } von „react“;
FormRenderer aus „zarm-form-render“ importieren;
importiere { Input, Zelle, Radio, Auswahl, Datumsauswahl, Schaltfläche, Toast, Panel } aus „zarm“;

exportiere Standardfunktion App() {
 const [Daten, setze Daten] = useState({});

 const layoutData = [
 {
  Typ: Eingabe,
  Bezeichnung: „Name des Versicherten“,
  Platzhalter: 'Bitte ausfüllen',
  Name: "Name",
 },
 {
  Typ: Radio.Group,
  Bezeichnung: "Geschlecht",
  Name: 'Geschlecht',
  elProps: {
  Typ: "Schaltfläche",
  Geist: wahr,
  },
  Artikel: [
  { label: 'männlich', value: 'männlich' },
  { label: 'weiblich', value: 'weiblich' },
  ],
 },
 {
  rendern() {
  wenn (!data.gender) null zurückgibt;
  return <Cell title="Sie sind" description={data.gender === 'männlich' ? 'Junge' : 'Mädchen'}></Cell>;
  },
 },
 {
  Typ: Auswählen,
  Etikett: 'Lieblingsfrucht',
  Name: 'Lieblingsessen',
  elProps: {
  Datenquelle: [
   { Bezeichnung: 'Apfel', Wert: 'Apfel' },
   { Bezeichnung: 'Banane', Wert: 'Banane' },
  ],
  },
 },

 {
  Typ: DateSelect,
  Beschriftung: 'Geburtsdatum',
  Titel: „Geburtsdatum der versicherten Person“,
  Platzhalter: 'Bitte auswählen',
  Name: 'Geburtstag',
  min: '1900-01-01',
 },
 {
  Typ: Eingabe,
  Bezeichnung: 'Mobiltelefonnummer',
  Platzhalter: 'Bitte ausfüllen',
  Name: "mobile",
 },
 {
  rendern() {
  Geben Sie <div style={{ margin: '30px 6px',}}></div> zurück;
  },
 },
 {
  rendern() {
  zurückkehren (
   <Panel title="Von Ihnen eingegebener Inhalt">
   <div Stil = {{ Rand: '10px 6px' }}> {JSON.stringify(Daten)}</div>
   </Panel>
  );
  },
 },
 ];

 zurückkehren (
 <div>
  <FormRenderer layoutData={layoutData} data={data} setData={setData} />
  <Button-Blockthema="primär" bei Klick={() => Toast.show(JSON.stringify(data))}>
  OK</Button>
 </div>
 );
}

Ein Formular wird durch ein Array definiert. Der Objekttyp ist die zu rendernde Komponente, der Name ist der Schlüssel zum Sammeln von Daten und andere Eigenschaften definieren andere Eigenschaften der Komponente. Je nachdem, welche Bibliothek Sie verwenden, finden Sie Informationen zur Konfiguration in der Komponenten-API-Dokumentation der entsprechenden Bibliothek. Für einige spezielle/nicht vorhandene Komponenten definieren wir die Renderfunktion für dynamisches Rendering, und dann gibt es nichts weiter, all dies ist das React, mit dem Sie vertraut sind. Schließlich können wir unseren eigenen FormRender definieren, der ein eindimensionales Array akzeptiert, um Formularelemente von oben nach unten anzuordnen (das Rendern ist nicht auf Formularelemente beschränkt, Sie können jeden Inhalt rendern), ein Datenelement zum Sammeln von Daten und ein setData zum Aktualisieren von Daten (abgeleitet von React Hooks useState). So einfach ist das, der Quellcode lautet wie folgt

importiere React von „react“;
importiere { Zelle, Radio, DateSelect, Auswahl } aus 'zarm';

// Verwenden Sie für Situationen, in denen eine Konfiguration nicht möglich ist (z. B. benutzerdefinierte Komponenten, Komponenten, die basierend auf Bedingungen angezeigt werden müssen usw.), bitte die Rendermethode.
// getJSON() gibt JSON dynamisch zurück
// render() Benutzerdefiniertes Rendern

Exportieren Sie die Standardfunktion FormRenderer ({ Layoutdaten, Daten, Daten festlegen }) {
 const onFiledChange = (Name, Wert) => {
 sei v = Wert;

 // für Select ctrl
 wenn (Array.isArray(Wert)) {
  v = Wert.Map((Element) => Element.Wert)[0];
 }

 setData({ ...data, [name]: v });
 };

 const onChangeFactory = (Name) => (Wert) => onFiledChange(Name, Wert);

 zurückkehren (
 <div Klassenname="Renderer">
  {layoutData.map((item, idx) => {
  wenn (Typ des Elements.getJSON === 'Funktion') {
   Artikel = Artikel.getJSON();
  }
  wenn (Elementtyp !== 'Objekt' || !Element) null zurückgeben;
  Konstante {
   Name,
   Typ,
   Beschreibung,
   Artikel,
   elProps = {},
   ZelleProps = {},
   machen,
   ...Requisiten
  } = Artikel;

  wenn (Rendertyp === 'Funktion') {
   rendern zurückgeben();
  }

  lass Kinder = [];
  wenn (Array.isArray(items) und Typ === Radio.Group) {
   Kinder = Elemente.map((it, idx1) => (
   <Radiowert={it.value} Schlüssel={idx1}>
    {it.label}
   </Radio>
   ));
  }

  Eigenschaften.Wert = Daten[Name];
  props.onChange = onChangeFactory(name);

  wenn (Typ === Auswählen) {
   props.dataSource = Elemente;
  }
  wenn (Typ === Datumsauswahl || Typ === Auswahl) {
   props.onOk = props.onChange;
   props.onChange löschen;
   props.onChange = elProps.onChange;
  }

  zurückkehren (
   <Zellenschlüssel={idx} Titel={item.label} Beschreibung={Beschreibung} {...cellProps} Name={Name}>
   {React.createElement(Typ, { ...Requisiten, ...elProps }, ...Kinder)}
   </Cell>
  );
  })}
 </div>
 );
}

Konfigurationsanweisungen

importiere * als React von „react“;
Exportschnittstelle Element {
 Typ: React.Component; // Komponententyp, z. B. Eingabe usw. Name: Zeichenfolge; // Schlüssel
 Elemente?: Array<beliebig>; // Datenquelle
 Beschreibung: Zeichenfolge; // Zellenbeschreibung
 label?: string; // Zellentitel
 rendern?: () => React.ReactNode; //Benutzerdefiniertes Rendern
 getJSON?: () => Objekt | null; // Elementkonfiguration dynamisch zurückgeben elProps?: Objekt; // Konfiguration der Komponenteneigenschaften, z. B. wenn der Typ „Eingabe“ ist, wird elProps auf „Eingabe“ konfiguriert
 cellProps?: Objekt; // Konfiguration der Zelleneigenschaften}
Exportschnittstelle Props {
 layoutData: Array<Item>; // Formularlayout-Konfigurationsdaten: Objekt; // Datenspeicher, Name als Schlüssel, Inhalt als Wert
 setData: () => void; // Datenaktualisierung}
Schnittstelle FormRenderer erweitert React.FC<Props> {}
Deklarieren Sie const FormRenderer: FormRenderer;
Standard-FormRenderer exportieren;

Der obige Code hat folgende Wirkung:

Der einzige Nachteil dieser Methode besteht darin, dass sie nicht wie JSON dauerhaft in der Datenbank gespeichert werden kann. Der Vorteil besteht darin, dass sie die Entwicklung der Konfiguration von Formularen für Mobilgeräte und PCs vereinheitlichen, viel Boilerplate-Code und Verschachtelung reduzieren und die Verarbeitung von Datenzugriff und -überprüfung sowie die Anordnung von Formularelementen vereinheitlichen kann.

Dies ist das Ende dieses Artikels über die Entwicklung von H5-Formularseiten basierend auf React-Hooks und der Konfiguration der Zarm-Komponentenbibliothek. Weitere relevante Inhalte zu React-Hooks und der Zarm-Komponentenbibliothek finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Vor- und Nachteile von React Hooks
  • Häufige Anwendungsszenarien für React Hooks (Zusammenfassung)
  • 5 Dinge, die beim Schreiben von React-Komponenten mit Hooks zu beachten sind
  • Einführungstutorial zu React Hooks
  • React verwendet Hooks, um die Zustandsbindung gesteuerter Komponenten zu vereinfachen
  • Lernen Sie Reacts aufregendstes neues Feature dieses Jahres kennen - React Hooks in 30 Minuten
  • Zeichnen Sie eine vollständige React-Hooks-Übung auf
  • Tiefgreifendes Verständnis und Verwendung von React Hooks
  • So funktionieren React Hooks

<<:  Zwei Möglichkeiten zum korrekten Bereinigen von MySQL-Binlog-Protokollen

>>:  Einführung in Docker-Container

Artikel empfehlen

Fähigkeiten zur Erstellung von Webformularen

Tatsächlich haben die drei obigen Tabellen alle d...

Vue3+Skript-Setup+ts+Vite+Volar-Projekt

Inhaltsverzeichnis Erstellen Sie ein Vue + TS-Pro...

Tutorial zu HTML-Tabellen-Tags (34): Zeilenspannen-Attribut ROWSPAN

In einer komplexen Tabellenstruktur erstrecken si...

Die wichtigsten Unterschiede zwischen MySQL 4.1/5.0/5.1/5.5/5.6

Einige Befehlsunterschiede zwischen den Versionen...

Mysql SQL-Anweisungskommentare

Sie können MySQL-SQL-Anweisungen Kommentare hinzu...

Zusammenfassung der grundlegenden Verwendung des $-Symbols in Linux

Linux-Version: CentOS 7 [root@azfdbdfsdf230lqdg1b...

Einführung in Javascript DOM, Knoten und Elementerfassung

Inhaltsverzeichnis DOM Knoten Elementknoten: Text...

Zusammenfassung zum Sharding von MySQL-Datenbanken und -Tabellen

Während der Projektentwicklung werden unsere Date...

Mit CSS3 wird ein Kegelschnitt-Gradienteneffekt erzielt

Grammatik: Hintergrundbild: Kegelschnitt-Farbverl...

Beispiel zum Aktivieren langsamer Abfragen in MySQL

Vorwort Das langsame Abfrageprotokoll ist eine se...

So führen Sie py-Dateien direkt unter Linux aus

1. Erstellen Sie zuerst die Datei (wechseln Sie p...

IE8 Beta 1 hat zwei Bereiche, die Ihre Aufmerksamkeit erfordern

<br />Verwandte Artikel: Web-Kenntnisse: Lös...

IE8 verwendet den Multikompatibilitätsmodus, um Webseiten normal anzuzeigen

IE8 wird mehrere Kompatibilitätsmodi haben. Der IE...

Detaillierte Schritte zur Installation der MySQL 5.6 X64-Version unter Linux

Umfeld: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-gli...