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. AnwendungsszenarienJede h5-Seite, die ein Formular enthält (verwenden Sie die zarm-Bibliothek oder passen Sie Ihre eigene Bibliothek an) Ziel
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 Ideen1. 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ösungDaher 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:
|
<<: Zwei Möglichkeiten zum korrekten Bereinigen von MySQL-Binlog-Protokollen
>>: Einführung in Docker-Container
Tatsächlich haben die drei obigen Tabellen alle d...
Inhaltsverzeichnis Erstellen Sie ein Vue + TS-Pro...
Das Prinzip besteht darin, die Methode window.pri...
In einer komplexen Tabellenstruktur erstrecken si...
Einige Befehlsunterschiede zwischen den Versionen...
Sie können MySQL-SQL-Anweisungen Kommentare hinzu...
Linux-Version: CentOS 7 [root@azfdbdfsdf230lqdg1b...
Inhaltsverzeichnis DOM Knoten Elementknoten: Text...
Während der Projektentwicklung werden unsere Date...
Grammatik: Hintergrundbild: Kegelschnitt-Farbverl...
Vorwort Das langsame Abfrageprotokoll ist eine se...
1. Erstellen Sie zuerst die Datei (wechseln Sie p...
<br />Verwandte Artikel: Web-Kenntnisse: Lös...
IE8 wird mehrere Kompatibilitätsmodi haben. Der IE...
Umfeld: 1. CentOS6.5 X64 2.mysql-5.6.34-linux-gli...