Vue ist eine Javascript Framework für das Erstellen und Instantiieren von Oberflächen-Komponenten.
new Vue({ el: "#vue-root" });
define(["vue"], function(Vue) { return new Vue({ el: "#vue-root" }); });
define(function() { return { props: { value: String }, template: '<div>{{value}}</div>' }; });
Übergeordnete Komponente:
{ provide: { someProp: "someValue" } }
Untergeordnete Komponente:
{ inject: ["someProp"] }
Child:
methods: { _visible: function(visible) { this.$emit("update:visible", visible); } }
Parent:
<dialog-panel :visible.sync="visible">[...]</dialog-panel>
index.html:
<html> <head> <script type="text/javascript" src="jquery-1.12.4.min.js"></script> <script type="text/javascript" src="jquery-ui.min.js"></script> <script type="text/javascript" src="require.js" data-main="main"></script> </head> <body> <div id="vue-root><template> [...] </template></div> </body< </html>
main.js:
window.$.holdReady(true); requirejs.undef("jquery"); requirejs.undef("jquery-ui"); define(["vue", "jquery", "jquery-ui"], function(Vue, $) { return new Vue({ el: "#vue-root", created: function() { this.scripts = $("template", this.$options.el).contents().find("script"); }, mounted: function() { window.eval(this.scripts.text()); window.$.holdReady(false); } }); });
Erklärung: Zunächst wird das bestehende JQuery auf Hold gesetzt, so dass dessen Ready-Function erst nach der Initialisierung ausgeführt werden. Dies ist wichtig, da während der Intitialisierung vom neuen JQuery die globalen Variablen überschrieben werden, bis diese schließlich mit $.noConflict() wieder hergestellt werden. Des Weiteren wird ein <template>-Tag eingefügt, sodass keine <script>-Tags ausgeführt werden, bevor Vue vollständig initialisiert ist. Vue manipuliert den DOM-Tree im Browser, das zur Störung von Inline-Scripten und Tag-Referenzen führen kann. Inline-Skript-Tags werden in der Vue-Phase "created" zunächst eingesammelt und in der Phase "mounted" schließlich ausgeführt. Dann wird das JQuery wieder freigegeben zum Ausführen ($.holdReady).
define(["vue", "vue-router"], function(Vue, VueRouter) { Vue.use(VueRouter); return new Vue({ router: new VueRouter({ mode: "history" }) }); })
Hinweis: Ohne mode: history wird mit der hässlichen URL-Endung "!#" gearbeitet, weil alte Browser das programmatische Ändern der URL-Zeile nicht unterstützen.
require(["vue", "jquery"], function(Vue, $) { Vue.util.defineReactive(Vue.prototype, "$query", {}); Vue.mixin({ mounted: function() { if (!this.$parent && this.$router) { this.$query = $.extend(true, {}, this.$route.query); this.$watch("$query", { handler: function(value) { this.$router.push({ query: value }); }, deep: true }); } } }); });