Vue.js fĂŒr AnfĂ€nger Lektion 5: Umgang mit Ereignissen

Heute, in der fĂŒnften Lektion des Kurses Vue.js fĂŒr AnfĂ€nger, werden wir darĂŒber sprechen, wie man mit Ereignissen umgeht.









→ Vue.js AnfĂ€nger Lektion 1: Instanz Vue

→ Vue.js fĂŒr AnfĂ€nger, Lektion 2: Bindungsattribute

→ Vue.js AnfĂ€nger Lektion 3: Bedingtes Rendern

→ Vue.js AnfĂ€nger Lektion 4: Listen rendern

→ Vue .js fĂŒr AnfĂ€nger Lektion 5: Ereignisverarbeitung

→ Vue.js AnfĂ€nger Lektion 6: Binden von Klassen und Stilen

→ Vue.js AnfĂ€nger Lektion 7: berechnete Eigenschaften

→ Vue.js AnfĂ€nger Lektion 8: Komponenten



Der Zweck der Lektion



Das erste Ziel der Lektion ist es, eine SchaltflÀche auf der Produktkarte zu haben, durch die die Anzahl der Produkte im Warenkorb erhöht wird.



Das zweite Ziel besteht darin, das Produktbild zu Ă€ndern, wenn Sie mit der Maus ĂŒber die Farbnamen der Produktvarianten fahren.



Anfangscode



Die Projektdatei index.htmlenthÀlt den folgenden Code:



<div id="app">
  <div class="product">
    <div class="product-image">
      <img :src="image" />
    </div>

    <div class="product-info">
      <h1>{{ product }}</h1>
      <p v-if="inStock">In stock</p>
      <p v-else>Out of Stock</p>

      <ul>
        <li v-for="detail in details">{{ detail }}</li>
      </ul>
      <div v-for="variant in variants" :key="variant.variantId">
        <p>{{ variant.variantColor }}</p>
      </div>

    </div>
  </div>
</div>


Hier ist der Inhalt main.js:



var app = new Vue({
    el: '#app',
    data: {
        product: "Socks",
        image: "./assets/vmSocks-green.jpg",
        inStock: true,
        details: ['80% cotton', '20% polyester', 'Gender-neutral'],
        variants: [
          {
            variantId: 2234,
            variantColor: "green"
          },
          {
            variantId: 2235,
            variantColor: "blue"
          }
        ]
    }
})


Aufgabe



Wir benötigen eine SchaltflÀche, um einen Ereignis-Listener zuzuweisen, wenn darauf geklickt wird. Beim Klicken sollte eine Methode gestartet werden, mit der die Anzahl der Artikel im Warenkorb erhöht wird.



Entscheidung



FĂŒgen Sie dem main.jsObjekt zunĂ€chst dataeine neue Eigenschaft hinzu, die die Anzahl der Artikel im Warenkorb symbolisiert:



cart: 0


FĂŒgen index.htmlSie nun ein Element hinzu <div>, das den Warenkorb beschreibt. Dieses Element verwendet ein Tag, <p>mit dem die in der Eigenschaft gespeicherte Nummer auf der Seite angezeigt wird cart:



<div class="cart">
  <p>Cart({{ cart }})</p>
</div>


Wir werden auch eine index.htmlSchaltflÀche im Code erstellen , mit der Sie ein Produkt in den Warenkorb legen können:



<button v-on:click="cart += 1">Add to cart</button>


Beachten Sie hier, cartdass wir die Direktive verwenden, um den in gespeicherten Wert zu erhöhen v-on.





Eine Seite mit einem Warenkorb und einer SchaltflĂ€che zum HinzufĂŒgen eines Artikels zum Warenkorb 



Wenn Sie jetzt auf die SchaltflÀche klicken, erhöht sich die Anzahl der Artikel im Warenkorb um 1.



Wie funktioniert das alles?



