Skip to content

Commit 67d6596

Browse files
authored
fix(reactivity): fix markRaw error on already marked object (#11864)
close #11862
1 parent d13cd22 commit 67d6596

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

Diff for: packages/reactivity/__tests__/reactive.spec.ts

+7
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,13 @@ describe('reactivity/reactive', () => {
293293
expect(() => markRaw(obj)).not.toThrowError()
294294
})
295295

296+
test('markRaw should not redefine on an marked object', () => {
297+
const obj = markRaw({ foo: 1 })
298+
const raw = markRaw(obj)
299+
expect(raw).toBe(obj)
300+
expect(() => markRaw(obj)).not.toThrowError()
301+
})
302+
296303
test('should not observe non-extensible objects', () => {
297304
const obj = reactive({
298305
foo: Object.preventExtensions({ a: 1 }),

Diff for: packages/reactivity/src/reactive.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { def, isObject, toRawType } from '@vue/shared'
1+
import { def, hasOwn, isObject, toRawType } from '@vue/shared'
22
import {
33
mutableHandlers,
44
readonlyHandlers,
@@ -405,7 +405,7 @@ export type Raw<T> = T & { [RawSymbol]?: true }
405405
* @see {@link https://vuejs.org/api/reactivity-advanced.html#markraw}
406406
*/
407407
export function markRaw<T extends object>(value: T): Raw<T> {
408-
if (Object.isExtensible(value)) {
408+
if (!hasOwn(value, ReactiveFlags.SKIP) && Object.isExtensible(value)) {
409409
def(value, ReactiveFlags.SKIP, true)
410410
}
411411
return value

0 commit comments

Comments
 (0)