Vue.js: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(12 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
== Einführung ==
 +
Vue ist ein gutes Framework für WebApps, kann aber auch nur zum Teilrendering eingesetzt werden. Behalte im Blick das Webapps aus Quellcode Sicht problematisch für die Suchmaschinen ist.
 +
 +
Wenn du nicht unbedingt eine Webapp bauen möchtest aber gerne einige Features von Vue nutzen möchtest (2-way-binding...) ist evtl. alpine.js nützlich)
 +
[[alpine.js]] - Alternative mit weniger overhead die sich als jQuery mit "deklarativem Ansatz" und inspiriert von Tailwind, Vue etc. sieht.
 +
 
== Links ==
 
== Links ==
  Guter Einführungskurs in Vue.js 2
+
  [[Vue.js]]
  https://coursetro.com/posts/code/133/How-to-Install-Vue-2---Through-CDN,-NPM-and-the-Vue-CLI
+
  [[Vue - Basic Concepts]]
  https://www.youtube.com/watch?v=78tNYZUS-ps (das Video dazu)
+
[[Vue CLI]]
 +
[[Vue - Components]]
 +
[[Vue - Routing]]
 +
  [[Vue - Snippets]]
  
== Installation ==
+
== Vue In Depth ==
Via CDN, NPM oder über das Vue CLI
+
=== Basic Concepts ===
 +
[[Vue - Basic Concepts]]
 +
=== CLI & Arbeitsumgebung ===
 +
[[Vue CLI]]
 +
=== Components ===
 +
[[Vue - Components]]
  
=== Vue CLI ===
+
== Vue Templates ==
==== Vue Command Line Interface installieren ====
+
=== Interpolation and Directives ===
Falls nicht vorhanden zuerst das CLI installieren. Das kann man über npm holen. Global (-g) lädt die Dateien in
+
==== Text Interpolation ====
/usr/local/lib/node_modules
+
Die einfachste Form der Interpolation ist Text-Interpolation. Hier wird einfach ein String der in der Component Logic ist ausgegeben. Die Ausgabe erfolgt wenn man den Variablennamen in '''doppelte geschweifte Klammern''' setzt. Das geht allerdings '''nicht in HTML Attributen'''. In Attributen nutzt man v-bind.
eventuell muss man hier sudo nehmen.
 
npm install -g @vue/cli
 
==== Projekt anlegen ====
 
Im Projektordner
 
vue create vue-proj
 
Vue fragt dann welches Preset man nehmen will. Hinweis babel ist ein JavaScript Compiler, eslint ist ein JavaScript Linter und hilft beim Debugging.
 
  
Nach dem Anlegen des Projekts kann man den yarn oder npm Server starten. Vue gibt einem direkt die Kommandos vor.  
+
Beispiel:
 +
'''App.vue'''
 +
<syntaxhighlight lang="html5">
 +
<template>
 +
  <div id="app">
 +
    <Skills/>
 +
  </div>
 +
</template>
 +
 
 +
<script>
 +
import Skills from './components/Skills.vue'
 +
 
 +
export default {
 +
  name: 'app',
 +
  components: {
 +
    Skills
 +
  }
 +
}
 +
</script>
 +
 
 +
<style>
 +
</style>
 +
</syntaxhighlight>
 +
 
 +
'''Skills.vue'''
 +
<syntaxhighlight lang="html5">
 +
<template>
 +
  <div>
 +
    {{name}}
 +
  </div>
 +
</template>
 +
<script>
 +
export default {
 +
  name: 'Skills',
 +
  data(){
 +
    return{
 +
      name: 'Stephan'
 +
    }
 +
  }
 +
}
 +
</script>
 +
<!-- Add "scoped" attribute to limit CSS to this component only -->
 +
<style scoped>
 +
</style>
 +
</syntaxhighlight>
 +
==== Interpolation in Attributen ====
 +
Boolean Interpolation ,ann man gut für Buttons verwenden. Wir verwenden eine um den Zustand eines Buttons zu verwalten.
 +
 
 +
Im Templateteil fügen wir hinzu:
 +
<button v-on:click="changeName" v-bind:disabled="btnState">Change Name</button>
 +
Hier sehen wir auch schon zwei Direktiven von View nämlich v-on und v-bind. Erläuterung folgt später.
 +
 
 +
Im Skriptteil fügen wir nach der name Eigenschaft eine weitere vom Typ Boolean hinzu:
 +
<pre>
 +
name: 'Stephan',
 +
btnState: true
 +
</pre>
 +
Wichtig nun: Hier verwenden wir die Eigenschaft btnState in einem Attribut. Hier kann man keine geschweiften Klammern verwenden, aber Vue erkennt automatisch die Variable.
  
