React antd realisiert dynamische Vergrößerung und Verkleinerung der Form

React antd realisiert dynamische Vergrößerung und Verkleinerung der Form

Beim Schreiben dynamischer Formulare bin ich zuvor auf eine Falle gestoßen. Die Verwendung des Indexindex als Schlüssel führt zu Fehlern, und diese sind sehr schwerwiegend!

Ich habe heute Zeit, einen Artikel aufzuschreiben, um aufzuzeichnen: Wie man mit und Logik umgeht

Ich verwende die Version antd3, die Formulare für 3 und 4 sind etwas unterschiedlich, aber der Unterschied sollte nicht so groß sein.

brauchen:

1. Wählen Sie den zu wechselnden Typ aus und zeigen Sie die feste Vorlage an

2. Durch das Hinzufügen neuer Felder können Sie jede Zeile im Formular dynamisch vergrößern oder verkleinern

3. Kontrollieren Sie, ob die Felder in jeder Zeile ausgefüllt werden müssen

4. Parameter beim Bearbeiten nachfüllen

Effektbild:

Einige Schlüsselcodes:

importiere React, {Komponente} von „react“;
Stile aus „./index.less“ importieren;
importieren {
  Tisch,
  Taste,
  Wählen,
  Popbestätigung,
  Modal,
  Bilden,
  Eingang,
  Radio,
  Reihe,
  Spalte, Tooltip,
  Symbol,
  Nachricht,
  Paginierung, Eingabenummer,
} von „antd“;

const Option = Auswählen.Option;
const FormItem = Form.Item;

sei id = 0;

