From 4baaa7bca3d5486bbe801d1012133d8c4ac1ec46 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 5 Dec 2024 17:50:09 +0800 Subject: [PATCH] wip: optimize props validation --- packages/runtime-core/src/componentProps.ts | 24 ++++++++++++-------- packages/runtime-vapor/src/componentProps.ts | 17 ++++++-------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index 5a5808713..fbc4ca5bf 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -701,15 +701,16 @@ export function validateProps( resolvedProps = toRaw(resolvedProps) const camelizePropsKey = Object.keys(rawProps).map(key => camelize(key)) for (const key in options) { - let opt = options[key] - if (opt == null) continue - validateProp( - key, - resolvedProps[key], - opt, - __DEV__ ? shallowReadonly(resolvedProps) : resolvedProps, - !camelizePropsKey.includes(key), - ) + const opt = options[key] + if (opt != null) { + validateProp( + key, + resolvedProps[key], + opt, + resolvedProps, + !camelizePropsKey.includes(key), + ) + } } } @@ -750,7 +751,10 @@ function validateProp( } } // custom validator - if (validator && !validator(value, resolvedProps)) { + if ( + validator && + !validator(value, __DEV__ ? shallowReadonly(resolvedProps) : resolvedProps) + ) { warn('Invalid prop: custom validator check failed for prop "' + key + '".') } } diff --git a/packages/runtime-vapor/src/componentProps.ts b/packages/runtime-vapor/src/componentProps.ts index 41101a079..1fca42bfd 100644 --- a/packages/runtime-vapor/src/componentProps.ts +++ b/packages/runtime-vapor/src/componentProps.ts @@ -1,12 +1,4 @@ -import { - EMPTY_ARR, - NO, - YES, - camelize, - extend, - hasOwn, - isFunction, -} from '@vue/shared' +import { EMPTY_ARR, NO, YES, camelize, hasOwn, isFunction } from '@vue/shared' import type { VaporComponent, VaporComponentInstance } from './component' import { type NormalizedPropsOptions, @@ -239,7 +231,12 @@ export function setupPropsValidation(instance: VaporComponentInstance): void { const rawProps = instance.rawProps if (!rawProps) return renderEffect(() => { - const mergedRawProps = extend({}, rawProps) + const mergedRawProps: Record = {} + for (const key in rawProps) { + if (key !== '$') { + mergedRawProps[key] = rawProps[key]() + } + } if (rawProps.$) { for (const source of rawProps.$) { const isDynamic = isFunction(source)