Eine detaillierte Anleitung zu benutzerdefinierten Anweisungen in Vue

Eine detaillierte Anleitung zu benutzerdefinierten Anweisungen in Vue

1. Was ist eine benutzerdefinierte Anweisung?

Die Inline-Attribute, die mit v- beginnen und die wir sehen, sind alle Anweisungen. Verschiedene Anweisungen können verschiedene Funktionen ausführen oder implementieren und Low-Level-Operationen an gewöhnlichen DOM-Elementen durchführen. In diesem Fall werden benutzerdefinierte Anweisungen verwendet. Zusätzlich zu den standardmäßig integrierten Anweisungen für Kernfunktionen (V-Model und V-Show) können Sie in Vue auch benutzerdefinierte Anweisungen registrieren.

Es gibt mehrere Möglichkeiten, den Befehl zu verwenden:

//Instanziiert einen Befehl, aber dieser Befehl hat keinen Parameter `v-xxx`
 
// -- Übergeben Sie den Wert an die Anweisung `v-xxx="value"`  
 
// -- Übergeben Sie die Zeichenfolge an die Direktive, beispielsweise `v-html="'<p>Content</p>'"`
`v-xxx="'Zeichenfolge'"` 
 
// -- Übergeben Sie Parameter (`arg`), wie etwa `v-bind:class="className"`
`v-xxx:arg="Wert"` 
 
// -- Modifikatoren verwenden (`modifier`)
`v-xxx:arg.modifier="Wert"` 

2. So passen Sie Anweisungen an

Die Registrierung einer benutzerdefinierten Direktive kann global oder lokal erfolgen.

Die globale Registrierung erfolgt hauptsächlich mit der Methode Vue.directive

Der erste Parameter von Vue.directive ist der Name der Direktive (ohne das Präfix v-), und der zweite Parameter können Objektdaten oder eine Direktivenfunktion sein.

// Registriere eine globale benutzerdefinierte Direktive `v-focus`
Vue.direktive('Fokus', {
  // Wenn das gebundene Element in das DOM eingefügt wird ...
  eingefügt: Funktion (el) {
    // Fokuselement el.focus() // Eine kleine Funktion, die das Eingabefeld automatisch fokussiert, nachdem die Seite geladen wurde}
})

Die lokale Registrierung erfolgt durch Festlegen des Direktivenattributs in den Komponentenoptionen

Anweisungen: {
  Fokus:
    // Definition der Anweisung eingefügt: function (el) {
      el.focus() // Eine kleine Funktion, die das Eingabefeld automatisch fokussiert, nachdem die Seite geladen wurde}
  }
}

Sie können dann die neue V-Fokus-Eigenschaft auf jedes Element in Ihrer Vorlage wie folgt anwenden:

<Eingabe v-Fokus />

Hook-Funktion

Benutzerdefinierte Anweisungen verfügen wie Komponenten auch über Hook-Funktionen:

  • binden: Wird nur einmal aufgerufen, wenn die Direktive zum ersten Mal an ein Element gebunden wird. Hier können Sie eine einmalige Initialisierung durchführen
  • eingefügt: wird aufgerufen, wenn das gebundene Element in den übergeordneten Knoten eingefügt wird (es garantiert nur, dass der übergeordnete Knoten existiert, wird aber nicht unbedingt in das Dokument eingefügt)
  • update: Wird aufgerufen, wenn der VNode der Komponente aktualisiert wird. Dies kann jedoch geschehen, bevor die untergeordneten VNodes aktualisiert werden. Der Wert der Anweisung kann sich geändert haben, muss es aber nicht. Sie können jedoch unnötige Vorlagenaktualisierungen vermeiden, indem Sie die Werte vor und nach der Aktualisierung vergleichen.
  • componentUpdated: Wird aufgerufen, nachdem der VNode der Komponente, in dem sich die Anweisung befindet, und seine untergeordneten VNodes alle aktualisiert wurden
  • unbind: Wird nur einmal aufgerufen, wenn die Anweisung vom Element getrennt wird

Alle Parameter der Hook-Funktion lauten wie folgt:

  • el: Das Element, an das die Anweisung gebunden ist, mit dem das DOM direkt manipuliert werden kann
  • Bindung: Ein Objekt mit den folgenden Eigenschaften:

„Name“: Der Name der Direktive ohne das Präfix „v-“.

`value`: Der Bindungswert der Direktive. Beispielsweise ist in v-my-directive="1 + 1" der Bindungswert 2.

„oldValue“: Der vorherige Wert der Direktive-Bindung, nur in Update- und ComponentUpdated-Hooks verfügbar. Verfügbar, unabhängig davon, ob sich der Wert geändert hat oder nicht.

„Ausdruck“: Ein direktiver Ausdruck als Zeichenfolge. Beispielsweise lautet der Ausdruck in v-my-directive="1 + 1" "1 + 1".

`arg`: An den Befehl übergebener Parameter, optional. In v-my-directive:foo lautet der Parameter beispielsweise „foo“.

„Modifikatoren“: Ein Objekt, das Modifikatoren enthält. Beispiel: In v-my-directive.foo.bar ist das Modifikatorobjekt { foo: true, bar: true }