@Form.erstellen()
Klasse Index erweitert Komponente {
  MarktID = 0;
  Zustand = {
    Typ auswählen: '',
    orderType: 1, //Artikel 1 Karte 2
    Typ wird geladen: false,
    istEdit: false,
    lookVisible: falsch,
    sichtbar: falsch,
    Seitengröße: 10,
    Seitennummer: 1,
    Schlüsselwort: '',
    Reihe: {},
    Typliste: {},
    verspotten: {},
    Kartentyp: [{
      'Feldname': 'Name',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Name',
    }, {
      'Feldname': 'Bezeichnung',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Beschriftungen',
    }, {
      'Feldname': 'lon',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Längengrad',
    }, {
      'Feldname': 'lat',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Breitengrad',
    }],
    Artikeltyp: [{
      'Feldname': 'Name',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Name',
    }, {
      'Feldname': 'Bezeichnung',
      'isImg': 0,
      'Bestellung': 0,
      'Bemerkungen': 'Beschriftungen',
    }],
  };
/**
   * Generieren Sie das erforderliche Datenformat für den dynamischen Tabellenwert * @param-Werte
   * @returns {[]}
   */
  createValues ​​​​= (Werte) => {
    const { Zeile } = dieser.Zustand;
    const Daten = [];
    const newValues ​​​​= { // Verwenden Sie ein neues Objekt, um die übermittelten Daten zu übertragen ... Werte,
    };
    const fieldNameData = []; // fieldName-Wert speichern const remarksData = []; // Bemerkungswert speichern const isImgData = []; // isImg-Wert speichern const orderData = []; // orderData-Wert speichern const fieldName = RegExp(/fieldName/);
    const Bemerkungen = RegExp(/Bemerkungen/);
    const isImg = RegExp(/isImg/);
    für (const key in newValues) {
      if (Feldname.test(Schlüssel)) {
        fieldNameData.push(neueWerte[Schlüssel]);
      }
    }
    für (const key in newValues) {
      wenn (Bemerkungen.Test(Schlüssel)) {
        commentsData.push(neueWerte[Schlüssel]);
      }
    }
    für (const key in newValues) {
      wenn (isImg.test(Schlüssel)) {
        isImgData.push(neueWerte[Schlüssel]);
      }
    }
    für (const key in newValues) {
      wenn (isImg.test(Schlüssel)) {
        orderData.push(neueWerte[Schlüssel]);
      }
    }
    FeldNameData.fürJeden((Element, Index) => {
      Daten.push({
        Feldname: Artikel,
        Bemerkungen: Bemerkungsdaten[index],
        isImg: isImgData[index],
        Bestellung: Bestelldaten[Index],
        ID: Zeile.Datentyp ? Zeile.Datentyp.ID: '',
      });
    });
    Daten zurückgeben;
  };

  handleOk = e => {
    this.props.form.validateFields((err, values) => {
      wenn (!err) {
        const { Zeile, istBearbeiten } = dieser.Zustand;
        Konstante Parameter = {
          Datentyp: {
            Name: Werte.Name,
            Typ: Werte.Typ,
            ID: Zeile.Datentyp ? Zeile.Datentyp.ID: '',
          },
          Typfelder: [],
        };
        params.typeFields = this.createValues(Werte);
        if (istBearbeiten) {
          editType(params).then(res => {
            wenn (res.code === 0) {
              message.info('Änderung erfolgreich');
              dies.setState({
                sichtbar: falsch,
                istEdit: false,
              });
              dies.fetchTypeList();
              this.props.form.resetFields();
            }
          });
        } anders {
          addType(params).then(res => {
            wenn (res.code === 0) {
              message.info('Erfolgreich hinzugefügt');
              dies.setState({
                sichtbar: falsch,
                istEdit: false,
              });
              dies.fetchTypeList();
              diese.props.form.resetFields();
            }
          });
        }
      }
    });
  };

  lookOrEditTypeModal = (Flagge, Datensatz) => {
    const { Artikeltyp, Kartentyp } = dieser.Status;
    if (flag === 'add') { //Standardartikelvorlage hinzufügen this.marketId = articleType.length + 1; //Länge des dynamischen Schlüsseltags festlegen this.setState({
        sichtbar: wahr,
        Zeile: { Typfelder: Artikeltyp },
      });
    } sonst wenn (Flag === 'bearbeiten') {
      dies.setState({
        sichtbar: wahr,
      });
      getType({ dataTypeId: Datensatz.id }).then(res => {
        wenn (res.code === 0) {
          this.marketId = res.data.typeFields.length + 1; //Länge des dynamischen Schlüssel-Tags festlegen this.setState({
            Zeile: res.data,
            isEdit: flag === 'bearbeiten',
          });
        }
      });
    } anders {
      dies.setState({
        lookVisible: wahr,
      });
      getType({ dataTypeId: Datensatz.id }).then(res => {
        wenn (res.code === 0) {
          dies.setState({
            Zeile: res.data,
          });
        }
      });
    }
  };


  onChangeType = (Wert) => {
    const { form } = diese.props;
    const { Bestelltyp, Zeile, Artikeltyp, Kartentyp } = dieser.Status;
    diese.props.form.resetFields();

    const-Parameter = {};
    if (value === 1) { //Artikeltyp params['typeFields'] = articleType;
      this.marketId = Artikeltyp.Länge + 1;
    } anders {
      Parameter['Typfelder'] = Kartentyp;
      diese.MarktId = Kartentyp.Länge + 1;
    }
    dies.setState({
      Zeile: Parameter,
      Bestelltyp: Wert,
    });
  };
//Methode löschen! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
  entferneDatei = k => {
    const { form } = diese.props;
    const keys = form.getFieldValue('keys');
    wenn (Schlüssel.Länge === 1) {
      zurückkehren;
    }
    form.setFieldsValue({
      Schlüssel: Schlüssel.Filter(Schlüssel => Schlüssel !== k),
    });
  };
