@@ -23,6 +23,7 @@ import {
2323import { ReactiveFlags } from '@vue/reactivity'
2424import { normalizeEmitsOptions } from './componentEmits'
2525import { renderEffect } from './renderEffect'
26+ import { pauseTracking , resetTracking } from '@vue/reactivity'
2627import type { interopKey } from './vdomInterop'
2728
2829export type RawProps = Record < string , ( ) => unknown > & {
@@ -43,6 +44,7 @@ export function resolveSource(
4344
4445export function getPropsProxyHandlers (
4546 comp : VaporComponent ,
47+ once ?: boolean ,
4648) : [
4749 ProxyHandler < VaporComponentInstance > | null ,
4850 ProxyHandler < VaporComponentInstance > ,
@@ -111,17 +113,26 @@ export function getPropsProxyHandlers(
111113 )
112114 }
113115
116+ const getPropValue = once
117+ ? ( ...args : Parameters < typeof getProp > ) => {
118+ pauseTracking ( )
119+ const value = getProp ( ...args )
120+ resetTracking ( )
121+ return value
122+ }
123+ : getProp
124+
114125 const propsHandlers = propsOptions
115126 ? ( {
116- get : ( target , key ) => getProp ( target , key ) ,
127+ get : ( target , key ) => getPropValue ( target , key ) ,
117128 has : ( _ , key ) => isProp ( key ) ,
118129 ownKeys : ( ) => Object . keys ( propsOptions ) ,
119130 getOwnPropertyDescriptor ( target , key ) {
120131 if ( isProp ( key ) ) {
121132 return {
122133 configurable : true ,
123134 enumerable : true ,
124- get : ( ) => getProp ( target , key ) ,
135+ get : ( ) => getPropValue ( target , key ) ,
125136 }
126137 }
127138 } ,
@@ -149,16 +160,25 @@ export function getPropsProxyHandlers(
149160 }
150161 }
151162
163+ const getAttrValue = once
164+ ? ( ...args : Parameters < typeof getAttr > ) => {
165+ pauseTracking ( )
166+ const value = getAttr ( ...args )
167+ resetTracking ( )
168+ return value
169+ }
170+ : getAttr
171+
152172 const attrsHandlers = {
153- get : ( target , key : string ) => getAttr ( target . rawProps , key ) ,
173+ get : ( target , key : string ) => getAttrValue ( target . rawProps , key ) ,
154174 has : ( target , key : string ) => hasAttr ( target . rawProps , key ) ,
155175 ownKeys : target => getKeysFromRawProps ( target . rawProps ) . filter ( isAttr ) ,
156176 getOwnPropertyDescriptor ( target , key : string ) {
157177 if ( hasAttr ( target . rawProps , key ) ) {
158178 return {
159179 configurable : true ,
160180 enumerable : true ,
161- get : ( ) => getAttr ( target . rawProps , key ) ,
181+ get : ( ) => getAttrValue ( target . rawProps , key ) ,
162182 }
163183 }
164184 } ,
0 commit comments