Vue3.0 implementiert die Kapselung des Dropdown-Menüs

Vue3.0 implementiert die Kapselung des Dropdown-Menüs

Vue3.0 ist bereits seit einiger Zeit auf dem Markt und es ist notwendig, sich damit zu befassen!

Schauen wir uns zunächst den Effekt an, den wir erzielen möchten

Es ist sehr üblich, den Inhalt des Menüelements zu erweitern. Wie entwickelt man es in vue3.0? Hier verwenden wir den Standardstil von Bootstrap

Idee 1:

<DropDown :title="'Beenden'" :list="menuLists" />

Idee 2:

<dropdown :title="'Beenden'">
   <drop-dowm-item>Neuen Artikel erstellen</drop-down-item>
   <drop-dowm-item>Artikel bearbeiten</drop-down-item>
   <drop-dowm-item>Persönliche Informationen</drop-down-item>
</Dropdown>

Beide Ideen sind gut. Im Vergleich dazu ist die zweite Idee klarer. Wenn Sie sie verwenden, kennen Sie die spezifische Ebene, die auch der Modus der ElementUI-Komponentenentwicklung ist.
Lassen Sie uns nun die zweite Komponente der Entwicklungsidee analysieren

DropDown.ts

<Vorlage>
  <div Klasse="dropdown" ref="dropDownRef">
    <a
      @click.prevent="toggleOpen"
      Klasse = "btn btn-sekundäres Dropdown-Umschalten"
      href="#" rel="externes Nofollow" 
    >
      {{ Titel }}
    </a>
    <div Klasse="Dropdown-Menü" :style="{ Anzeige: 'block' }" v-show="istOffen">
      <Steckplatz></Steckplatz>
    </div>
  </div>
</Vorlage>

js-Teil

<script lang="ts">
importiere { defineComponent, ref, onMounted, onUnmounted, watch } von "vue";
importiere useClickOutside von "../hooks/useClickOutside";
exportiere StandarddefiniereKomponente({
  Name: "DropDown",
  Requisiten: {
    Titel:
      Typ: Zeichenfolge,
      erforderlich: wahr,
    },
  },

  setup(Kontext) {
    const isOpen = ref(false);
    //vue3.0 ruft die Referenz des DOM-Objekts ab const dropDownRef = ref<null | HTMLElement>(null);
    const toggleOpen = () => {
      istOpen.value = !istOpen.value;
    };
    const handleClick = (e: Mausereignis) => {
      console.log(e.target, "e");
      wenn (dropDownRef.value) {
        Konsole.log(dropDownRef.value);
        Wenn (
        //contains bestimmt, ob der Knoten den Knoten enthält!dropDownRef.value.contains(e.target as HTMLElement) &&
          istOffen.Wert
        ) {
          istOffen.Wert = falsch;
        }
      }
    };
    beimMounted(() => {
    //Globales Klickereignis registrieren document.addEventListener("click", handleClick);
    });
    beiUnmountet(() => {
    //Bindung aufheben document.removeEventListener("click", handleClick);
    }); 
    zurückkehren {
      istOffen,
      UmschaltenÖffnen,
      DropdownRef,
    };
  },
});
</Skript>

DropDownItem.ts

<Vorlage>
  <li class="dropdown-option" :class="{ 'is-disabled': deaktiviert }">
    <Steckplatz></Steckplatz>
  </li>
</Vorlage>
<Stilbereich>

/* Hier muss der Schlitz eindringen*/
.dropdowm-option.ist-deaktiviert >>> * {
  Farbe: #6c757d;
  Zeigerereignisse: keine;
  Hintergrundfarbe: transparent;
}
</Stil>
<script lang="ts">
importiere { defineComponent } von "vue";

exportiere StandarddefiniereKomponente({
  Requisiten: {
    deaktiviert:
      Typ: Boolean,
      Standard: false,
    },
  },
  aufstellen() {
    zurückkehren {};
  },
});
</Skript>

An diesem Punkt ist die Komponente fertig. Aber ... wir können sehen, dass das Ereignis des Klickens zum Ausblenden des gesamten Dokuments für die gesamte Komponente nicht sehr relevant ist, sodass wir es in einen Hook extrahieren können

