Über das Wertübertragungsproblem zwischen Antd-Baum und übergeordneten und untergeordneten Komponenten (Reaktionszusammenfassung)

Über das Wertübertragungsproblem zwischen Antd-Baum und übergeordneten und untergeordneten Komponenten (Reaktionszusammenfassung)

Projektanforderungen: Wenn Sie auf einen Produktbaumknoten klicken, werden alle übergeordneten Knoten des Knotens abgerufen und die Suchbedingungen in der Tabelle eingegeben, um die Suchfunktion abzuschließen. Die Suchergebnisse werden in der folgenden Tabelle angezeigt.

Es wurden drei Komponenten geschrieben:

Jetzt gibt es eine Interaktion im Geschäftsszenario: Klicken Sie auf den Baumknoten in der Komponente orderTree, rufen Sie die ID des aktuellen Knotens und aller übergeordneten Knoten ab, fügen Sie sie in ein Objekt arrKeys ein und verwenden Sie es in der Komponente orderForm (füllen Sie das Dropdown-Auswahlfeld für den Typ nach und verwenden Sie das Objekt objId als Eingabeparameter der Abfrageschnittstelle).

Nun können wir das Problem in Teilen lösen:

1. Holen Sie sich zuerst die IDs des angeklickten Baumknotens und aller übergeordneten Knoten ---arrKeys

2. Nachdem Sie auf den Baumknoten geklickt haben, um den aktuellen Knoten und alle übergeordneten Knoten abzurufen, übergeben Sie arrKeys über this.props.idObject(arrKeys) an die übergeordnete Komponente.

3. Übergeben Sie die gesamte Komponente an die übergeordnete Komponente im componentDidMount-Lebenszyklus in der Baumkomponente und der Formularkomponente

4. Die Abfragemethode in der Formularkomponente:

Der tree.js-Code ist jetzt angehängt

importiere React, {Komponente} von „react“;
importiere { connect } von „dva“;
importiere { Teiler, Modal, Tabelle, Nachricht, Tag, Spin} von 'antd';
Router von „umi/router“ importieren;
Stil aus „../style.less“ importieren;
importiere { Baum, Eingabe } von 'antd';

const { bestätigen } = Modal;
const { TreeNode } = Baum;
const { Suche } = Eingabe;
Lassen Sie Datenliste = [];
let keysObj = {}; // Die ID des aktuellen Knotens und aller übergeordneten Knoten
let firstParentKey = {}; // ID des Stammknotens der ersten Ebene
const intetorFun = (Daten, Schlüssel, Zeichenfolge) => {
  wenn (Zeichenfolge) {
    ersterÜbergeordneterSchlüssel = {
      [Datenparam]: DatenparamId,
    };
  }
  wenn (Daten.Kinder && Daten.Kinder.Länge !== 0) {
    data.children.forEach(item => {
      wenn (item.id === key[0]) {
        SchlüsselObj = {
          [Datenparam]: DatenparamId,
          [Artikel.param]: Artikel.paramId,
          ...ersterElternschlüssel,
        };
      } anders {
        intetorFun(Element, Schlüssel);
      }
    });
  }
  Schlüsselobjekt zurückgeben;
};
const getParentKey = (Schlüssel, Baum) => {
  lass parentKey = [];
  für (lass i = 0; i < Baumlänge; i++) {
    const Knoten = Baum[i];
    parentKey = intetorFun(Knoten, Schlüssel, „firstTime“);
  }
  gibt den übergeordneten Schlüssel zurück;
};
//Suche const getSearchKey = (Schlüssel, Baum) => {
  lass übergeordneten Schlüssel;
  für (lass i = 0; i < Baumlänge; i++) {
    const Knoten = Baum[i];
    wenn (Knoten.Kinder) {
      wenn (node.children.some(item => item.id === key)) {
        übergeordneter Schlüssel = Knoten-ID;
      } sonst wenn (getSearchKey(Schlüssel, node.children)) {
        parentKey = getSearchKey(Schlüssel, Knoten.Kinder);
      }
    } anders {
      wenn (node.id === Schlüssel) {
        übergeordneter Schlüssel = Knoten-ID;
      }
    }
  }
  gibt den übergeordneten Schlüssel zurück;
};

@connect(({ Ware, wird geladen, Menü }) => ({
  Ware,
  wird geladen: wird geladen.effects['commodity/getTree'],
  Speisekarte,
}))
Klasse OrderTree erweitert Komponente {
  Konstruktor(Requisiten) {
    super(Requisiten);
    dieser.Zustand = {
      expandedKeys: [], //Standarderweiterung des Stammknotens der ersten Ebene props.commodity.defaultParentIdList
      Suchwert: '',
      autoExpandParent: true,
    };
  }
  componentDidMount() {
    const { dispatch } = diese.props;
    this.props.treeRef && this.props.treeRef(this); //Übergeben Sie die gesamte Baumkomponente an die übergeordnete Komponente, wenn Sie dispatch({ mounten.
      Typ: 'Ware/getTree',
      Rückruf: res => {
        dies.generateList(res.data);
        const defaultParentIdList = res.data.map(item => item.id);
        dies.setState({
          erweiterteSchlüssel: defaultParentIdList,
        });
      },
    });
  }
  Liste generieren = Daten => {
    const { dispatch } = diese.props;
    für (lass i = 0; i < Datenlänge; i++) {
      const Knoten = Daten[i];
      const { id, name } = Knoten;
      });
      versenden({
        Typ: 'Ware/Sparen',
        Nutzlast: {
          Datenliste,
        },
      });
      wenn (Knoten.Kinder) {
        dies.generateList(node.children);
      }
    }
  };

  //Wird beim Erweitern/Reduzieren von Knoten ausgelöst onExpand = expandedKeys => {
    dies.setState({
      erweiterteSchlüssel,
      autoExpandParent: true,
    });
  };
  //Wird beim Klicken auf einen Baumknoten ausgelöst onSelect = (selectKeys, e) => {
    const { dispatch } = diese.props;
    Konstante {
      Ware: { treeData },
    } = diese.Eigenschaften;
    lass arrKeys = {};
    //Der Code wird nur ausgeführt, wenn der Knoten ausgewählt ist. dataRef ist ein benutzerdefiniertes Attribut, das zu TreeNode hinzugefügt wird und alle Informationen des aktuellen Knotens abrufen kann, wenn (e.selected && e.node.props.dataRef.param !== 'categoryId') {
      SchlüsselObj = {};
      ersterÜbergeordneterSchlüssel = {};
      arrKeys = getParentKey(selectKeys, treeData);
    } sonst wenn (e.selected && e.node.props.dataRef.param === 'categoryId') {
      SchlüsselObj = {};
      ersterÜbergeordneterSchlüssel = {};
      arrKeys = {
        Kategorie-ID: e.node.props.dataRef.paramId,
      };
    } sonst wenn (!e.selected) {
      gibt false zurück;
    }
    dies.props.idObject(arrKeys);
  };
  // Suchfunktion onChange = e => {
    const { Wert } = e.Ziel;
    Konstante {
      Ware: { Baumdaten, Datenliste, Standard-ÜbergeordneteID-Liste },
    } = diese.Eigenschaften;
    let erweiterteSchlüssel = [];
    wenn (Wert) {
      erweiterteSchlüssel = Datenliste
        .map(Element => {
          wenn (Element.Name.toLowerCase().Index von (Wert.toLowerCase()) > -1) {
            //Groß-/Kleinschreibung nicht beachten return getSearchKey(item.id, treeData);
          }
          gibt null zurück;
        })
        .filter((Element, i, selbst) => Element und selbst.indexOf(Element) === i);
      dies.setState({
        erweiterteSchlüssel,
        Suchwert: Wert,
        autoExpandParent: true,
      });
    } anders {
      dies.setState({
        erweiterteSchlüssel: defaultParentIdList,
        Suchwert: '',
        autoExpandParent: true,
      });
    }
  };

  rendern() {
    const { Suchwert, erweiterteSchlüssel, autoExpandParent } = dieser.Status;
    Konstante {
      Ware: { treeData },
      Laden,
    } = diese.Eigenschaften;
    const-Schleife = Daten =>
      Daten.map(Element => {
        const index = item.name.toLowerCase().indexOf(searchValue.toLowerCase()); //Groß-/Kleinschreibung ignorieren const beforeStr = item.name.substr(0, index);
        const afterStr = item.name.substr(index + suchwert.länge);
        const centerStr = item.name.substr(index, suchwert.länge);
        Konstanttitel =
          index > -1 ? (
            <span Titel={Artikelname}>
              {vorStr}
              <span style={{ color: '#f50' }}>{centerStr}</span>
              {afterStr}
            </span>
          ) : (
            <span Titel={Artikelname}>{Artikelname}</span>
          );
        wenn (Element.Kinder) {
          zurückkehren (
            <TreeNode Schlüssel={item.id} Titel={Titel} dataRef={item}>
              {Schleife(Element.Kinder)}
            </TreeNode>
          );
        }
        Rückgabewert <TreeNode key={item.id} title={title} dataRef={item} />;
      });
    zurückkehren (
      <Spin spinning={wird geladen}>
        <div>
          <Suchstil={{ marginBottom: 8 }} Platzhalter="Suchen" onChange={this.onChange} />
          <Baum
            beiExpand={dies.beiExpand}
            bei Auswahl = {diese.beiAuswahl}
            erweiterteSchlüssel={erweiterteSchlüssel}
            autoExpandParent={autoExpandParent}
          >
            {Schleife(Baumdaten)}
          </Baum>
        </div>
      </Drehen>
    );
  }
}

Standard-OrderTree exportieren;

Index.js-Code der übergeordneten Komponente:

importiere React, {Komponente} von „react“;
importiere { connect } von „dva“;
importiere { formatMessage, FormatierteMessage } von 'umi/locale';
importiere { Karte, Spin } von 'antd';
importiere PageHeaderWrapper aus „@/components/PageHeaderWrapper“;
importiere OrderForm aus „./components/form“;
importiere OrderTable aus „./components/table“;
importiere OrderTree aus „./components/tree“;
Stil aus „./style.less“ importieren;
importiere { consoleTestResultHandler } aus 'tslint/lib/test';

