Browse Source

fix(ssr): computed properties should pass vm as first argument in ssr (#9090)

fix #8977
dev
sqal 6 years ago
committed by Evan You
parent
commit
33e669b22f
  1. 10
      src/core/instance/state.js
  2. 18
      test/ssr/ssr-string.spec.js

10
src/core/instance/state.js

@ -216,13 +216,13 @@ export function defineComputed (
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = shouldCache
? createComputedGetter(key)
: userDef
: createGetterInvoker(userDef)
sharedPropertyDefinition.set = noop
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: userDef.get
: createGetterInvoker(userDef.get)
: noop
sharedPropertyDefinition.set = userDef.set || noop
}
@ -253,6 +253,12 @@ function createComputedGetter (key) {
}
}
function createGetterInvoker(fn) {
return function computedGetter () {
return fn.call(this, this)
}
}
function initMethods (vm: Component, methods: Object) {
const props = vm.$options.props
for (const key in methods) {

18
test/ssr/ssr-string.spec.js

@ -1076,6 +1076,24 @@ describe('SSR: renderToString', () => {
})
})
// #8977
it('should call computed properties with vm as first argument', done => {
renderToString(new Vue({
data: {
firstName: 'Evan',
lastName: 'You'
},
computed: {
fullName: ({ firstName, lastName }) => `${firstName} ${lastName}`,
},
template: '<div>{{ fullName }}</div>',
}), (err, result) => {
expect(err).toBeNull()
expect(result).toContain('<div data-server-rendered="true">Evan You</div>')
done()
})
})
it('return Promise', done => {
renderToString(new Vue({
template: `<div>{{ foo }}</div>`,

Loading…
Cancel
Save