From 67d6596d40b1807b9cd8eb0d9282932ea77be3c0 Mon Sep 17 00:00:00 2001 From: Konv Suu <2583695112@qq.com> Date: Tue, 10 Sep 2024 15:40:43 +0800 Subject: [PATCH] fix(reactivity): fix markRaw error on already marked object (#11864) close #11862 --- packages/reactivity/__tests__/reactive.spec.ts | 7 +++++++ packages/reactivity/src/reactive.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index a90ea27f138..3b3baa1906c 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -293,6 +293,13 @@ describe('reactivity/reactive', () => { expect(() => markRaw(obj)).not.toThrowError() }) + test('markRaw should not redefine on an marked object', () => { + const obj = markRaw({ foo: 1 }) + const raw = markRaw(obj) + expect(raw).toBe(obj) + expect(() => markRaw(obj)).not.toThrowError() + }) + test('should not observe non-extensible objects', () => { const obj = reactive({ foo: Object.preventExtensions({ a: 1 }), diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index cdcc7759b76..7d9c33aa4d0 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -1,4 +1,4 @@ -import { def, isObject, toRawType } from '@vue/shared' +import { def, hasOwn, isObject, toRawType } from '@vue/shared' import { mutableHandlers, readonlyHandlers, @@ -405,7 +405,7 @@ export type Raw = T & { [RawSymbol]?: true } * @see {@link https://vuejs.org/api/reactivity-advanced.html#markraw} */ export function markRaw(value: T): Raw { - if (Object.isExtensible(value)) { + if (!hasOwn(value, ReactiveFlags.SKIP) && Object.isExtensible(value)) { def(value, ReactiveFlags.SKIP, true) } return value