use JSON data in a script tag for initial state, rather than janky data attributes
This commit is contained in:
parent
c206314f1c
commit
001c31b80e
@ -58,10 +58,6 @@ module.exports = function(nunjucksEngine, settings) {
|
|||||||
}).code
|
}).code
|
||||||
).default;
|
).default;
|
||||||
|
|
||||||
const renderer = VueServerRenderer.createRenderer({
|
|
||||||
template: `<!--vue-ssr-outlet-->`
|
|
||||||
});
|
|
||||||
|
|
||||||
moduleScript.template = parsedComponent.template.content;
|
moduleScript.template = parsedComponent.template.content;
|
||||||
|
|
||||||
if ("vue" in manifest && manifest.vue[args.component]) {
|
if ("vue" in manifest && manifest.vue[args.component]) {
|
||||||
@ -83,18 +79,29 @@ module.exports = function(nunjucksEngine, settings) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
renderer.renderToString(
|
let vueInstance = new Vue({
|
||||||
new Vue({
|
props: keys,
|
||||||
props: keys,
|
template: `<${args.component}${props}></${args.component}>`
|
||||||
template: `<${args.component}${props}></${args.component}>`
|
});
|
||||||
}),
|
|
||||||
(err, result) => {
|
const renderer = VueServerRenderer.createRenderer({
|
||||||
if (!err) {
|
template: `<!--vue-ssr-outlet-->`
|
||||||
callback(null, new nunjucksEngine.runtime.SafeString(result));
|
});
|
||||||
} else {
|
|
||||||
callback(null, err);
|
renderer.renderToString(vueInstance, (err, result) => {
|
||||||
}
|
if (!err) {
|
||||||
|
const component = vueInstance.$children[0],
|
||||||
|
props = component.$vnode.componentOptions.propsData;
|
||||||
|
let componentState = `<script type="application/json">${JSON.stringify(
|
||||||
|
props
|
||||||
|
)}</script>`;
|
||||||
|
callback(
|
||||||
|
null,
|
||||||
|
new nunjucksEngine.runtime.SafeString(result + componentState)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
callback(null, err);
|
||||||
}
|
}
|
||||||
);
|
});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template lang="html">
|
<template lang="html">
|
||||||
<p class="HelloWorld" v-bind:data-message="message">
|
<p class="HelloWorld">
|
||||||
{{ message }}
|
{{ message }}
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template lang="html">
|
<template lang="html">
|
||||||
<div class="ListComp" v-bind:data-startlist="startlist">
|
<div class="ListComp">
|
||||||
<ol>
|
<ol>
|
||||||
<li v-for="(item, index) in list">
|
<li v-for="(item, index) in list">
|
||||||
<div class="itemtext">
|
<div class="itemtext">
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template lang="html">
|
<template lang="html">
|
||||||
<div class="RecordPlayer" v-bind:data-record="recordUrl">
|
<div class="RecordPlayer">
|
||||||
<button class="toggle" v-on:click="togglePlay">
|
<button class="toggle" v-on:click="togglePlay">
|
||||||
<svg v-if="playing === false">
|
<svg v-if="playing === false">
|
||||||
<use :xlink:href="playIcon" />
|
<use :xlink:href="playIcon" />
|
||||||
|
@ -7,7 +7,8 @@ Array.prototype.forEach.call(document.querySelectorAll(".HelloWorld"), function(
|
|||||||
elem
|
elem
|
||||||
) {
|
) {
|
||||||
new Vue({
|
new Vue({
|
||||||
render: h => h(HelloWorld, { props: { message: elem.dataset.message } })
|
render: h =>
|
||||||
|
h(HelloWorld, { props: JSON.parse(elem.nextElementSibling.innerHTML) })
|
||||||
}).$mount(elem);
|
}).$mount(elem);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -15,7 +16,8 @@ Array.prototype.forEach.call(document.querySelectorAll(".ListComp"), function(
|
|||||||
elem
|
elem
|
||||||
) {
|
) {
|
||||||
new Vue({
|
new Vue({
|
||||||
render: h => h(ListComp, { props: { startlist: elem.dataset.startlist } })
|
render: h =>
|
||||||
|
h(ListComp, { props: JSON.parse(elem.nextElementSibling.innerHTML) })
|
||||||
}).$mount(elem);
|
}).$mount(elem);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -23,7 +25,10 @@ Array.prototype.forEach.call(
|
|||||||
document.querySelectorAll(".RecordPlayer"),
|
document.querySelectorAll(".RecordPlayer"),
|
||||||
function(elem) {
|
function(elem) {
|
||||||
new Vue({
|
new Vue({
|
||||||
render: h => h(RecordPlayer, { props: { record: elem.dataset.record } })
|
render: h =>
|
||||||
|
h(RecordPlayer, {
|
||||||
|
props: JSON.parse(elem.nextElementSibling.innerHTML)
|
||||||
|
})
|
||||||
}).$mount(elem);
|
}).$mount(elem);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user