export interface DirectiveBinding {
instance: MountedComponent
value?: any
+ oldValue?: any
arg?: string
modifiers?: DirectiveModifiers
}
export type DirectiveModifiers = Record<string, boolean>
+const valueCache = new WeakMap<Directive, WeakMap<any, any>>()
+
export function applyDirective(
vnode: VNode,
directive: Directive,
modifiers?: DirectiveModifiers
): VNode {
const data = vnode.data || (vnode.data = {})
+ let valueCacheForDir = valueCache.get(directive) as WeakMap<VNode, any>
+ if (!valueCacheForDir) {
+ valueCacheForDir = new WeakMap<VNode, any>()
+ valueCache.set(directive, valueCacheForDir)
+ }
for (const key in directive) {
const hook = directive[key as keyof Directive]
const hookKey = `vnode` + key[0].toUpperCase() + key.slice(1)
const vnodeHook = (vnode: VNode, prevVNode?: VNode) => {
+ let oldValue
+ if (prevVNode !== void 0) {
+ oldValue = valueCacheForDir.get(prevVNode)
+ valueCacheForDir.delete(prevVNode)
+ }
+ valueCacheForDir.set(vnode, value)
hook(
vnode.el,
{
instance,
value,
+ oldValue,
arg,
modifiers
},