From f712afcffd5b750d433535ee49112a0bd07e7527 Mon Sep 17 00:00:00 2001 From: daiwei Date: Mon, 21 Jul 2025 15:19:03 +0800 Subject: [PATCH] chore: update tests --- packages/runtime-core/src/index.ts | 2 +- .../runtime-core/src/rendererTemplateRef.ts | 4 +- .../__tests__/dom/templateRef.spec.ts | 45 ++++++++++++++++++- packages/runtime-vapor/src/apiTemplateRef.ts | 4 +- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 00fef2582f..9d97bb1859 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -565,4 +565,4 @@ export { createInternalObject } from './internalObject' /** * @internal */ -export { validateTemplateRef } from './rendererTemplateRef' +export { createCanSetSetupRefChecker } from './rendererTemplateRef' diff --git a/packages/runtime-core/src/rendererTemplateRef.ts b/packages/runtime-core/src/rendererTemplateRef.ts index eef60a6e4c..84f0bda1b9 100644 --- a/packages/runtime-core/src/rendererTemplateRef.ts +++ b/packages/runtime-core/src/rendererTemplateRef.ts @@ -77,7 +77,7 @@ export function setRef( const oldRef = oldRawRef && (oldRawRef as VNodeNormalizedRefAtom).r const refs = owner.refs === EMPTY_OBJ ? (owner.refs = {}) : owner.refs const setupState = owner.setupState - const canSetSetupRef = validateTemplateRef(setupState) + const canSetSetupRef = createCanSetSetupRefChecker(setupState) // dynamic ref changed. unset old ref if (oldRef != null && oldRef !== ref) { @@ -148,7 +148,7 @@ export function setRef( } } -export function validateTemplateRef( +export function createCanSetSetupRefChecker( setupState: Data, ): (key: string) => boolean { const rawSetupState = toRaw(setupState) diff --git a/packages/runtime-vapor/__tests__/dom/templateRef.spec.ts b/packages/runtime-vapor/__tests__/dom/templateRef.spec.ts index f1ce23ac15..4e8a1a9253 100644 --- a/packages/runtime-vapor/__tests__/dom/templateRef.spec.ts +++ b/packages/runtime-vapor/__tests__/dom/templateRef.spec.ts @@ -19,6 +19,7 @@ import { nextTick, reactive, ref, + shallowRef, useTemplateRef, watchEffect, } from '@vue/runtime-dom' @@ -208,8 +209,8 @@ describe('api: template ref', () => { const { render } = define({ setup() { return { - foo: fooEl, - bar: barEl, + foo: shallowRef(fooEl), + bar: shallowRef(barEl), } }, render() { @@ -251,6 +252,7 @@ describe('api: template ref', () => { }) const { host } = render() expect(state.refKey).toBe(host.children[0]) + expect('Template ref "refKey" used on a non-ref value').toHaveBeenWarned() }) test('multiple root refs', () => { @@ -713,6 +715,45 @@ describe('api: template ref', () => { expect(html()).toBe('
changed
') }) + test('should not attempt to set when variable name is same as key', () => { + let tRef: ShallowRef + const key = 'refKey' + define({ + setup() { + tRef = useTemplateRef('_') + return { + [key]: tRef, + } + }, + render() { + const n0 = template('
')() as Element + createTemplateRefSetter()(n0, key) + return n0 + }, + }).render() + expect('target is readonly').not.toHaveBeenWarned() + expect(tRef!.value).toBe(null) + }) + + test('should work when used as direct ref value (compiled in prod mode)', () => { + __DEV__ = false + try { + let foo: ShallowRef + const { host } = define({ + setup() { + foo = useTemplateRef('foo') + const n0 = template('
')() as Element + createTemplateRefSetter()(n0, foo) + return n0 + }, + }).render() + expect('target is readonly').not.toHaveBeenWarned() + expect(foo!.value).toBe(host.children[0]) + } finally { + __DEV__ = true + } + }) + // TODO: can not reproduce in Vapor // // #2078 // test('handling multiple merged refs', async () => { diff --git a/packages/runtime-vapor/src/apiTemplateRef.ts b/packages/runtime-vapor/src/apiTemplateRef.ts index 1b88d16c82..a14f373e7d 100644 --- a/packages/runtime-vapor/src/apiTemplateRef.ts +++ b/packages/runtime-vapor/src/apiTemplateRef.ts @@ -9,8 +9,8 @@ import { ErrorCodes, type SchedulerJob, callWithErrorHandling, + createCanSetSetupRefChecker, queuePostFlushCb, - validateTemplateRef, warn, } from '@vue/runtime-dom' import { @@ -56,7 +56,7 @@ export function setRef( const refs = instance.refs === EMPTY_OBJ ? (instance.refs = {}) : instance.refs - const canSetSetupRef = validateTemplateRef(setupState) + const canSetSetupRef = createCanSetSetupRefChecker(setupState) // dynamic ref changed. unset old ref if (oldRef != null && oldRef !== ref) { if (isString(oldRef)) { -- 2.47.2