useClickOutside.ts

importiere { ref, onMounted, onUnmounted,Ref } von 'vue'
const useClickOutside = (elementRef:Ref<null | HTMLElement>) => {
    const isClickOutside = ref(false)
    const handler = (e: Mausereignis) => {
        Konsole.log(elementRef.value);
        wenn (elementRef.value) {
            wenn (elementRef.value.contains(e.target as HTMLElement)) {
                isClickOutside.value = false
            } anders {
                isClickOutside.value = true
            }
        }
    }
    beimMounted(() => {
      document.addEventListener("klicken", Handler);
    });
    beiUnmountet(() => {
      document.removeEventListener("Klick", Handler);
    });
    returniere isClickOutside
}

Export-Standard useClickOutside

Dann schreiben Sie unsere DropDown.ts-Komponente neu

//Lösche die bestehende Ereignislogik<script lang="ts">
... 
 const isClickOutside = useClickOutside(dropDownRef);
    /* console.log(isClickOutside.value, "isClickOutside"); */
    //Führen Sie die Überwachungsmethode ein. Wenn sich die Daten ändern, ändern wir den Wert von isOpen auf false.
    watch(isClickOutside, (neuerWert) => {
      wenn (isOpen.value && isClickOutside.value) {
        istOffen.Wert = falsch;
      }
    });
 ...
</Skript>

Es wird der gleiche Effekt erzielt und der Code der gesamten Komponente wird zudem erheblich vereinfacht!

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Keep-Alive- und Unified-Routing-Verarbeitung von Vue3-Cache-Seiten
  • Vue3.0 kombiniert mit Bootstrap zum Erstellen einer mehrseitigen Anwendung
  • Vue3+TypeScript implementiert ein vollständiges Beispiel einer rekursiven Menükomponente
  • Detaillierte Erklärung des Unterschieds zwischen Routing-Hooks in Vue2.x und Vue3.x
  • Ein einfaches Beispiel für die Verwendung von Vue3-Routing VueRouter4
  • Beispiel für eine Routing-Berechtigungsverwaltungsmethode in Vue2/vue3
  • Verwendung von Vue3-Seiten, Menüs und Routen

<<:  Lösen Sie das Problem des IDEA-Konfigurations-Tomcat-Startfehlers

>>:  Bestimmen Sie anhand von Beispielen, ob das MySQL-Update die Tabelle sperrt

Artikel empfehlen

Detaillierte Erklärung der Set-Datenstruktur von JavaScript

Inhaltsverzeichnis 1. Was ist Set 2. Konstruktor ...

Django-Online-Bereitstellungsmethode von Apache

Umfeld: 1. Windows Server 2016 Datacenter 64-Bit ...

Lösung zum Importieren weiterer Daten aus MySQL in Hive

Ursprünglicher abgeleiteter Befehl: bin/sqoop imp...

Beispiel für die reguläre Umschreibmethode für Nginx Rewrite (Matching)

Die Rewrite-Funktion von Nginx unterstützt regelm...

Beispiele für häufige Nginx-Fehlkonfigurationen

Inhaltsverzeichnis Fehlender Stammspeicherort Off...

Detaillierte Analyse der SQL-Ausführungsschritte

Detaillierte Analyse der SQL-Ausführungsschritte ...

So beheben Sie den Startfehler des Docker-Containers

Frage: Nach dem Neustart des Computers kann der M...

33 der besten kostenlosen englischen Schriftarten geteilt

ChunkFive Freie Schriftfamilie Cuprum JAH I Kosten...

Erfahren Sie in zehn Minuten, wie Sie Microservices mit Docker bereitstellen

Seit seiner Veröffentlichung im Jahr 2013 wird Do...

Neue Funktionen in MySQL 8.0 - Einführung in Check Constraints

Inhaltsverzeichnis Vorwort Einschränkungen prüfen...

Was ist WML?

WML (Wireless Markup Language). Es handelt sich u...

Einführung in die Verwendung der unbestimmten Eigenschaft des Kontrollkästchens

Wenn wir das Dialogfeld „Ordnereigenschaften“ in W...

Einführung in die Verwendung des HTML-Basistags target=_parent

Der <base>-Tag gibt die Standardadresse oder...