Todo: Checken wie sich das verhält wenn man Apache nimmt.
+
==== Expressions (Ausdrücke) in Interpolation verwenden ====
  
== Vue Components ==
+
Man kann auch Conditionals nutzen. Basierend auf dem Code oben fügen wir im Template Teil der Komponente hinzu:
Sind die Basic Building Blocks in Vue Apps. '''Templating, Logic, Styling'''
+
<pre>
 +
{{ btnState ? 'Button ist aktiv' : 'Button ist deaktiviert'}}
 +
</pre>
 +
Das gibt Button ist deaktiviert aus, da btnState ja auf true steht.
  
Schaut man sich die Datei
+
=== Direktiven ===
src/App.vue an finden sich diese Bereiche in den Tags
+
Oben haben wir schon zwei Direktiven geseehen, die ein Event festlegen und Binden. Folgende Direktiven gibt es:
<template>
+
<pre>
  </template>
+
    v-text
<script>
+
    v-html
</script>
+
    v-show
  <style>
+
    v-if
 +
    v-else
 +
    v-else-if
 +
    v-for
 +
    v-on
 +
    v-bind
 +
    v-model
 +
    v-pre
 +
    v-cloak
 +
    v-once
 +
</pre>
 +
==== Beispiel Direktive v-for ====
 +
In der Component Skills.vue im Template-Teil
 +
<syntaxhighlight lang="html5">
 +
<div class="skills">
 +
  <div class="holder">
 +
    <ul>
 +
      <li v-for="(data, index) in skills" :key='index'>{{index}}. {{data.skill}}</li>
 +
    </ul>
 +
  </div>
 +
</div>
 +
</syntaxhighlight>
 +
und im Script Teil...
 +
<syntaxhighlight lang="html5">
 +
export default {
 +
  name: 'Skills',
 +
  data(){
 +
    return{
 +
      name: 'Stephan',
 +
      btnState: true,
 +
      skills: [
 +
          { "skill": "Radfahren" },
 +
          { "skill": "Schwimmen" }
 +
      ]
 +
    }
 +
  }
 +
}
 +
</syntaxhighlight>
 +
==== v-if v-else ====
 +
<pre>
 +
  <p v-if="skills.length >= 1">You have more than 1 skill</p>
 +
      <p v-else>You have less than or equal to 1 skill</p>
 +
</pre>
 +
== Styles und Class Binding ==
 +
=== Externe CSS Files einbinden ===
 +
  <style src="./Skills.css" scoped>
 
  </style>
 
  </style>
wieder.
+
=== Class Binding ===
 +
in skills.js
 +
<div v-bind:class="{ alert: showAlert}"></div>
 +
Setzte die Klasse ''.alert'', aber '''nur wenn showAlert true ist'''.
 +
<pre>
 +
  data() {
 +
    return {
 +
    ... ,
 +
      showAlert: true  // Add this
 +
    }
 +
  },
 +
</pre>
 +
Definiert die Eigenschaft ''showAlert''
 +
 
 +
Dann noch den Style damit wir etwas sehen können:
 +
<pre>
 +
<style scoped>
 +
  .alert {
 +
    background-color: yellow;
 +
    width:100%;
 +
    height: 30px;
 +
  }
 +
</style>
 +
</pre>
 +
 
 +
Auch der '''Not Operator''' funktioiniert:
 +
{ alert: !showAlert}
 +
 
 +
Mehrere Klassen und ifs kann man zusammenfassen. Hier wird another-class über die Property showClass gesetzt (in Anführungszeichen wegen dem minus):
 +
<div v-bind:class="{ alert: showAlert, 'another-class': showClass }"></div>
 +
==== Variante v-bind:class mit Objekt ====
 +
Man kann den HTML Code sauberer halten, wenn man als Klassenname ein Objekt einsetzt und die Klasse in der Logic implementiert:
 +
Template
 +
<div v-bind:class="alertObject"></div>
 +
Logic Teil:
 +
<pre>
 +
data() {
 +
    return {
 +
      skills: [
 +
          { "skill": "Vue.js" },
 +
          { "skill": "Frontend Developer" }
 +
      ],
 +
      alertObject: {
 +
        alert: true,
 +
        // More classes here if you want..
 +
      }
 +
    }
 +
  },
 +
</pre>
 +
 
 +
==== Style Attribut steuern mit Vue Style Binding ====
 +
Template Teil
 +
<div v-bind:style="{ backgroundColor: bgColor, width: bgWidth, height: bgHeight }"></div>
 +
Logic Teil
 +