//Methode hinzufügen! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
  Datei hinzufügen = () => {
    const { form } = diese.props;
    const keys = form.getFieldValue('keys');
    const nextKeys = keys.concat(this.marketId++);
    form.setFieldsValue({
      Schlüssel: nextKeys,
    });
  };

  judgeIsTemplet = (Daten) => {
    wenn (!data) {
      gibt false zurück;
    }
    wenn ((data.fieldName === 'lat') || (data.fieldName === 'lon') || (data.fieldName === 'label') || (data.fieldName === 'name')) {
      gibt true zurück;
    }
  };
  handleValidator = (Regel, Wert, Rückruf) => {
    wenn (!val) {
      Rückruf();
    }
    Lassen Sie validateResult = /^[5A-Za-z0-9-\_]+$/.test(val);
    wenn (!validateResult) {
      callback('Bitte geben Sie das richtige Tabellenfeld ein');
    }
    Rückruf();
  };

  Spalten = [
    {
      Titel: 'Typname',
      Datenindex: "Name",
      Schlüssel: 'Name',
      Breite: 500,
    },
    {
      Titel: 'Typ',
      Datenindex: "Typ",
      Schlüssel: 'Typ',
      rendern: (Text) => {
        Rückgabetext === 1? „Artikel“: „Karte“;
      },
    },
    {
      Titel: 'Operation',
      dataIndex: 'Adresse',
      Schlüssel: 'Adresse',
      rendern: (Text, Datensatz) => {
        Rückgabewert <div>
          <Button type='link' onClick={() => this.lookOrEditTypeModal('look', record)}>Anzeigen</Button>
          <Button type='link' onClick={() => this.lookOrEditTypeModal('edit', record)}>Bearbeiten</Button>
          <Popconfirm title="Löschen bestätigen?" onConfirm={() => this.deleteTypeClick(record)}>
            <Button type='link'>Löschen</Button>
          </Popconfirm>
        </div>;
      },
    },
  ];

  rendern() {
    const { selectType, Typ wird geladen, Mock, Zeile, ist Bearbeiten, Typliste, Schlüsselwort, sichtbar aussehen } = dieser.Zustand;
    const { getFieldDecorator, getFieldValue } = this.props.form;
    let Typfelder = Zeile.Typfelder || [];
    const initData = [];
    typeFields.forEach((item, index) => {//Legen Sie das Standardschlüssel-Array entsprechend den realen Daten fest initData.push(index);
    });
    getFieldDecorator('keys', { initialValue: initData }); //Fügen Sie dem Formular das Schlüsselfeld hinzu und legen Sie den Standardwert fest. Dadurch wird beim Bearbeiten der Effekt des Bearbeitens und des Nachfüllens erzeugt.
    const keys = getFieldValue('keys');
    const formItems = keys.map((k) => (
      <Zeilenrand={12} Schlüssel={k} Klassenname={styles.form_row}>
        <FormItem label="Feld" key={`fieldName_${k}`}>
          {getFieldDecorator(`fieldName_${k}`, {
            Anfangswert: row.typeFields[k] ? row.typeFields[k].Feldname : '',
            validateTrigger: ['onChange', 'onBlur'], //Überprüfen Sie das Timing der untergeordneten Knotenwerte rules: [{
              erforderlich: wahr,
              Meldung: 'Bitte geben Sie das englische Feld ein!',
            }, {
              Validator: this.handleValidator,
            }],
          })(<Input placeholder="Bitte geben Sie das englische Feld ein" max={30} disabled={this.judgeIsTemplet(row.typeFields[k])}/>)}
        </FormItem>
        <FormItem label="Name" key={`remarks_${k}`}>
          {getFieldDecorator(`remarks_${k}`, {
            Anfangswert: row.typeFields[k] ? row.typeFields[k].remarks : '',
            validateTrigger: ['beiÄnderung', 'beiUnschärfe'],
            Regeln: [{
              erforderlich: wahr,
              Meldung: 'Bitte geben Sie einen chinesischen Namen ein!',
            }],
          })(<Input placeholder="Bitte geben Sie den chinesischen Namen ein" disabled={this.judgeIsTemplet(row.typeFields[k])}/>)}
        </FormItem>
        <FormItem label="Sortieren" key={`order_${k}`}>
          {getFieldDecorator(`order_${k}`, {
            Anfangswert: row.typeFields[k] ? row.typeFields[k].order : 0,
          })(<InputNumber style={{width:75}} placeholder="Sortieren" />)}
        </FormItem>
        <FormItem label="Bild" key={k}>
          {getFieldDecorator(`isImg_${k}`, {
            Anfangswert: row.typeFields[k] ? row.typeFields[k].isImg : 0,
            Regeln: [{
              erforderlich: wahr,
            }],
          })(<Radio.Group deaktiviert={this.judgeIsTemplet(row.typeFields[k])}>
            <Radiowert={0}>Nein</Radio>
            <Radiowert={1}>Ja</Radio>
          </Radio.Gruppe>)}
        </FormItem>
        {!this.judgeIsTemplet(row.typeFields[k]) ? (
          <Icon type="minus-circle" onClick={() => this.removeFile(k)} title='Löschen'/>
        ) : null}
      </Zeile>
    ));


    zurückkehren (
      <div Klassenname={styles.wrap_type}>
        <Modal
          Titel="Typverwaltung"
          sichtbar = {dieser.Zustand.sichtbar}
          beiOk={this.handleOk}
          beiAbbrechen = {this.handleCancel}
          Breite={890}
          // Klassenname = {styles.modal_type}
          maskClosable={false}
        >
          <Formularlayout='inline'>
            <Zeilenstil={{ textAlign: 'center', marginBottom: 14 }}>
              <FormItem label="Typ auswählen">
                {getFieldDecorator('Typ', {
                  Anfangswert: row.dataType ? row.dataType.type : 1,
                  Regeln: [{
                    erforderlich: wahr,
                  }],
                })(<Wählen Sie onChange={this.onChangeType} deaktiviert={isEdit} Stil={{ Breite: 200 }}>
                  <Optionswert={1}>Artikeltyp</Option>
                  <Optionswert={2}>Kartentyp</Option>
                  <Option value={3} disabled={true}>Dateityp</Option>
                </Auswählen>)}
              </FormItem>
              <FormItem label="Typname">
                {getFieldDecorator('name', {
                  Anfangswert: row.dataType ? row.dataType.name : '',
                  Regeln: [{
                    erforderlich: wahr,
                    Meldung: 'Bitte geben Sie den Typnamen ein!',
                  }],
                })(<Input placeholder="Bitte geben Sie den Typnamen ein" style={{ width: 200 }}/>)}
              </FormItem>
            </Zeile>
            {formItems}
            <div Stil = {{ Rand: 'auto', Textausrichtung: 'Center' }}>
              <Button icon="plus" onClick={this.addFile} style={{ marginTop: 10 }}>Neues Feld hinzufügen</Button>
            </div>
          </Form>
        </Modal>
      </div>
    );
  }
}