`vnode`: Durch Vue-Kompilierung generierter virtueller Knoten

`oldVnode`: der vorherige virtuelle Knoten, nur in Update- und ComponentUpdated-Hooks verfügbar

Mit Ausnahme von el sollten alle anderen Parameter schreibgeschützt sein und nicht geändert werden. Wenn Sie Daten zwischen Hooks austauschen müssen, empfiehlt es sich, dies über den Datensatz des Elements zu tun.

Zum Beispiel:

<div v-demo="{ color: 'white', text: 'hallo!' }"></div>
<Skript>
    Vue.Direktive('demo', Funktion (el, Bindung) {
    console.log(Bindung.Wert.Farbe) // "weiß"
    console.log(binding.value.text) // "Hallo!"
    })
</Skript>

3. Anwendungsszenarien

Die Verwendung benutzerdefinierter Komponenten kann einige unserer alltäglichen Szenarien abdecken. Hier sind einige Beispiele für benutzerdefinierte Komponenten:

  • Stabilisierung
  • Lazy Loading von Bildern
  • Kopierfunktion mit einem Klick

Eingabefeld Anti-Shake

In diesem Fall legen Sie eine benutzerdefinierte V-Throttle-Anweisung fest, um ein Verwackeln zu verhindern.

Zum Beispiel:

// 1. Setze die benutzerdefinierte v-throttle-Direktive Vue.directive('throttle', {
  binden: (el, Bindung) => {
    let throttleTime = binding.value; // Anti-Shake-Zeitif (!throttleTime) { // Wenn der Benutzer die Anti-Shake-Zeit nicht einstellt, beträgt die Standardeinstellung 2 s
      Drosselzeit = 2000;
    }
    lass cbFun;
    el.addEventListener('klicken', event => {
      if (!cbFun) { // Erste Ausführung cbFun = setTimeout(() => {
          cbFun = null;
        }, Drosselzeit);
      } anders {
        Ereignis und Ereignis.stopImmediatePropagation();
      }
    }, WAHR);
  },
});
// 2. Legen Sie benutzerdefinierte v-throttle-Anweisungen für den Button-Tag <button @click="sayHello" v-throttle>Senden</button> fest.

Lazy Loading von Bildern

Legen Sie eine benutzerdefinierte V-Lazy-Komponente fest, um das verzögerte Laden von Bildern abzuschließen

const LazyLoad = {
    // Installationsmethode install(Vue,options){
       //Lade Bild statt Bild let defaultSrc = options.default;
        Vue.direktive('faul',{
            binden(el,Bindung){
                LazyLoad.init(el,Bindung.Wert,Standardquelle);
            },
            eingefügt(el){
                // Kompatibilitätsverarbeitung if('InterpObserver' in window){
                    LazyLoad.observe(el);
                }anders{
                    LazyLoad.listenerScroll(el);
                }
                
            },
        })
    },
    // Initialisierung init(el,val,def){
        // src speichert die echte Quelle
        el.setAttribute('src',val);
        // Quelle auf Laden des Bildes setzen el.setAttribute('src',def);
    },
    // Verwenden Sie InterpObserver, um el zu überwachen
    beobachten(el){
        let io = neuer InterpObserver(Einträge => {
            lass realSrc = el.dataset.src;
            wenn (Einträge[0].istSchnittpunkt) {
                wenn(realSrc){
                    el.src = realeQuelle;
                    el.removeAttribute('src');
                }
            }
        });
        io.observe(el);
    },
    // Auf Scroll-Ereignisse warten listenerScroll(el){
        : Lassen Sie den Handler = LazyLoad.throttle(LazyLoad.load,300);
        LazyLoad.load(el);
        window.addEventListener('scroll',() => {
            handler(el);
        });
    },
    // Lade das echte Bild load(el){
        let windowHeight = document.documentElement.clientHeight
        let elTop = el.getBoundingClientRect().top;
        let elBtm = el.getBoundingClientRect().bottom;
        lass realSrc = el.dataset.src;
        wenn(elTop - Fensterhöhe<0&&elBtm > 0){
            wenn(realSrc){
                el.src = realeQuelle;
                el.removeAttribute('src');
            }
        }
    },
    // Drosselung(fn,Verzögerung){
        lass den Timer; 
        lass vorherige Zeit;
        Rückgabefunktion (... args) {
            lassen Sie currTime = Date.now();
            lass Kontext = dies;
            wenn(!vorherigeZeit) vorherigeZeit = aktuelleZeit;
            Zeitüberschreitung löschen(Timer);
            
            if (aktuelleZeit - vorherigeZeit > Verzögerung) {
                vorherigeZeit = aktuelleZeit;
                fn.apply(Kontext,Argumente);
                Zeitüberschreitung löschen(Timer);
                zurückkehren;
            }
 
            Timer = setzeTimeout(Funktion(){
                vorherigeZeit = Date.now();
                Zeitgeber = null;
                fn.apply(Kontext,Argumente);
            },Verzögerung);
        }
    }
 
}
Standard-LazyLoad exportieren;

