wip: watch array compat
This commit is contained in:
		
							parent
							
								
									69fafb437a
								
							
						
					
					
						commit
						208bef5d97
					
				| @ -33,6 +33,8 @@ import { | ||||
| } from './errorHandling' | ||||
| import { queuePostRenderEffect } from './renderer' | ||||
| import { warn } from './warning' | ||||
| import { DeprecationTypes, warnDeprecation } from './compat/deprecations' | ||||
| import { isCompatEnabled } from './compat/compatConfig' | ||||
| 
 | ||||
| export type WatchEffect = (onInvalidate: InvalidateCbRegistrator) => void | ||||
| 
 | ||||
| @ -217,6 +219,21 @@ function doWatch( | ||||
|     __DEV__ && warnInvalidSource(source) | ||||
|   } | ||||
| 
 | ||||
|   // 2.x array mutation watch compat
 | ||||
|   if (__COMPAT__ && cb && !deep) { | ||||
|     const baseGetter = getter | ||||
|     getter = () => { | ||||
|       const val = baseGetter() | ||||
|       if (isArray(val)) { | ||||
|         __DEV__ && warnDeprecation(DeprecationTypes.WATCH_ARRAY) | ||||
|         if (isCompatEnabled(DeprecationTypes.WATCH_ARRAY)) { | ||||
|           traverse(val) | ||||
|         } | ||||
|       } | ||||
|       return val | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if (cb && deep) { | ||||
|     const baseGetter = getter | ||||
|     getter = () => traverse(baseGetter()) | ||||
| @ -254,7 +271,14 @@ function doWatch( | ||||
|     if (cb) { | ||||
|       // watch(source, cb)
 | ||||
|       const newValue = runner() | ||||
|       if (deep || forceTrigger || hasChanged(newValue, oldValue)) { | ||||
|       if ( | ||||
|         deep || | ||||
|         forceTrigger || | ||||
|         hasChanged(newValue, oldValue) || | ||||
|         (__COMPAT__ && | ||||
|           isArray(newValue) && | ||||
|           isCompatEnabled(DeprecationTypes.WATCH_ARRAY)) | ||||
|       ) { | ||||
|         // cleanup before running cb again
 | ||||
|         if (cleanup) { | ||||
|           cleanup() | ||||
|  | ||||
| @ -16,11 +16,16 @@ export function configureCompat(config: CompatConfig) { | ||||
|   extend(globalCompatConfig, config) | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @internal | ||||
|  */ | ||||
| export function getCompatConfig( | ||||
|   key: DeprecationTypes | ||||
| ): DeprecationConfigItem | undefined { | ||||
|   return globalCompatConfig[key] | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @internal | ||||
|  */ | ||||
| export function isCompatEnabled(key: DeprecationTypes): boolean { | ||||
|   const config = getCompatConfig(key) | ||||
|   return !config || config.mode !== 3 | ||||
| } | ||||
|  | ||||
| @ -28,11 +28,10 @@ export const enum DeprecationTypes { | ||||
|   OPTIONS_BEFORE_DESTROY = 'OPTIONS_BEFORE_DESTROY', | ||||
|   OPTIONS_DESTROYED = 'OPTIONS_DESTROYED', | ||||
| 
 | ||||
|   V_ON_KEYCODE_MODIFIER = 'V_ON_KEYCODE_MODIFIER', | ||||
|   PROPS_DEFAULT_THIS = 'PROPS_DEFAULT_THIS', | ||||
| 
 | ||||
|   CUSTOM_DIR = 'CUSTOM_DIR', | ||||
| 
 | ||||
|   V_ON_KEYCODE_MODIFIER = 'V_ON_KEYCODE_MODIFIER' | ||||
|   WATCH_ARRAY = 'WATCH_ARRAY' | ||||
| } | ||||
| 
 | ||||
| type DeprecationData = { | ||||
| @ -181,6 +180,13 @@ const deprecationMessages: Record<DeprecationTypes, DeprecationData> = { | ||||
|     message: `\`destroyed\` has been renamed to \`unmounted\`.` | ||||
|   }, | ||||
| 
 | ||||
|   [DeprecationTypes.V_ON_KEYCODE_MODIFIER]: { | ||||
|     message: | ||||
|       `Using keyCode as v-on modifier is no longer supported. ` + | ||||
|       `Use kebab-case key name modifiers instead.`, | ||||
|     link: `https://v3.vuejs.org/guide/migration/keycode-modifiers.html` | ||||
|   }, | ||||
| 
 | ||||
|   [DeprecationTypes.PROPS_DEFAULT_THIS]: { | ||||
|     message: (key: string) => | ||||
|       `props default value function no longer has access to "this". ` + | ||||
| @ -195,11 +201,15 @@ const deprecationMessages: Record<DeprecationTypes, DeprecationData> = { | ||||
|     link: `https://v3.vuejs.org/guide/migration/custom-directives.html` | ||||
|   }, | ||||
| 
 | ||||
|   [DeprecationTypes.V_ON_KEYCODE_MODIFIER]: { | ||||
|   [DeprecationTypes.WATCH_ARRAY]: { | ||||
|     message: | ||||
|       `Using keyCode as v-on modifier is no longer supported. ` + | ||||
|       `Use kebab-case key name modifiers instead.`, | ||||
|     link: `https://v3.vuejs.org/guide/migration/keycode-modifiers.html` | ||||
|       `"watch" option or vm.$watch on an array value will no longer ` + | ||||
|       `trigger on array mutation unless the "deep" option is specified. ` + | ||||
|       `If current usage is intended, you can suppress this warning with:` + | ||||
|       `\n\n  configureCompat({ ${ | ||||
|         DeprecationTypes.WATCH_ARRAY | ||||
|       }: { mode: 3 }})\n`,
 | ||||
|     link: `https://v3.vuejs.org/guide/migration/watch.html` | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @ -215,7 +225,10 @@ export function warnDeprecation(key: DeprecationTypes, ...args: any[]) { | ||||
| 
 | ||||
|   // check user config
 | ||||
|   const config = getCompatConfig(key) | ||||
|   if (config && config.warning === false) { | ||||
|   if ( | ||||
|     config && | ||||
|     (config.warning === false || (config.mode === 3 && config.warning !== true)) | ||||
|   ) { | ||||
|     return | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -288,12 +288,12 @@ export { LegacyConfig } from './compat/globalConfig' | ||||
| 
 | ||||
| import { warnDeprecation } from './compat/deprecations' | ||||
| import { createCompatVue } from './compat/global' | ||||
| import { getCompatConfig } from './compat/compatConfig' | ||||
| import { isCompatEnabled } from './compat/compatConfig' | ||||
| 
 | ||||
| const _compatUtils = { | ||||
|   warnDeprecation, | ||||
|   createCompatVue, | ||||
|   getCompatConfig | ||||
|   isCompatEnabled | ||||
| } | ||||
| 
 | ||||
| export const compatUtils = (__COMPAT__ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user