Browse Source

feat: oldValue for directives

Evan You 7 years ago
parent
commit
1def00e96e
1 changed files with 15 additions and 0 deletions
  1. 15 0
      packages/core/src/optional/directive.ts

+ 15 - 0
packages/core/src/optional/directive.ts

@@ -4,6 +4,7 @@ import { MountedComponent } from '../component'
 export interface DirectiveBinding {
   instance: MountedComponent
   value?: any
+  oldValue?: any
   arg?: string
   modifiers?: DirectiveModifiers
 }
@@ -26,6 +27,8 @@ export interface Directive {
 
 export type DirectiveModifiers = Record<string, boolean>
 
+const valueCache = new WeakMap<Directive, WeakMap<any, any>>()
+
 export function applyDirective(
   vnode: VNode,
   directive: Directive,
@@ -35,15 +38,27 @@ export function applyDirective(
   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
         },