Skip to content

Commit

Permalink
fix(ssr): watchEffect onInvalidate runner initialization (#3323)
Browse files Browse the repository at this point in the history
close #3322
  • Loading branch information
tjk authored Mar 25, 2021
1 parent bf34e33 commit e4b5fcc
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
4 changes: 3 additions & 1 deletion packages/runtime-core/src/apiWatch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ function doWatch(
}

let cleanup: () => void
const onInvalidate: InvalidateCbRegistrator = (fn: () => void) => {
let onInvalidate: InvalidateCbRegistrator = (fn: () => void) => {
cleanup = runner.options.onStop = () => {
callWithErrorHandling(fn, instance, ErrorCodes.WATCH_CLEANUP)
}
Expand All @@ -232,6 +232,8 @@ function doWatch(
// in SSR there is no need to setup an actual effect, and it should be noop
// unless it's eager
if (__NODE_JS__ && isInSSRComponentSetup) {
// we will also not call the invalidate callback (+ runner is not set up)
onInvalidate = NOOP
if (!cb) {
getter()
} else if (immediate) {
Expand Down
15 changes: 13 additions & 2 deletions packages/server-renderer/__tests__/render.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import {
defineComponent,
createTextVNode,
createStaticVNode,
KeepAlive,
withCtx,
Transition
KeepAlive,
Transition,
watchEffect
} from 'vue'
import { escapeHtml } from '@vue/shared'
import { renderToString } from '../src/renderToString'
Expand Down Expand Up @@ -775,5 +776,15 @@ function testRender(type: string, render: typeof renderToString) {
const html = await render(app)
expect(html).toBe(`<div>hello</div>`)
})

// https://github.com/vuejs/vue-next/issues/3322
test('effect onInvalidate does not error', async () => {
const noop = () => {}
const app = createApp({
setup: () => watchEffect(onInvalidate => onInvalidate(noop)),
render: noop,
})
expect(await render(app)).toBe('<!---->')
})
})
}

0 comments on commit e4b5fcc

Please sign in to comment.