Werfen wir einen Blick auf die hier vorgestellte Konstruktion. Die Verwendung einer Direktivev-onteilt Vue mit, dass wir auf Ereignisse auf der SchaltflĂ€che warten möchten. Dann kommt ein Doppelpunkt, nach dem das spezifische Ereignis angezeigt wird, an dem wir interessiert sind. In diesem Fall handelt es sich um ein Ereignisclick. Die AnfĂŒhrungszeichen enthalten einen Ausdruck, der dem in gespeicherten Wert 1 hinzufĂŒgtcart. Dies geschieht jedes Mal, wenn auf die SchaltflĂ€che geklickt wird.



Dies ist ein einfaches, aber nicht ganz realistisches Beispiel. Anstatt den Ausdruck einzuschließencart += 1Machen wir es so, dass durch Klicken auf die SchaltflĂ€che eine Methode aufgerufen wird, die den in gespeicherten Wert erhöht cart. So sieht es aus:



<button v-on:click="addToCart">Add to cart</button>


Wie Sie sehen können, ist hier addToCartder Name der Methode, die aufgerufen wird, wenn das Ereignis eintritt click. Wir haben die Methode selbst noch nicht deklariert. Lassen Sie uns dies jetzt tun, indem Sie unsere Vue-Instanz damit ausstatten.



Es verwendet einen Mechanismus, der dem sehr Ă€hnlich ist, den wir bereits zum Speichern von Daten verwenden. Wir sprechen nĂ€mlich ĂŒber die Tatsache, dass das Objekt mit Optionen, die beim Erstellen einer Instanz von Vue verwendet werden, möglicherweise eine optionale Eigenschaft hat, nach methodsder das Objekt mit Methoden benannt ist. In unserem Fall ist es nur eine Methode addToCart:



methods: {
  addToCart() {
    this.cart += 1
  }
}


Wenn wir nun auf die SchaltflÀche klicken, wird die Methode aufgerufen addToCart, wodurch der cartim Tag angezeigte Wert erhöht wird <p>.



Fahren wir mit der Analyse fort, was hier passiert.



Die SchaltflĂ€che wartet clickdank der Anweisung v-on, die die Methode aufruft, auf Ereignisse addToCart. Diese Methode befindet sich in der Eigenschaft der methodsVue-Instanz. Der Funktionskörper enthĂ€lt eine Anweisung, die dem Wert 1 hinzufĂŒgt this.cart. Da thisein Verweis darauf gespeichert ist, wo die Daten der Vue-Instanz gespeichert sind, in der wir uns befinden, addiert die Funktion 1 zum Wert cart. A this.cartist dasselbe wie eine Eigenschaft cart, die in einer Eigenschaft eines dataObjekts mit Optionen deklariert ist .



Wenn wir nur in den Körper der Funktion so etwas geschrieben habencart += 1dann wĂ€ren wir auf eine Fehlermeldung gestoßen cart is not defined. Aus diesem Grund verwenden wir Konstrukt this.cartund Zugriff cartvon einer Vue-Instanz mit this.



Vielleicht wundern Sie sich jetzt, dass wir jetzt einfach die Anzahl der Artikel im Warenkorb erhöhen, aber den Artikel selbst nicht in den Warenkorb legen. Vielleicht machen wir etwas falsch? Das ist die richtige Frage. Wir werden diese FunktionalitÀt spÀter in einem der folgenden Tutorials implementieren.



Nachdem wir nun die Grundlagen der Ereignisbehandlung in Vue gelernt haben, schauen wir uns ein komplexeres Beispiel an.



Erweitern wir zunĂ€chst die Array-Objekte variantsaus dem Objekt, dataindem wir dort eine Eigenschaft hinzufĂŒgen variantImage, in der der Pfad zum Bild der gewĂŒnschten Produktvariante gespeichert ist. Geben wir den entsprechenden Abschnitt der Datei anmain.js zu dieser Form:



variants: [
  {
    variantId: 2234,
    variantColor: "green",
    variantImage: "./assets/vmSocks-green.jpg"    
  },
  {
    variantId: 2235,
    variantColor: "blue",
    variantImage: "./assets/vmSocks-blue.jpg" 
  }
],


Jetzt hat jede Produktvariante, grĂŒne und blaue Socken, ein eigenes Bild.



Aufgabe



Wenn Sie mit der Maus ĂŒber den Namen der Farbe der Sockenvariante fahren, muss in dem Feld, in dem das Bild des Produkts angezeigt wird, das Bild variantImagefĂŒr die entsprechende Farbe angezeigt werden .



