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

CSS imitiert den sanften Umschalttasteneffekt von Apple

Inhaltsverzeichnis 1. Code-Analyse 2. Quellcode Q...

WeChat Mini-Programm implementiert den Likes-Dienst

In diesem Artikel wird der spezifische Code für d...

Beheben Sie den Fehler beim Löschen von MySQL-Benutzern

Als der Autor MySQL zum Hinzufügen eines Benutzer...

Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren

Inhaltsverzeichnis 1. Plugins 2. Zwischenspiel 3....

CSS3 realisiert den Animationseffekt der Lotusblüte

Schauen wir uns zunächst die Wirkung an: Dieser E...

JS implementiert die Drag- und Platzhalterfunktionen von Elementen

In diesem Blogbeitrag geht es um eine Schwierigke...

Ein kurzes Verständnis der drei Prinzipien zum Hinzufügen von MySQL-Indizes

1. Die Bedeutung von Indizes Indizes werden verwe...

Sperrt Mysql ALTER TABLE die Tabelle beim Hinzufügen von Feldern?

Inhaltsverzeichnis Vor MySQL 5.6 Nach MySQL 5.6 Z...

MySql legt die angegebenen Benutzerdatenbankansichtsabfrageberechtigungen fest

1. Neuen Benutzer anlegen: 1. Führen Sie eine SQL...

Tutorial zur Installation von MYSQL8.X auf Centos

MySQL-Installation (4, 5, 6 können weggelassen we...

Vollständige Schritte zum Erstellen eines Passwortgenerators mit Node.js

Inhaltsverzeichnis 1. Vorbereitung 2. Befehlszeil...