Standardindex exportieren;

Der entscheidende Punkt besteht darin, eine Markt-ID als dynamisch hinzugefügten Schlüssel festzulegen und dann ihren Wert als dynamischen Schlüssel zu verwenden. (Verwenden Sie niemals den Array-Index als Schlüssel)!

Dies ist das Ende dieses Artikels zum dynamischen Erhöhen oder Verringern von Formularen mit React Antd. Weitere Informationen zum dynamischen Erhöhen oder Verringern von Formularen mit React Antd finden Sie in den vorherigen Artikeln von 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:
  • So verwenden Sie die Form-Komponente von Antd in React, um Formularfunktionen zu implementieren
  • React verwendet die Antd-Formularzuweisung, um den Betrieb des Popup-Fensters zu ändern

<<:  So rufen Sie das unterbrochene System in Linux auf

>>:  Vollständiger Prozessdatensatz zur Fehlerbehebung bei MySQL DeadLock

Artikel empfehlen

WeChat-Applet implementiert Anmeldeschnittstelle

Die Anmeldeoberfläche des WeChat-Applets ist zu I...

Top 10 der nützlichsten und wichtigsten Open-Source-Tools im Jahr 2019

In der Open-Source-Umfrage von Black Duck aus dem...

Der Unterschied zwischen Docker Run und Start

Der Unterschied zwischen Ausführen und Starten in...

Detaillierte Erklärung der Docker-Einstiegspunktdatei

Schließen Sie beim Schreiben einer Docker-Datei e...

Ubuntu startet den Remote-Anmeldevorgang des SSH-Dienstes

SSH-Secure-Shell, ermöglicht sichere Remote-Anmel...

CentOS8 - bash: verstümmelte Zeichen und Lösungen

Diese Situation tritt normalerweise auf, weil das...

Detaillierte Erläuterung des Datenproxys und der Ereignisse von VUE

Inhaltsverzeichnis Überprüfung der Object.defineP...

Was ist eine HTML-Datei? So öffnen Sie eine HTML-Datei

HTML steht für Hypertext Markup Language. Heutzut...

Beispielcode für HTML-Layout links und rechts

CSS: Code kopieren Der Code lautet wie folgt: html...

Analyse von MySQL-Beispielen für doppelte und redundante Indizes

In diesem Artikel werden MySQL-Duplikatsindizes u...

Lösung für das zu langsame Herunterladen des Docker-Images

Der Download des Docker-Images hängt oder ist zu ...