Entscheidung



Hier bietet sich die Richtlinie wieder an v-on. Aber dieses Mal werden wir eine abgekĂŒrzte Version der Notation verwenden, die so aussieht @. Und wir werden uns die Veranstaltung anhören mouseover.



Hier ist der relevante Code in index.html:



<div v-for="variant in variants" :key="variant.variantId">
  <p @mouseover="updateProduct(variant.variantImage)">
    {{ variant.variantColor }}
  </p>
</div>


Beachten Sie, dass wir die Methode updateProductin Form eines Arguments ĂŒbergeben variant.variantImage.



Erstellen wir diese Methode in main.js:



updateProduct(variantImage) {
  this.image = variantImage
}


Diese Methode ist der kĂŒrzlich erstellten sehr Ă€hnlich, um den Wert zu erhöhen cart.



Aber hier aktualisieren wir den in gespeicherten Wert image. Es imagewird nĂ€mlich aufgezeichnet, was in variantImageder Variante des Produkts gespeichert ist, auf dem sich der Mauszeiger befindet. Der entsprechende Wert wird updateProductvom Ereignishandler selbst an die Funktion ĂŒbergeben. Er befindet sich in index.html:



<p @mouseover="updateProduct(variant.variantImage)">


Mit anderen Worten, die Methode kann jetzt updateProductmit einem Parameter variantImageaufgerufen werden .



Wenn diese Methode aufgerufen wird, wird variant.variantImagesie als Ansicht an sie ĂŒbergeben variantImageund zum Aktualisieren des in gespeicherten Werts verwendet this.image. In Analogie zu der zuvor betrachteten Konstruktion this.cartkönnen wir sagen, dass this.image- dasselbe ist wie image. Infolgedessen wird der in gespeicherte Wert imagejetzt dynamisch entsprechend den Daten der Artikelvariante aktualisiert, ĂŒber die der Mauszeiger bewegt wird.



ES6-Syntax



Hier haben wir beim Erstellen von Methoden die folgenden Konstruktionen verwendet:



updateProduct(variantImage) {
  this.image = variantImage
}


Dies ist eine abgekĂŒrzte Version der Methodenbeschreibung, die in ES6 angezeigt wurde. Eine Ă€ltere Version des Schreibens solcher Konstruktionen sieht folgendermaßen aus:



updateProduct: function(variantImage) {
  this.image = variantImage
}


Werkstatt



Erstellen Sie eine SchaltflÀche und eine entsprechende Methode, um den in gespeicherten Wert zu verringern cart.



→ Hier ist eine Vorlage, mit der Sie dieses Problem lösen können.



→  Hier ist die Lösung des Problems.



Ergebnis



Lassen Sie uns die Ergebnisse der heutigen Lektion zusammenfassen:



  • Die Direktive wird verwendet, um die Reaktion eines Elements auf Ereignisse zu organisieren v-on.
  • Eine abgekĂŒrzte Version der Richtlinie v-onsieht so aus @.
  • Bei Verwendung können v-onSie den Ereignistyp angeben , den Sie abhören möchten:



    • klicken
    • Mouseover
    • jedes DOM-Ereignis
  • Die Direktive v-onkann Methoden aufrufen.
  • Die mit aufgerufene Methode v-onkann Argumente annehmen.
  • this , Vue. , , .


Hast du deine Hausaufgaben fĂŒr diese Lektion gemacht?



→ Vue.js AnfĂ€nger Lektion 1: Instanz Vue

→ Vue.js fĂŒr AnfĂ€nger, Lektion 2: Bindungsattribute

→ Vue.js AnfĂ€nger Lektion 3: Bedingtes Rendern

→ Vue.js AnfĂ€nger Lektion 4: Listen rendern

→ Vue .js fĂŒr AnfĂ€nger Lektion 5: Ereignisverarbeitung

→ Vue.js AnfĂ€nger Lektion 6: Binden von Klassen und Stilen

→ Vue.js AnfĂ€nger Lektion 7: berechnete Eigenschaften

→ Vue.js AnfĂ€nger Lektion 8: Komponenten






All Articles