<pre>
 +
data() {
 +
    return {
 +
      skills: [
 +
          { "skill": "Vue.js" },
 +
          { "skill": "Frontend Developer" }
 +
      ],
 +
      bgColor: 'yellow',
 +
      bgWidth: '100%',
 +
      bgHeight: '30px'
 +
    }
 +
  },
 +
</pre>
  
=== Components importieren ===
+
oder besser als Objekt:
Wenn man sich das Default Projekt anschaut sieht man auch gleich wie weitere Components importiert und angezeigt werden können.
+
Template Teil
Im Template Teil findet sich
+
  <div v-bind:style="alertObject"></div>
  <HelloWorld msg="Welcome to Your Vue.js App"/>
 
Hier wird eine Komponente "HelloWorld" geladen und eine Variable msg übergeben.
 
  
Im Script Teil wird sie importiert, damit sie überhaupt benutzt werden kann:
+
Logic Teil
import HelloWorld from './components/HelloWorld.vue'
 
Zusätzlich wird sie noch im export -> components Teil der App referenziert (heißt das so ?)
 
 
<pre>
 
<pre>
  components: {
+
alertObject: {
     HelloWorld
+
  bgColor: 'yellow',
 +
  bgWidth: '100%',
 +
  bgHeight: '30px'
 +
}
 +
</pre>
 +
Hinweis: Wir erkennen Objekte in der Regel an den Geschweiften (Wigley) Klammern {}
 +
 
 +
== User Input und das v-model ==
 +
... z.B. von Formularen wird vom Template an die Logic weitergereicht, verarbeitet und das Ergebnis wieder ans Template übergeben.
 +
 
 +
=== Ein Input Feld ===
 +
In Skills.vue
 +
 
 +
Template Section:
 +
  <input type="text" placeholder="Enter a skill you have.." v-model="skill">
 +
{{ skill }}
 +
Logic Section:
 +
<pre>
 +
data(){
 +
     return{
 +
      skill: '',
 +
      skills: [
 
...
 
...
 
</pre>
 
</pre>
 +
Interessant hier: schon beim eingeben wird {{skill}} befüllt
 +
 +
=== Methoden ===
 +
Wir erweitern das Ganze und Implementieren zum ersten Mal eine Methode.
 +
 +
 +
== Plugins ==
 +
=== Einbinden ===
 +
Todo
 +
=== Interessante Plugins ===
 +
* vee-validate

Aktuelle Version vom 7. Januar 2021, 17:13 Uhr

Einführung[Bearbeiten]

Vue ist ein gutes Framework für WebApps, kann aber auch nur zum Teilrendering eingesetzt werden. Behalte im Blick das Webapps aus Quellcode Sicht problematisch für die Suchmaschinen ist.

Wenn du nicht unbedingt eine Webapp bauen möchtest aber gerne einige Features von Vue nutzen möchtest (2-way-binding...) ist evtl. alpine.js nützlich)

alpine.js - Alternative mit weniger overhead die sich als jQuery mit "deklarativem Ansatz" und inspiriert von Tailwind, Vue etc. sieht. 

Links[Bearbeiten]

Vue.js
Vue - Basic Concepts
Vue CLI
Vue - Components
Vue - Routing
Vue - Snippets

Vue In Depth[Bearbeiten]

Basic Concepts[Bearbeiten]

Vue - Basic Concepts

CLI & Arbeitsumgebung[Bearbeiten]

Vue CLI

Components[Bearbeiten]

Vue - Components

Vue Templates[Bearbeiten]

Interpolation and Directives[Bearbeiten]

Text Interpolation[Bearbeiten]

Die einfachste Form der Interpolation ist Text-Interpolation. Hier wird einfach ein String der in der Component Logic ist ausgegeben. Die Ausgabe erfolgt wenn man den Variablennamen in doppelte geschweifte Klammern setzt. Das geht allerdings nicht in HTML Attributen. In Attributen nutzt man v-bind.

Beispiel: App.vue

<template>
  <div id="app">
    <Skills/>
  </div>
</template>

<script>
import Skills from './components/Skills.vue'

export default {
  name: 'app',
  components: {
    Skills
  }
}
</script>

<style>
</style>

Skills.vue

<template>
  <div>
    {{name}}
  </div>
</template>
<script>
export default {
  name: 'Skills',
  data(){
    return{
      name: 'Stephan'
    }
  }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

Interpolation in Attributen[Bearbeiten]

Boolean Interpolation ,ann man gut für Buttons verwenden. Wir verwenden eine um den Zustand eines Buttons zu verwalten.

Im Templateteil fügen wir hinzu:

<button v-on:click="changeName" v-bind:disabled="btnState">Change Name</button>

Hier sehen wir auch schon zwei Direktiven von View nämlich v-on und v-bind. Erläuterung folgt später.

Im Skriptteil fügen wir nach der name Eigenschaft eine weitere vom Typ Boolean hinzu:

name: 'Stephan',
btnState: true

Wichtig nun: Hier verwenden wir die Eigenschaft btnState in einem Attribut. Hier kann man keine geschweiften Klammern verwenden, aber Vue erkennt automatisch die Variable.

Expressions (Ausdrücke) in Interpolation verwenden[Bearbeiten]

Man kann auch Conditionals nutzen. Basierend auf dem Code oben fügen wir im Template Teil der Komponente hinzu:

{{ btnState ? 'Button ist aktiv' : 'Button ist deaktiviert'}} 

Das gibt Button ist deaktiviert aus, da btnState ja auf true steht.

Direktiven[Bearbeiten]

Oben haben wir schon zwei Direktiven geseehen, die ein Event festlegen und Binden. Folgende Direktiven gibt es:

    v-text
    v-html
    v-show
    v-if
    v-else
    v-else-if
    v-for
    v-on
    v-bind
    v-model
    v-pre
    v-cloak
    v-once

Beispiel Direktive v-for[Bearbeiten]

In der Component Skills.vue im Template-Teil

<div class="skills">
  <div class="holder">
    <ul>
      <li v-for="(data, index) in skills" :key='index'>{{index}}. {{data.skill}}</li>
    </ul>
  </div>
</div>

und im Script Teil...

export default {
  name: 'Skills',
  data(){
    return{
      name: 'Stephan',
      btnState: true,
      skills: [
          { "skill": "Radfahren" },
          { "skill": "Schwimmen" }
      ]
    }
  }
}

v-if v-else[Bearbeiten]

 <p v-if="skills.length >= 1">You have more than 1 skill</p>
      <p v-else>You have less than or equal to 1 skill</p>

Styles und Class Binding[Bearbeiten]

Externe CSS Files einbinden[Bearbeiten]

<style src="./Skills.css" scoped>
</style>

Class Binding[Bearbeiten]

in skills.js

Setzte die Klasse .alert, aber nur wenn showAlert true ist.

  data() {
    return {
     ... ,
      showAlert: true  // Add this
    }
  },

Definiert die Eigenschaft showAlert

Dann noch den Style damit wir etwas sehen können:

<style scoped>
  .alert {
    background-color: yellow;
    width:100%;
    height: 30px;
  }
</style>

Auch der Not Operator funktioiniert:

{ alert: !showAlert}

Mehrere Klassen und ifs kann man zusammenfassen. Hier wird another-class über die Property showClass gesetzt (in Anführungszeichen wegen dem minus):

Variante v-bind:class mit Objekt[Bearbeiten]

Man kann den HTML Code sauberer halten, wenn man als Klassenname ein Objekt einsetzt und die Klasse in der Logic implementiert: Template

Logic Teil:

data() {
    return {
      skills: [
          { "skill": "Vue.js" },
          { "skill": "Frontend Developer" }
      ],
      alertObject: {
        alert: true,
        // More classes here if you want..
      }
    }
  },

Style Attribut steuern mit Vue Style Binding[Bearbeiten]

Template Teil

Logic Teil

data() {
    return {
      skills: [
          { "skill": "Vue.js" },
          { "skill": "Frontend Developer" }
      ],
      bgColor: 'yellow',
      bgWidth: '100%',
      bgHeight: '30px'
    }
  },

oder besser als Objekt: Template Teil

Logic Teil

alertObject: {
   bgColor: 'yellow',
   bgWidth: '100%',
   bgHeight: '30px'
}

Hinweis: Wir erkennen Objekte in der Regel an den Geschweiften (Wigley) Klammern {}

User Input und das v-model[Bearbeiten]

... z.B. von Formularen wird vom Template an die Logic weitergereicht, verarbeitet und das Ergebnis wieder ans Template übergeben.

Ein Input Feld[Bearbeiten]

In Skills.vue

Template Section:

<input type="text" placeholder="Enter a skill you have.." v-model="skill">
Vorlage:Skill

Logic Section:

 data(){
    return{
      skill: '',
      skills: [
...

Interessant hier: schon beim eingeben wird Vorlage:Skill befüllt

Methoden[Bearbeiten]

Wir erweitern das Ganze und Implementieren zum ersten Mal eine Methode.


Plugins[Bearbeiten]

Einbinden[Bearbeiten]

Todo

Interessante Plugins[Bearbeiten]

  • vee-validate