Vue.js

Lukas Gamper

Vue.js

  • Nur im View Layer
  • Template basiert mit Virtual DOM
  • Einfach in bestehende Projekte integrierbar
  • Auch für anspruchvolle SPA's geeignet

Wieso Vue.js bei Webling

(noch 1x)

  • In bestehende Projekte integrierbar
  • Sehr schlank
    • runtime nur 20k Bytes
    • dev Version 10k Zeilen (mit Kommentaren)

Hello World

<html>
<head>
<script src="https://unpkg.com/vue">
</script>
</head
<body>
<div id="app">{{message}}</div>
<script>new Vue({
  el: '#app',
  data: {
    message: 'Hello World!'
  }
})
</script>
</body>
</html>

HTML

 

CodePen

Declarative Rendering

<div id="app">
  <p>{{ message }}</p>
  <p>
    <a @click="message='Hello World'">
      Change
    </a>
  </p>
  <p><input v-model="message"></p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

HTML

 

Javascript

CodePen

Directives

 

<div id="app">
  <p>
    <input type="checkbox" v-model="show">
    <span v-if="show">Show is True</span>
    <span v-else>Show is False</span> 
  </p>
  <ul>
    <li v-for="item in list">{{item}}</li>
  </ul>
</div>
var app = new Vue({
  el: '#app',
  data: {
    show: true,
    list:  [
      'item 1',
      'item 2',
      'item 3'
    ]
  }
})

HTML

 

Javascript

 

CodePen

Methods

 

<div id="app">
  <p>{{ message }}</p>
  <p>
    <a @click="message='Hello'">
      Change
    </a>
  </p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

HTML

 

Javascript

 

CodePen

<div id="app">
  <p>{{ message }}</p>
  <p>
    <a @click="setMessage('Hello')">
      Change
    </a>
  </p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  methods: {
    setMessage(msg) {
      this.message = msg
    }
  }
})

Computed Properties

 

<div id="app">
  <p><input v-model="message"></p>
  <p>
    {{ message
         .split('')
         .reverse()
         .join('') 
    }}
  </p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

HTML

 

Javascript

 

CodePen

<div id="app">
  <p><input v-model="message"></p>
  <p>{{ reverseMessage }}</p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  },
  computed: {
    reverseMessage: function() {
      return this.message
        .split('')
        .reverse()
        .join('')
    }
  }
})

Watcher

<div id="app">
  <p><input v-model="message"></p>
  <p>{{ lastChange }}</p>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!',
    lastChange: ''
  },
  watch: {
    message: function(newVal, oldVal) {
      this.lastChange 
        = String(new Date())
    }
  }
})

HTML

 

Javascript

 

CodePen

Components

<div id="app">
  <ul>
    <list-item
      v-for="item in list"
      :item="item"
      :key="item.id">
    </list-item>
  </ul>
</div>
Vue.component('list-item', {
  props: ['item'],
  template: '<li>{{ item.text }}</li>'
})
var app = new Vue({
  el: '#app',
  data: {
    list: [
      { id: 0, text: 'item 1' },
      { id: 1, text: 'item 2' },
      { id: 2, text: 'item 3' }
    ]
  }
})

HTML

 

Javascript

 

CodePen

Single File Component

  • Ein File pro Component
  • Component Scoped CSS
  • Compiled Render Functions
  • Plugins für VS Code und WebStorm
<template>
  <p>{{ greeting }} World!</p>
</template>

<style scoped>
  p {
    font-size: 2em;
  }
</style>

<script>
  module.exports = {
    data: function() {
      return {
        greeting: 'Hello World'
      }
    }
  }
</script>

Single File Component

  • Webpack loader für einzelne Abschnitte
<template>
  <p>{{greeting}} World!</p>
</template>

<style lang="scss">
  @import "css/global-styles.scss";
</style>

<script lang="ts">
  import Vue from 'vue'
  import { Component } 
    from 'vue-property-decorator'

  @Component
  export default class App 
    extends Vue 
  {
    public greeting: string = 'Hello';
  }
</script>

Render Functions

<div id="app">
  <ul>
    <list-item
      v-for="item in list"
      :item="item"
      :key="item.id">
    </list-item>
  </ul>
</div>
Vue.component('list-item', {
  render: function (createElement) {
    return createElement(
      'li',
      [this.item.text]
    )
  },
  props: {
    item: {
      type: Object,
      required: true
    }
  }  
})
var app = new Vue({
  el: '#app',
  data: {
    list: [
      { id: 0, text: 'item 1' },
      { id: 1, text: 'item 2' },
      { id: 2, text: 'item 3' }
    ]
  }
})

HTML

 

Javascript

 

CodePen

Reactivity / Watcher

  • Plain JS Objects
  • Benutzt ES5 getter / setter
  • Transparent für den User

Reactivity / Watcher

Dokumentation

Weiteres

  • Transistions & Animations
  • Filters, Mixins, Plugins
  • Server Side Rendering
  • Routing
  • State Management (Vuex)
  • Testing
  • Vue CLI

Pro

  • Nur View Layer
  • Einfach zu lernen
  • Gute Dokumentation
  • In bestehende Projekte integrierbar
  • Gute Mischung zwischen Angular und React

Con

  • Nur View Layer
  • Nicht so viele Plugins
  • Keine Grosse Firma im Background
  • Noch nicht so gross wie Angular und React

Fragen?

Reactivity / Watcher

  • Watcher for updates
  • Async Watcher
var app = new Vue({
  data: {
    val1: 1,
    val2: 1
  },
  watch: {
    val1: function(newVal) {
      this.val2 = newVal
    }
  }
})
app.val1 = 2
document.writeln(app.val2)
Vue.nextTick(function() {
  document.writeln(app.val2)
})

Templates

<script 
  type="x-template" 
  id="list-item"
>
  <li>{{ item.text }}</li>
</script>
<div id="app">
  <ul>
    <list-item
      v-for="item in list"
      :item="item"
      :key="item.id">
    </list-item>
  </ul>
</div>
Vue.component('list-item', {
  props: ['item'],
  template: '#list-item'
})
var app = new Vue({
  el: '#app',
  data: {
    list: [
      { id: 0, text: 'item 1' },
      { id: 1, text: 'item 2' },
      { id: 2, text: 'item 3' }
    ]
  }
})

HTML

 

Javascript

 

CodePen

vuejs

By gamperl

vuejs

  • 198