Dynamisches JQuery-Menü mit reagieren

John Steve

Ich möchte mit React (ES6) ein dynamisches JQuery-Menü erstellen. Ich folge den JQuery-Menübeispielen ( https://jqueryui.com/menu/ ), aber alle darin enthaltenen Beispiele erstellen statische Menüs. Es wird nicht erklärt, wie Menüelemente wie das Aktualisieren von Labels oder die Aktivierung geändert werden. Außerdem möchte ich nicht mit einer neuen Implementierung eines Menüs in React enden.

Ich habe ein Json-Array für meine Menüelemente, das verschachtelte Ebenen voraussetzt.

let simple= [{
            disabled: true,
            label: "Item1"
        },
        {
            label: "Item2"
        },
        {
            label: "-"
        },
        {
            label: "Item3"
        },
        {
            label: "Item4",
            children: [
                {
                    label: "Sub Item1"
                },
                {
                    label: "Sub Item2"
                },
                {
                    label: "Sub Item3"
                }
            ]
        }];

Ich möchte, dass das Label oder die Anzeige eines JSON-Elements direkt im Menü aktualisiert wird. Ich muss eine manuelle DOM-Manipulation vermeiden, da dies ein fehleranfälliger Ansatz ist.

oraveris

Die dynamische Manipulation in React ist mit den Mutationsfunktionen unkompliziert. Erstens, ich denke, Sie haben dies bereits getan, Sie müssen die erforderlichen JQuery-Bibliotheken importieren

import $ from 'jquery';
import 'jquery-ui/ui/core';
import 'jquery-ui/ui/widgets/menu';

Und Sie müssen Ihr Menü in einer Reaktionskomponente wie unten beschrieben referenzieren. Der dynamische Lebenszyklus wird als Reaktionszustand behandelt ( https://facebook.github.io/react/docs/state-and-lifecycle.html ). Wir verwenden einen Zustand, zum Beispiel menuItems, um die JSON-Objekte/Arrays zu verwalten. Sie sehen, dass die Position auf absolut gesetzt ist. Ohne dies führt Ihr Menü dazu, dass Ihr gesamtes Dokument erweitert wird, es sei denn, dies ist das gewünschte Verhalten.

<ul ref="menu" style={{display: "none", position: "absolute"}}>
    {this.state.menuItems.map(this.processMenuEntry.bind(this, 0))}
</ul>

Die Implementierung der Methode processMenuEntry ist unten. Natürlich können Sie diese Methode aktualisieren, um sie an eine andere JSON-Struktur anzupassen. Ich würde eine kleine Änderung empfehlen, um className zu verwenden: "ui-state-disabled" anstelle von disabled: true. Daher haben Sie mehr Möglichkeiten, Ihre Stile anzupassen, als nur die Aktivierung/Deaktivierung. Die folgende Methode geht von verschachtelten Ebenen aus, die mit Null beginnen, wie beim ersten Aufruf im obigen Ausschnitt. Und es ist wichtig, einer untergeordneten Komponente einen Schlüssel zuzuweisen.

processMenuEntry(level, entry, idx){
        let id= "menu"+ level+ "_"+ idx;

        if(!entry.className){
            entry.className= "";
        }

        let children= entry.children;
        let child;
        if(children && children.length){
            child= <li className= {entry.className} key= {id}><div>{entry.label}</div><ul>{children.map(this.processMenuEntry.bind(this, level+1))}</ul></li>;
        }else{
            child= <li className= {entry.className} key= {id}><div>{entry.label}</div></li>;
        }

        return child;
}

Stellen Sie in Ihrem Konstruktor sicher, dass dieser Aufruf erfolgt, damit Ihre Methode den gleichen Kontext wie Ihre Reaktionskomponente in HTML hat

this.processMenuEntry= this.processMenuEntry.bind(this);

Fügen Sie dieses Code-Snippet in Ihrem componentDidMount hinzu, um die Menü-API zusätzlich zu Ihrem Klick-Handler zu starten.

componentDidMount(){
        $(this.refs.menu).menu({
            select: function( event, ui ) {
                //do 
            }
        });
}

Wenn Sie nun beispielsweise den zweiten Punkt in Ihrem Menü deaktivieren möchten, können Sie dies einfach tun.

simple[1].className= "ui-state-disabled";
this.setState({"menuItems": simple});

Sie können auch ein ganz anderes JSON-Array einstellen, und React kümmert sich darum

this.setState({"menuItems": [{
    label: "Some new Item1"
}]}); 

Die Verwendung von "-" als Label fügt Ihrem Menü ein Trennzeichen hinzu, wie die JQuery-Menü-API entworfen wurde.

Schließlich können Sie sich in Bezug auf die Handhabung des Umschalters Ihres Menüs oder das Ausblenden des Menüs, wenn Sie außerhalb des Menüs klicken, den folgenden Ausschnitt ansehen. Natürlich können Sie es basierend auf Ihrer Arbeit ändern. Ich gehe weiter unten davon aus, dass wir das Menü umschalten, wenn wir auf einen Anker klicken. Die Prüfung, ob der Benutzer außerhalb des Menüs geklickt hat, wird nur hinzugefügt, wenn das Menü sichtbar ist.

<a href="https://stackoverflow.com" onClick={this.toggleMenu}>Test</a>

componentWillUnmount(){
    this.stopMenuListeners();
}

stopMenuListeners(){
    $(document).off("click.menuOutsideClicks");
}

toggleMenu(event){
        let menu= $(this.refs.menu);
        let visible= !menu.is(':visible');
        menu.slideToggle("fast");

        this.stopMenuListeners();
        if(visible){
            setTimeout(()=>{
                this._handler= $(document).on("click.menuOutsideClicks", (event)=>{
                    if(!$(event.target).closest(menu).length){
                        menu.slideUp('slow').hide();
                        this.stopMenuListeners();
                    }
                });
            });
        }

        event.stopPropagation();
        event.preventDefault();
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv