Wenn wir Backend-Managementsysteme erstellen, stoßen wir oft auf sehr komplexe Formen:
- Es sind zu viele Formularelemente vorhanden
- Zeigen Sie verschiedene Formularelemente unter verschiedenen Formulartypen an
- Bestimmte Formularelemente deaktivieren die Validierung unter bestimmten Bedingungen
- Jedes Formularelement verfügt außerdem über andere benutzerdefinierte Logik, z. B. Eingabefelder, in die Vorlagenvariablen eingefügt, die Anzahl der eingegebenen Zeichen angezeigt, Bilder hochgeladen und angezeigt werden können, sowie Rich Text . . .
- Schließen Sie in dieser komplizierten Situation die Überprüfung und Übermittlung des Formulars ab
- Sie können sich konkrete Beispiele ansehen: Viele triviale Funktionen werden im Beispiel weggelassen und nur das gesamte komplexe Formulargerüst wird beibehalten, um die Lösung zu demonstrieren.
vue
-DateiDie gesamte Anzeige und das Ausblenden von Formularelementen, die Validierung, Datenerfassung, Übermittlung, Anpassung und andere Logik werden zusammengefasst
- Verwenden Sie je nach Formulartyp
v-if/v-show
um das Anzeigen und Ausblenden von Formularelementen zu verwalten.- Bestimmen Sie in der benutzerdefinierten
elementui
Validierung, ob das Formularelement basierend auf dem Formulartyp validiert wird- Je nach Formulartyp erhalten Sie unterschiedliche Daten und übermitteln diese an unterschiedliche Schnittstellen
- Alle anderen benutzerdefinierten Logiken
vue
-Datei kann problemlos 2000
Zeilen enthaltenTatsächlich ist es leicht vorstellbar , mehrere Unterformulare entsprechender Typen nach verschiedenen Formulartypen zu trennen . In der Praxis bin ich jedoch immer noch auf viele Probleme gestoßen: Überprüfung des Eltern-Kind-Formulars, Erhalt aller übermittelten Daten usw., und ich habe eine Reihe von Lösungen zusammengefasst:
Alle untergeordneten Komponenten müssen zwei Methoden validate
und getData
enthalten, damit die übergeordnete Komponente sie aufrufen kann.
validate
Wird verwendet, um die Formularelemente seiner eigenen Komponenten zu überprüfen und ein promise
zurückzugeben
vaildate ( ) {
// 返回`elementUI`表单验证的结果(为`promise`对象)
return this . $refs [ "ruleForm" ] . validate ( ) ;
} ,
getData
-MethodeStellen Sie Daten von untergeordneten Komponenten bereit
getData ( ) {
// 返回子组件的form
return this . ruleForm ;
} ,
Verwenden Sie das Strategiemuster, um ref
des Unterformulars (die zum Abrufen des Unterformulars verwendete Methode) und die Absendefunktion zu speichern und abzurufen. Viele if-else
-Urteile werden weggelassen.
data: {
// type和ref名称的映射
typeRefMap : {
1 : "message" ,
2 : "mail" ,
3 : "apppush"
} ,
// type和提交函数的映射。不同类型,接口可能不同
typeSubmitMap : {
1 : data => alert ( `短信模板创建成功${ JSON . stringify ( data ) } ` ) ,
2 : data => alert ( `邮件模板创建成功${ JSON . stringify ( data ) } ` ) ,
3 : data => alert ( `push模板创建成功${ JSON . stringify ( data ) } ` )
} ,
}
submit
Wird zur Formularvalidierung von Eltern-Kind-Komponenten, zum Abrufen von Gesamtdaten und zum Aufrufen der Übermittlungsfunktion des aktuellen Typs zum Übermitteln von Daten verwendet
Da die
validate
derelementUI
-Formularüberprüfung einpromise
Ergebnis zurückgeben kann , können Sie die Eigenschaften vonpromise
verwenden, um die Überprüfung von übergeordneten und untergeordneten Formularen durchzuführen. Beispielsweise kann die Funktionthen
ein anderespromise
-Objekt zurückgeben, undcatch
kannreject
undPromise.all
allerthen
liegenden Objekte erhalten.
// 父表单验证通过才会验证子表单,存在先后顺序
submitForm ( ) {
const templateType = this . typeRefMap [ this . indexForm . type ] ;
this . $refs [ "indexForm" ]
. validate ( )
. then ( res => {
// 父表单验证成功后,验证子表单
return this . $refs [ templateType ] . vaildate ( ) ;
} )
. then ( res => {
// 全部验证通过
// 获取整体数据
const reqData = {
// 获取子组件数据
... this . $refs [ templateType ] . getData ( ) ,
... this . indexForm
} ;
// 获取当前表单类型的提交函数,并提交
this . typeSubmitMap [ this . indexForm . type ] ( reqData ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;
} ,
submitForm1 ( ) {
const templateType = this . typeRefMap [ this . indexForm . type ] ;
const validate1 = this . $refs [ "indexForm" ] . validate ( ) ;
const validate2 = this . $refs [ templateType ] . vaildate ( ) ;
// 父子表单一起验证
Promise . all ( [ validate1 , validate2 ] )
. then ( res => {
// 都通过时,发送请求
const reqData = {
... this . $refs [ templateType ] . getData ( ) ,
... this . indexForm
} ;
this . typeSubmitMap [ this . indexForm . type ] ( reqData ) ;
} )
. catch ( err => {
console . log ( err ) ;
} ) ;
} ,
Zusammenfassung: Ich bin in vielen Projekten auf diese Art komplexer Formen gestoßen und habe viele Lösungen verwendet. Hier habe ich eine relativ übersichtliche und einfache Lösung zusammengefasst. Natürlich gibt es viele andere Lösungen. Beispielsweise kann die Datenübermittlungsmethode in jeder Unterkomponente platziert werden und die Daten des öffentlichen Formularelements werden über
props
zur Übermittlung an die Unterkomponente übergeben . Wenn es andere einfachere Lösungen gibt, können Sie gerne einen Kommentar abgeben oderissue
aufgithub
Off-Topic: Nachdem ich den eigenen Bericht des Front-End-Architekten gelesen hatte: Ns Frage und Antwort zum Wachstumspfad eines Front-End-Ingenieurs, hat mich das sehr inspiriert. Wenn Sie über Ihre technische Richtung und Ihre Aussichten verwirrt sind oder wenn Sie sich darüber beschweren, dass Ihr Projekt zu niedrig ist, oder wenn Sie sich darüber beschweren, dass Sie jeden Tag sich wiederholende Arbeiten ausführen, oder wenn Sie von der endlosen Entstehung neuer Technologien jeden Tag überwältigt sind , Dann sollten Sie sich Ihr Projekt doch einmal genauer ansehen .
Ausgehend von den Schmerzpunkten von Arbeitsprozessen und Projekten kommen Sie beim Üben, Zusammenfassen und Lösen praktischer Probleme schneller voran .
Meine Gefühle beim Schreiben dieses Artikels: die Schwierigkeit, diese Dinge auszudrücken
>>
die technische Schwierigkeit, die im Artikel selbst enthalten ist