Vue.js kann einfach in den bestehenden Workflow integriert werden.
Lorem ipsum dolor sit amet, Vue Router consectetur adipisicing elit. Ad adipisci animi at cupiditate dicta eaque enim incidunt ipsa libero minima numquam, praesentium. Inventore nemo Vuex numquam officia possimus quos ratione repellat.
Eine Vue-Datei besteht aus drei Komponenten.
<template>
<div class="mod-sample-vue">
{{ text }}
</div>
</template>
<script>
new Vue({
data: {
text: 'Lorem ipsum dolor sit amet.',
},
});
</script>
<style type="scss">
.mod-sample-vue {
@include font(text);
}
</style>
Die Einbindung erfolgt über den Vue-Helper data-js-vue und das data-app Attribut.
<div class="mod-sample-vue"
data-app="AppSample"
data-js-vue="text: Hier kann man Daten überschreiben">
<!--
Das steht hier nur, solange die App geladen wird!
Das komplette DIV wird ersetzt!
-->
<div class="mod-loader"></div>
<noscript>
Vue ist ganz traurig ohne JavaScript ðŸ˜
</noscript>
</div>
In diesem Beispiel wird die AppSample.vue Datei geladen, definiert durch das
data-app="AppSample" Attribut.
Über das data-js-vue="…" Attribut können wie gewohnt eine oder mehrere Variablen an die
jeweilige Vue Instanz übergeben werden.
Die Vue-Dateien müssen in der Gulp-Konfiguration sowohl im JavaScript- als auch im SASS-Abschnitt eingebunden werden.
Das Vue-Template wird in diesem Prozess vorkompiliert.
Vue kann auch als Inline-Template eingebunden werden, allerdings mit einigen Nachteilen.
Dazu lässt man das data-app Attribut weg und schreibt das Vue-Template direkt in den HTML-Code.
<div class="mod-dummy-vue"
data-js-vue="text: Das ist ein Inline-Beispiel!, count: 10">
<noscript>
Vue ist ganz traurig ohne JavaScript ðŸ˜
</noscript>
<p>
{{ text }}
</p>
<p>
<button class="warning lg" @click="count++">
<?= EwSVG::get('icon-person', [], [
'color' => 'currentColor',
]) ?>
You clicked me {{ count }}
{{ count === 1 ? 'time' : 'times' }}
</button>
</p>
<p class="m-buttons">
<template v-for="i in 7">
<button-counter/>
</template>
</p>
</div>
{{ text }}
Statt des Vue-Templates kann auch JSX verwendet werden.
Man lässt hierfür den <template>…</template> Block weg
und benutzt JSX in der render() Methode.
new Vue({
data:
{
count: 10,
text: 'Lorem ipsum dolor sit amet.',
},
// JSX-Version des obigen Templates
render()
{
return <div class="mod-dummy-vue">
<p>
{this.text}
</p>
<p>
<button class="primary md" v-on:click={() => { this.count++; }}>
<embed file="/assets/svg/icon-person.svg" variables="{color: 'currentColor'}"/>
{/* JSX entfernt die meisten Leerzeichen */}
{' '}
You clicked me {this.count} {this.count === 1 ? 'time' : 'times'}
</button>
</p>
<p class="m-buttons">
{[...Array(6).keys()].map(() =>
{
return <button-counter/>;
})}
</p>
</div>;
},
});
In den meisten Fällen dürfte jedoch das Vue-Template kürzer ausfallen und leichter zu verstehen sein.
<div class="mod-dummy-vue">
<p>
{{ text }}
</p>
<p>
<button class="primary md" @click="count++">
<embed file="/assets/svg/icon-person.svg" variables="{color: 'currentColor'}"/>
You clicked me {{ count }} {{ count === 1 ? 'time' : 'times' }}
</button>
</p>
<p class="m-buttons">
<template v-for="i in 6">
<button-counter/>
</template>
</p>
</div>