From 8271ec22a42c98ad9685ca6db4bf0ac2c8351d78 Mon Sep 17 00:00:00 2001 From: Blackie Wu Date: Thu, 7 Jul 2022 17:20:49 +0800 Subject: [PATCH 1/2] fix(ssr): fix array setting error at created in ssr --- .../server-renderer/test/ssr-template.spec.ts | 34 +++++++++++++++++++ src/core/observer/index.ts | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/server-renderer/test/ssr-template.spec.ts b/packages/server-renderer/test/ssr-template.spec.ts index b173c439e99..68ab324ecd9 100644 --- a/packages/server-renderer/test/ssr-template.spec.ts +++ b/packages/server-renderer/test/ssr-template.spec.ts @@ -74,6 +74,40 @@ describe('SSR: template option', () => { ) }) + it('renderToString with array setting at created', async () => { + const renderer = createRenderer({ + template: defaultTemplate + }) + + const context = { + head: '', + styles: '', + state: { a: 1 } + } + + const res = await renderer.renderToString( + new Vue({ + template: '
{{ arr[0] }}
', + data() { + return { + arr: ['hi'] + } + }, + created() { + this.$set(this.arr, 0, 'hi') + } + }), + context + ) + + expect(res).toContain( + `${context.head}${context.styles}` + + `
hi
` + + `` + + `` + ) + }) + it('renderToString with interpolation', async () => { const renderer = createRenderer({ template: interpolateTemplate diff --git a/src/core/observer/index.ts b/src/core/observer/index.ts index 004a65fe6b5..84744dd85f9 100644 --- a/src/core/observer/index.ts +++ b/src/core/observer/index.ts @@ -241,7 +241,7 @@ export function set( target.length = Math.max(target.length, key) target.splice(key, 1, val) // when mocking for SSR, array methods are not hijacked - if (!ob.shallow && ob.mock) { + if (ob && !ob.shallow && ob.mock) { observe(val, false, true) } return val From 0538b4d0ecb53d00886db23a3ebda7993aa05b07 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 8 Jul 2022 09:34:18 +0800 Subject: [PATCH 2/2] test: update test case --- .../test/ssr-reactivity.spec.ts | 4 +++ .../server-renderer/test/ssr-template.spec.ts | 34 ------------------- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/packages/server-renderer/test/ssr-reactivity.spec.ts b/packages/server-renderer/test/ssr-reactivity.spec.ts index f9b145c7740..773fa9dd650 100644 --- a/packages/server-renderer/test/ssr-reactivity.spec.ts +++ b/packages/server-renderer/test/ssr-reactivity.spec.ts @@ -93,6 +93,10 @@ describe('SSR Reactive', () => { set(state.value, 1, {}) expect(isReactive(state.value[1])).toBe(true) + + const rawArr = [] + set(rawArr, 1, {}) + expect(isReactive(rawArr[1])).toBe(false) }) // #550 diff --git a/packages/server-renderer/test/ssr-template.spec.ts b/packages/server-renderer/test/ssr-template.spec.ts index 68ab324ecd9..b173c439e99 100644 --- a/packages/server-renderer/test/ssr-template.spec.ts +++ b/packages/server-renderer/test/ssr-template.spec.ts @@ -74,40 +74,6 @@ describe('SSR: template option', () => { ) }) - it('renderToString with array setting at created', async () => { - const renderer = createRenderer({ - template: defaultTemplate - }) - - const context = { - head: '', - styles: '', - state: { a: 1 } - } - - const res = await renderer.renderToString( - new Vue({ - template: '
{{ arr[0] }}
', - data() { - return { - arr: ['hi'] - } - }, - created() { - this.$set(this.arr, 0, 'hi') - } - }), - context - ) - - expect(res).toContain( - `${context.head}${context.styles}` + - `
hi
` + - `` + - `` - ) - }) - it('renderToString with interpolation', async () => { const renderer = createRenderer({ template: interpolateTemplate