Skip to content

Commit 3a1837f

Browse files
authored
fix(set): reactive in SSR w/ set (#796)
Co-authored-by: webfansplz <>
1 parent 23de15c commit 3a1837f

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

src/reactivity/reactive.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export function observe<T>(obj: T): T {
135135
/**
136136
* Mock __ob__ for object recursively
137137
*/
138-
function mockReactivityDeep(obj: any, seen = new Set()) {
138+
export function mockReactivityDeep(obj: any, seen = new Set()) {
139139
if (seen.has(obj)) return
140140

141141
def(obj, '__ob__', mockObserver(obj))

src/reactivity/set.ts

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import { AnyObject } from '../types/basic'
22
import { getVueConstructor } from '../runtimeContext'
3-
import { isArray, isPrimitive, isUndef, isValidArrayIndex } from '../utils'
4-
import { defineAccessControl } from './reactive'
3+
import {
4+
isArray,
5+
isPrimitive,
6+
isUndef,
7+
isValidArrayIndex,
8+
isObject,
9+
hasOwn,
10+
} from '../utils'
11+
import { defineAccessControl, mockReactivityDeep } from './reactive'
512

613
/**
714
* Set a property on an object. Adds the new property, triggers change
@@ -49,6 +56,11 @@ export function set<T>(target: AnyObject, key: any, val: T): T {
4956
// IMPORTANT: define access control before trigger watcher
5057
defineAccessControl(target, key, val)
5158

59+
// in SSR, there is no __ob__. Mock for reactivity check
60+
if (isObject(target[key]) && !hasOwn(target[key], '__ob__')) {
61+
mockReactivityDeep(target[key])
62+
}
63+
5264
ob.dep.notify()
5365
return val
5466
}

test/ssr/ssrReactive.spec.ts

+7
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,11 @@ describe('SSR Reactive', () => {
145145
`"RangeError: Maximum call stack size exceeded"`
146146
).not.toHaveBeenWarned()
147147
})
148+
149+
it('should work on objects sets with set()', () => {
150+
const state = ref<any>({})
151+
set(state.value, 'a', {})
152+
153+
expect(isReactive(state.value.a)).toBe(true)
154+
})
148155
})

0 commit comments

Comments
 (0)