diff --git a/src/server/render.js b/src/server/render.js index 05ba588006d..e5ef04da672 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -50,14 +50,14 @@ const normalizeRender = vm => { } } -function waitForServerPrefetch (vm, resolve, reject) { +function waitForServerPrefetch (vm, resolve, reject, ssrContext) { let handlers = vm.$options.serverPrefetch if (isDef(handlers)) { if (!Array.isArray(handlers)) handlers = [handlers] try { const promises = [] for (let i = 0, j = handlers.length; i < j; i++) { - const result = handlers[i].call(vm, vm) + const result = handlers[i].call(vm, ssrContext) if (result && typeof result.then === 'function') { promises.push(result) } @@ -206,7 +206,7 @@ function renderComponentInner (node, isRoot, context) { const reject = context.done - waitForServerPrefetch(child, resolve, reject) + waitForServerPrefetch(child, resolve, reject, context) } function renderAsyncComponent (node, isRoot, context) { @@ -432,6 +432,6 @@ export function createRenderFunction ( const resolve = () => { renderNode(component._render(), true, context) } - waitForServerPrefetch(component, resolve, done) + waitForServerPrefetch(component, resolve, done, context) } } diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index 66acf008a00..8b7dc51374c 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -1334,6 +1334,28 @@ describe('SSR: renderToString', () => { }) }) + it('should pass $ssrContext to serverPrefetch option', done => { + renderVmWithOptions({ + template: ` +
{{ ctx }}
+ `, + data: { + count: 0 + }, + serverPrefetch (ctx) { + return new Promise((resolve) => { + setTimeout(() => { + this.ctx = ctx.userContext.foo + resolve() + }, 1) + }) + } + }, result => { + expect(result).toContain('
bar
') + done() + }, { foo: 'bar' }) + }) + it('should support serverPrefetch option (nested)', done => { renderVmWithOptions({ template: ` @@ -1543,8 +1565,8 @@ describe('SSR: renderToString', () => { }) }) -function renderVmWithOptions (options, cb) { - renderToString(new Vue(options), (err, res) => { +function renderVmWithOptions (options, cb, ctx = {}) { + renderToString(new Vue(options), ctx, (err, res) => { expect(err).toBeNull() cb(res) })