// lass dataList = [];

@connect(({ Ware, wird geladen, Menü }) => ({
  Ware,
  wird geladen: wird geladen.effects['commodity/getTree'],
  Speisekarte,
}))
Klasse OrderPage erweitert Komponente {
  Konstruktor() {
    super();
    dieser.Zustand = {
      idObjekt: {},
      reactFlag: falsch,
    };
  }
  componentDidMount() {
    const { dispatch } = diese.props;
    versenden({
      Typ: 'Ware/GetGoodsCategory',
    });
  }
  beiRef = ref => {
    diese.Bestellform = ref;
  };
  BaumRef = ref => {
    dies.orderTree = ref;
  };
  getIdObject = Daten => {
    dies.setState(
      {
        idObject: Daten,
      },
      () => {
        diese.orderForm.props.form.setFieldsValue({
          Kategorie-IDs: [String(data.categoryId)],
        });
        this.orderForm.inquery(Daten);
      }
    );
  };
  //Beurteilen, ob die Reset-Taste gedrückt wurde isReact = ref => {
    Konstante {
      Ware: { defaultParentIdList },
    } = diese.Eigenschaften;
    wenn (ref) {
      dies.orderTree.setState({
        erweiterteSchlüssel: defaultParentIdList,
      });
    }
  };

  rendern() {
    zurückkehren (
      <PageHeaderWrapper-Logo>
        <Card bordered={false} title="Produkt-SPU-Liste" className={style.antCardBox}>
          <div
            Stil = {{ Breite: '350px', rechter Rand: '30px', Boxschatten: '3px -3px 6px 0px #ccc6' }}
            Klassenname={style.antTreeBox}
          >
            <OrderTree idObject={this.getIdObject} treeRef={this.treeRef} />
          </div>
          <div Stil={{ flex: '1' }}>
            <OrderForm onRef={this.onRef} isReact={this.isReact} />
            <Bestelltabelle />
          </div>
        </Karte>
      </PageHeaderWrapper>
    );
  }
}

Standard-Bestellseite exportieren;

Oben finden Sie Einzelheiten zum Wertübertragungsproblem zwischen Antd-Baum und übergeordneten und untergeordneten Komponenten (React-Zusammenfassung). Weitere Informationen zur Wertübertragung zwischen übergeordneten und untergeordneten Komponenten von Antd-Baum finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • React-Beispielcode zur Parameterübergabe für nicht über- und untergeordnete Komponenten
  • Implementierungsmethode für die Kommunikation zwischen übergeordneten und untergeordneten Komponenten von React
  • Reagieren Sie auf die Methode zum Übergeben von Werten zwischen übergeordneten und untergeordneten Komponenten
  • Reagieren Sie auf Kommunikationseigenschaften zwischen übergeordneten und untergeordneten Komponenten
  • Detaillierte Erläuterung der Übertragung von Eltern-Kind-Komponenten in React und einiger anderer wichtiger Punkte
  • react.js Eltern-Kind-Komponente Datenbindung Echtzeit-Kommunikation Beispiel-Code
  • Implementierungsmethode für die Wertübertragung von übergeordneten und untergeordneten Komponenten (Komponentenkommunikation) von React

<<:  Beispielcode für das Testskript für Indizes und Sperren auf den Isolationsebenen RR und RC

>>:  Beispielcode zum Installieren der ASPNET.Core3.0-Runtime unter Linux

Artikel empfehlen

Anmeldung zur Token-Verifizierung im Vue-Projekt (Front-End-Teil)

In diesem Artikelbeispiel wird der spezifische Co...

So installieren Sie Nginx unter Win10

Da das Unternehmen mich bat, einen WebService-Ser...

So schreiben Sie speichereffiziente Anwendungen mit Node.js

Inhaltsverzeichnis Vorwort Problem: Kopieren groß...

Installieren Sie Centos7 mithilfe einer virtuellen Hyper-V-Maschine

Inhaltsverzeichnis einführen Vorbereiten Systemab...

Analysieren des MySQL-Binärprotokolls

Inhaltsverzeichnis 1. Einführung in Binlog 2. Bin...

Docker verwendet ein einzelnes Image zum Zuordnen zu mehreren Ports

brauchen: Der Ressourcenserver der offiziellen We...

Zusammenfassung einiger gängiger Verwendungen von Refs in React

Inhaltsverzeichnis Was sind Refs 1. Referenzen vo...

Zusammenfassung häufiger Probleme und Lösungen in Vue (empfohlen)

Es gibt einige Probleme, die nicht auf Vue beschr...

IIS7~IIS8.5 Löschen oder Ändern des Serverprotokollheaders Server

Anforderungen: Entfernen Sie HTTP-Antwortheader i...

Der vollständige Prozess der Docker-Image-Erstellung

Inhaltsverzeichnis Vorwort Erstellungsschritte Er...

So erstellen Sie Ihre eigene Angular-Komponentenbibliothek mit DevUI

Inhaltsverzeichnis Vorwort Erstellen einer Kompon...