Kopierfunktion mit einem Klick

importiere { Message } von „Ant-Design-Vue“;
 
const vCopy = { //
  /*
    Die Bind-Hook-Funktion wird beim ersten Binden aufgerufen und kann zum Initialisieren der Einstellungen verwendet werden. el: das DOM-Objekt, auf das eingewirkt werden soll. value: der an die Anweisung übergebene Wert, d. h. der Wert, den wir kopieren möchten. */
  binden(el, { Wert }) {
    el.$value = value; // Verwenden Sie eine globale Eigenschaft, um den übergebenen Wert zu speichern, da dieser Wert in anderen Hook-Funktionen verwendet wird el.handler = () => {
      wenn (!el.$wert) {
      // Wenn der Wert leer ist, geben Sie eine Eingabeaufforderung ein. Die Eingabeaufforderung, die ich hier verwende, ist die Eingabeaufforderung von Ant-Design-Vue. Sie können sie nach Belieben verwenden. Message.warning('Kein kopierter Inhalt');
        zurückkehren;
      }
      // Textarea-Tag dynamisch erstellen const textarea = document.createElement('textarea');
      // Setzen Sie den Textbereich auf schreibgeschützt, um zu verhindern, dass die Tastatur unter iOS automatisch angezeigt wird, und verschieben Sie den Textbereich aus dem sichtbaren Bereich. textarea.readOnly = 'schreibgeschützt';
      Textbereich.Stil.Position = "absolut";
      Textbereich.Stil.links = '-9999px';
      // Weisen Sie dem Value-Attribut des Textarea-Tags den zu kopierenden Wert zu textarea.value = el.$value;
      //Textbereich in den Textkörper einfügen document.body.appendChild(textarea);
      //Wert auswählen und kopieren textarea.select();
      // textarea.setSelectionRange(0, textarea.value.length);
      const result = document.execCommand('Kopieren');
      wenn (Ergebnis) {
        Message.success('Kopieren erfolgreich');
      }
      Dokument.Body.RemoveChild(Textbereich);
    };
    // Klickereignis binden, das sogenannte One-Click-Kopieren el.addEventListener('click', el.handler);
  },
  // Wenn der eingehende Wert aktualisiert wird, lösen Sie componentUpdated(el, { value }) { aus.
    el.$wert = Wert;
  },
  // Wenn die Anweisung vom Element gelöst ist, entferne die Ereignisbindung unbind(el) {
    el.removeEventListener('klicken', el.handler);
  },
};
 
Standard-vCopy exportieren;

Ziehen

<div ref="a" id="bg" v-ziehen></div>

  Anweisungen: {
    ziehen: {
      bind() {},
      eingefügt(el) {
        el.onmousedown = (e) => {
          lass x = e.clientX - el.offsetLeft;
          sei y = e.clientY - el.offsetTop;
          document.onmousemove = (e) => {
            sei xx = e.clientX – x + "px";
            sei yy = e.clientY – y + "px";
            el.style.left = xx;
            el.style.top = yy;
          };
          el.onmouseup = (e) => {
            Dokument.onmousemove = null;
          };
        };
      },
    },
  },

Es gibt viele Anwendungsszenarien für benutzerdefinierte Komponenten, z. B. Drag & Drop-Anweisungen, Seitenwasserzeichen, Berechtigungsüberprüfung usw.

Zusammenfassen

Dies ist das Ende dieses Artikels über benutzerdefinierte Anweisungen in Vue. Weitere relevante Inhalte zu benutzerdefinierten Anweisungen in Vue finden Sie in früheren Artikeln auf 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:
  • Detaillierte Erläuterung der benutzerdefinierten Vue-Anweisungen
  • Details der benutzerdefinierten Vue-Anweisung
  • Implementierung der benutzerdefinierten Kopierfunktion Vue v-copy

<<:  Analyse des Parameterübertragungsprozesses des Treibermoduls in Linux

>>:  So installieren Sie Solr 8.6.2 in Docker und konfigurieren den chinesischen Wortsegmentierer

Artikel empfehlen

Tutorial-Diagramm zur Installation von TomCat unter Windows 10

Installieren Sie TomCat unter Windows Dieser Arti...

Details zu 7 Arten der Komponentenkommunikation in Vue3

Inhaltsverzeichnis 1. Kommunikationsmethode für V...

So kapseln Sie Axios-Anfragen mit Vue

Tatsächlich ist es sehr einfach, Axios in Vue zu ...

Detaillierte Erläuterung der Implementierung der Nginx-Prozesssperre

Inhaltsverzeichnis 1. Die Rolle der Nginx-Prozess...

Zusammenfassung gängiger SQL-Anweisungen in MySQL

1. MySQL-Exportdatei: SELECT `pe2e_user_to_compan...

Mehrere Lösungen für die Ausrichtung von CSS-Datensatztextsymbolen

Während der Entwicklung kommt es sehr häufig vor,...

Beispiel für eine geplante MySQL-Datenbanksicherung

Dieser Artikel beschreibt das Beispiel eines gepl...

Die letzten zwei Jahre mit User Experience

<br />Es ist nicht länger als zwei Jahre her...